Poslao: 30 Jul 2016 15:45
|
offline
- return void
- Anti Malware Fighter
Rank 1
- Pridružio: 02 Jan 2008
- Poruke: 2167
|
Imam tabelu koja izgleda ovako:
Svi podaci koji se u tabeli nalaze se iscitavaju iz mysql baze i to funkcionise kako treba.
E sad, ja zelim da kad kliknem na ovo crveno dugme da se ceo red u tabeli izbrise, ali i da se isti taj predmet koji sam iz tabele obrisao, obrise i iz same baze.
Trenutno, meni funkcionise brisanje reda iz tabele pomocu ovog koda dole, medjutim cim osvezim stranicu posalje se novi upit bazi i obrisani red se opet vraca (sto je u redu, jer se taj red trenutno iz baze ne brise):
<script type='text/javascript'>
$(window).load(function(){
$(function () {
$("table#tabela_predmeta").on("click", ".remove", function () {
if(confirm('Da li ste sigurni da želite da obrišete ovaj predmet?'))
{
$(this).closest('tr').remove();
}
});
});
$(document).click(function () {
$('.tooltip').remove();
$('[title]').tooltip();
});
});
</script>
Tabela se kreira na ovaj nacin:
...
echo "<tr>";
echo "<td>" . $row['Naziv'] . "</td>";
echo "<td>" . $row['Semestar'] . "</td>";
echo "<td>" . $row['SifraPredmeta'] . "</td>";
echo "<td><button type='button' class='btn btn-danger remove'><i class='fa fa-trash-o'></i>";
echo "</tr>";
...
Moja zamisao je da nekako prosledim podatke za obrisani red drugom .php fajlu koji mi sluzi za brisanje zeljenog predmeta iz baze, i evo ga kod tog fajla:
<?php
// define variables and set to empty values
$naziv_predmeta = $semestar = $sifra_predmeta = "";
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$naziv_predmeta = test_input($_POST["naziv"]);
$semestar = test_input($_POST["semestar"]);
$sifra_predmeta = test_input($_POST["sifra"]);
}
function test_input($data) {
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data);
return $data;
}
$servername = "localhost";
$username = "...";
$password = "...";
$dbname = "...";
// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
$sql = "DELETE FROM projekat.Predmeti WHERE SifraPredmeta='$sifra_predmeta'";
if ($conn->query($sql) === TRUE) {
echo '<script type="text/javascript">
alert("Predmet uspesno obrisan!");
window.location = ".../predmeti.php"
</script>';
} else {
echo "Error: " . $sql . "<br>" . $conn->error;
}
$conn->close();
?>
Gledao sam i pokusavao stvari sa ovih linkova, ali mi ne uspeva:
http://stackoverflow.com/questions/14106568/how-to.....ith-jquery
http://stackoverflow.com/questions/7165395/call-php-function-from-javascript
http://www.codingcage.com/2014/12/delete-data-from-mysql-with-confirmation.html
Unapred se zahvaljujem
|
|
|
Registruj se da bi učestvovao u diskusiji. Registrovanim korisnicima se NE prikazuju reklame unutar poruka.
|
|
Poslao: 30 Jul 2016 17:34
|
offline
- E.L.I.T.E.
- Legendarni građanin
- Pridružio: 23 Maj 2012
- Poruke: 4575
|
Poslednji link koristi zastarelu MySQL ekstenziju. Koristi MySQLi ili PDO (doduše vidim da već koristiš MySQLi u kodu tako da je u redu).
Taj poslednji link upravo i sadrži objašnjenje kako to da odradiš: samo proslediš parametar za brisanje sa ID-em predmeta (naravno, ne onako mutavo kao što je on odradio već pomoću ovih ekstenzija koje sam ti linkovao - inače će ti skripta biti ranjiva na SQL Injection) preko JavaScript-a.
<a href="javascript:delete_id(<?php echo $row[0]; ?>)">Delete</a>
On je napravio funkciju delete_id koja menja lokaciju u 'stranica?delete_id=<id predmeta>'. U PHP skripti ispitaš da li je prosleđen ID preko te GET metode i samo obrišeš upit. Kada generišeš tabelu samo dodaj i ID kao polje:
echo "<td>" + $row[0] + "</td>";
Ne moraš čak ni da koristiš JavaScript - samo dugmetu za brisanje definišeš URL kao 'stranica.php?delete=<?php echo $row[0]; ?>'.
Probaj sam to da uradiš pa javi ako negde zapneš.
|
|
|
|
Poslao: 30 Jul 2016 23:47
|
offline
- return void
- Anti Malware Fighter
Rank 1
- Pridružio: 02 Jan 2008
- Poruke: 2167
|
Dodao sam URL na button i to radi, ali se sada javlja problem sto se query ne izvrsava jer je string poslat $_POST metodom prazan. Izvrsio sam proveru sa ovom porukom "prazno" i bas nju dobijem kad hocu da izvrsim query.
Ovako kod sada izgleda:
<?php
header('Content-Type: text/html; charset=utf-8');
// define variables and set to empty values
$naziv_predmeta = $semestar = $sifra_predmeta = "";
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$naziv_predmeta = test_input($_POST["naziv"]);
$semestar = test_input($_POST["semestar"]);
$sifra_predmeta = test_input($_POST["sifra"]);
$tabela = $_POST['delete_id'];
}
function test_input($data) {
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data);
return $data;
}
$servername = "localhost";
$username = "projekat";
$password = "...";
$dbname = "...";
// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
$tabela = $_POST['delete_id'];
//$sql = "DELETE FROM projekat.Predmeti WHERE SifraPredmeta='$tabela'";
if(isset($_POST['delete_id'])) {
$sql = "DELETE FROM projekat.Predmeti WHERE SifraPredmeta='$tabela'";
}
else {
echo "prazno";
break;
}
if ($conn->query($sql) === TRUE) {
echo '<script type="text/javascript">
alert("Predmet uspešno obrisan!");
window.location = "...projekat/predmeti.php"
</script>';
} else {
echo "Error: " . $sql . "<br>" . $conn->error;
}
$conn->close();
?>
A ovako sada izgleda button:
echo "<tr>";
echo "<td>" . $row['Naziv'] . "</td>";
echo "<td>" . $row['Semestar'] . "</td>";
echo "<td>" . $row['SifraPredmeta'] . "</td>";
echo "<td><button type='button' class='btn btn-danger remove'><i class='fa fa-trash-o'></i><a href='baza/obrisipredmet.php?delete_id=".$row[2]."''>Delete</a>";
echo "</tr>";
|
|
|
|
Poslao: 31 Jul 2016 14:29
|
offline
- E.L.I.T.E.
- Legendarni građanin
- Pridružio: 23 Maj 2012
- Poruke: 4575
|
Dodaj proveru:
if (isset($_POST['delete_id']) && !empty($_POST['delete_id'])) {
I što dvaput inicijalizuješ promenljivu za tabelu? Ako si već postavio da vrednost promenljive sadrži POST parametre, koristi je:
if (isset($tabela) && !empty($tabela)) {
|
|
|
|
Poslao: 31 Jul 2016 16:05
|
offline
- return void
- Anti Malware Fighter
Rank 1
- Pridružio: 02 Jan 2008
- Poruke: 2167
|
Pa to sam fakticki vec dodao u kod. Cak sam pre toga proveru dodao ovde:
if ($conn->query($sql) === TRUE && isset($tabela)) {
medjutim bez rezultata. I sad sam ponovo uradio ovo sto si mi rekao, ali opet bez rezultata.
Definitivno je problem to sto je $_POST metoda prazna.
Ali opet ne znam gde se problem javlja jer je i link za brisanje ok, tj. ako je sifra predmeta za koji kliknem da obrisem "321", ja dobijem link ".../obrisipredmet.php?delete_id=321" tako da se definitivno ispravni podaci salju...
|
|
|
|
Poslao: 31 Jul 2016 16:31
|
offline
- vasa.93
- Moderator foruma
- Pridružio: 17 Dec 2007
- Poruke: 14824
- Gde živiš: Niš
|
return void ::Definitivno je problem to sto je $_POST metoda prazna.
Ali opet ne znam gde se problem javlja jer je i link za brisanje ok, tj. ako je sifra predmeta za koji kliknem da obrisem "321", ja dobijem link ".../obrisipredmet.php?delete_id=321" tako da se definitivno ispravni podaci salju...Ima tu više problema. Da ne dužim - to što ti pominješ sa 'detele_id=321' su GET parametri, a ne POST (zato je i promenljiva _POST prazna. Pogledaj malo o razlici između POST-a i GET-a i videćeš već u čemu grešiš.
|
|
|
|
Poslao: 31 Jul 2016 17:22
|
offline
- E.L.I.T.E.
- Legendarni građanin
- Pridružio: 23 Maj 2012
- Poruke: 4575
|
Razlika između POST i GET poziva je ta što se pri POST pozivu parametri šalju u telu HTTP poruke:
POST /index.php
Host: localhost
delete_id=4¶metar2=vrednost2
Dok se u GET pozivu parametri nalaze unutar URL-a:
index.php?delete_id=4¶metar2=vrednost2
Pisali smo na tu temu ovde.
|
|
|
|
Poslao: 31 Jul 2016 18:13
|
offline
- return void
- Anti Malware Fighter
Rank 1
- Pridružio: 02 Jan 2008
- Poruke: 2167
|
Da, to je bila greska, neverovatno... Imam dva slicna php fajla koji rade sa bazom, a u ovom prvom sam koristio $_POST i zbog slicnosti posla koji obavljaju sam samo kopirao i izmenjao sta mi treba, pa sam totalno zaboravio na $_GET. Hvala vam puno.
Onda mi sve ovo i ne treba, tacno?
$naziv_predmeta = $semestar = $sifra_predmeta = "";
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$naziv_predmeta = test_input($_POST["naziv"]);
$semestar = test_input($_POST["semestar"]);
$sifra_predmeta = test_input($_POST["sifra"]);
//$tabela = $_POST["delete_id"];
}
function test_input($data) {
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data);
return $data;
}
Koji su to dodatni problemi Vaso?
Usput, da li je ovakav kod ranjiv na SQL injection?
|
|
|
|
Poslao: 31 Jul 2016 18:31
|
offline
- E.L.I.T.E.
- Legendarni građanin
- Pridružio: 23 Maj 2012
- Poruke: 4575
|
return void ::Usput, da li je ovakav kod ranjiv na SQL injection?
Da. Koristi prepared statements.
Uzgred, zašto si stavio break u if petlji? Bolje kreiraj neko upozorenje na stranici i prikrij ga, pa u zavisnosti od greške ga prikaži i dodaj mu tekst (npr. parametar za brisanje nije naveden).
|
|
|
|
Poslao: 01 Avg 2016 13:53
|
offline
- return void
- Anti Malware Fighter
Rank 1
- Pridružio: 02 Jan 2008
- Poruke: 2167
|
Da li je kod sada u redu i da li sam izbegao SQL injection ranjivosti?
<?php
header('Content-Type: text/html; charset=utf-8');
$servername = "localhost";
$username = "projekat";
$password = "...";
$dbname = "...";
// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
$tabela = $_GET['delete_id'];
if (isset($tabela) && !empty($tabela)) {
//$sql = "DELETE FROM projekat.Predmeti WHERE SifraPredmeta='$tabela'";
$stmt = $conn->prepare("DELETE FROM projekat.Predmeti WHERE SifraPredmeta = ?");
$stmt->bind_param('s', $tabela);
$stmt->execute();
echo '<script type="text/javascript">
alert("Predmet sa šifrom '.$tabela.' uspešno obrisan!");
window.location = ".../predmeti.php"
</script>';
$stmt->close();
}
else {
echo '<script type="text/javascript">
alert("GREŠKA! Pokušajte opet...");
window.location = ".../predmeti.php"
</script>';
}
$conn->close();
?>
Ipak, u ovom slucaju mogu bilo koju vrednost da prosledim preko URL-a i dobicu poruku da je taj unos izbrisan iz baze, iako nije jer ne postoji.
Tipa, u bazi imam sifre predmeta: 123 i 321. Ja posaljem sledeci upit: .../obrisipredmet.php?delete_id=5555 i dobicu poruku: "Predmet sa sifrom 5555 je uspesno obrisan!".
Postoji li nacin (i da li bi uopste trebalo) da stavim proveru da, ako te prosledjene vrednosti nema u bazi, da izbaci poruku da te vrednosti u bazi nema?
|
|
|
|