Brisanje vrednosti iz baze pomocu PHP-a i JavaScripta

1

Brisanje vrednosti iz baze pomocu PHP-a i JavaScripta

offline
  • 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 Smile



Registruj se da bi učestvovao u diskusiji. Registrovanim korisnicima se NE prikazuju reklame unutar poruka.
offline
  • Programer
  • 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š.



offline
  • 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>";

offline
  • Programer
  • 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)) {

offline
  • 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...

offline
  • Milan
  • 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š.

offline
  • Programer
  • 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&parametar2=vrednost2

Dok se u GET pozivu parametri nalaze unutar URL-a:

index.php?delete_id=4&parametar2=vrednost2

Pisali smo na tu temu ovde.

offline
  • 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. Ziveli

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? Smile

Usput, da li je ovakav kod ranjiv na SQL injection?

offline
  • Programer
  • 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).

offline
  • Pridružio: 02 Jan 2008
  • Poruke: 2167

Da li je kod sada u redu i da li sam izbegao SQL injection ranjivosti? Smile
<?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?

Ko je trenutno na forumu
 

Ukupno su 920 korisnika na forumu :: 3 registrovanih, 0 sakrivenih i 917 gosta   ::   [ Administrator ] [ Supermoderator ] [ Moderator ] :: Detaljnije

Najviše korisnika na forumu ikad bilo je 3466 - dana 01 Jun 2021 17:07

Korisnici koji su trenutno na forumu:
Korisnici trenutno na forumu: kybonacci, WerWolf14, wizzardone