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: 14811
  • 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 904 korisnika na forumu :: 48 registrovanih, 7 sakrivenih i 849 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: 357magnum, A.R.Chafee.Jr., arton, cavatina, comi_pfc, dejina811, drazenm, dulleo, FileFinder, FOX, goxin, HrcAk47, ikan, kolle.the.kid, Kubovac, laganini123, lord sir giga, Marko Marković, Mi lao shu, mile23, milenko crazy north, Milos ZA, Milos82, minmatar34957, nebkv, nuke92, ozzy, pacika, Pakito93, Panter, panzerwaffe, pedja.st, Ripanjac, RJ, ruma, sasa76, sevenino, Shinobi, Simon simonović, solic, Srle993, theNedjeljko, tubular, vlad4, Zimbabwe, zziko, |_MeD_|, šumar bk2