2009-08-12 12 views
7

Używam php/mysql i protype.js do usuwania rekordu z tabeli. Problem polega na tym, że rekord w bazie danych nie jest usuwany.Usuwanie rekordów z bazy danych za pomocą żądania Ajax

index.php:

 <a href="javascript: deleteId('<?php echo $studentVo->id?>')">Delete</a></td> 

Script jest

function deleteId(id) 
    { 
     alert("ID : "+id); 
     new Ajax.Request('delete.php?action=Delete&id='+id,{method:'post'}); 
     $(id).remove(); // because <tr id='".$row[id]."'> :) 

    } 

delete.php

 <?php 
     /* Database connection */ 
     include('configuration.php'); 
     echo "hello,..."; 
     if(isset($_POST['id'])){ 
      $ID = $_POST['id']; 
      $sql = 'DELETE FROM student where id="'.$ID.'"'; 
      mysql_query($sql); 
     } 
     else { echo '0'; } 
    ?> 

alert("ID : "+id); działa prawidłowo, ale kod po tym nie ma.

+1

+1 nawet jeśli proste, dobrze wyjaśnione. ;-) – Shoban

Odpowiedz

9

Używasz żądanie GET, z JS:

{method:'get'} 

a kod PHP wykorzystuje dane według niego przybywa jako POST:

$ID = $_POST['id']; 

należy używać tej samej metody na obu stronach.

(Jak jesteś modyfikowanie/usuwanie danych, powinieneś użyć POST)


Jako marginesie należy zdecydowanie uciec/protected/sprawdzić dane używanego w zapytaniu SQL, aby unikaj iniekcji SQL, używając na przykład intval, ponieważ pracujesz z liczbą całkowitą; używałbyś mysql_real_escape_string, jeśli pracujesz z ciągiem znaków.

Innym sposobem byłoby przestać używać starego mysql rozszerzenie, i zacząć używać mysli lub PDO, co oznacza, że ​​można użyć przygotowanych sprawozdań (mysqli, pdo)


EDIT po komentarzu: ty też teraz, gdy żądanie jest wykonywane w POST, należy zmienić sposób przekazywania parametrów: nie powinny już być przekazywane w adresie URL.

Przypuszczam, że coś jak to powinno działać:

var myAjax = new Ajax.Request(
    'delete.php', 
    { 
    method: 'post', 
    parameters: {action: id} 
    }); 

Albo można też użyć czegoś takiego, budynek o jakieś parametry siebie:

var myAjax = new Ajax.Request(
    'delete.php', 
    { 
    method: 'post', 
    parameters: 'action=' + id 
    }); 

(nie testowane, więc może trzeba zmienić kilka rzeczy ;-))

Aby uzyskać więcej informacji, zobacz Ajax.Request i Ajax options :-)

+0

ok, zrobiłem {method: 'post'} i plik php $ ID = $ _POST ['id']; ale nie działają –

+0

Musisz również zmienić sposób przekazywania parametru: jeśli używasz POST, parametr nie powinien być przekazywany w adresie URL, ale za pomocą opcji "parametry"; zobacz http://www.prototypejs.org/api/ajax/request i http://www.prototypejs.org/api/ajax/options, aby uzyskać więcej informacji –

+0

OK, teraz rekord można usunąć, ale muszę odświeżyć stronę, aby zobaczyć zmiany. Więc jak mogę kodować, aby usunąć ten rekord z bieżącej strony? Odpowiedź serwera byłaby taka, abyśmy mogli ustalić, czy rekord został usunięty, czy nie. Czy możesz mi pomóc to rozwinąć? –

0

Wygląda na to, że twoje żądanie ajaxowe używa GET, ale twój skrypt usuwa próbę pobrania identyfikatora przez POST. Spróbuj ustawić {method:'get'} na {method:'post'}.

+0

ok, kochanie, zrobiłem {metoda: 'post'} do {method: 'post'}. ale nie ma wyniku –

0

Zmień usuń.php tak:

<?php 
     /* Database connection */ 
     include('configuration.php'); 
     echo "hello,..."; 
     if(isset($_GET['id'])){ 
      $ID = $_GET['id']; 
      $sql = 'DELETE FROM student where id="'.$ID.'"'; 
      mysql_query($sql); 
     } 
     else { echo '0'; } 
    ?> 

Lub alternatywnie zimno użyć $ _REQUEST zamiast $ _GET (lub $ _POST w pierwszym przykładzie), ponieważ agregaty $ _GET i $ _POST tablic.

+0

Ok bracie, teraz rekord można usunąć, ale muszę odświeżyć stronę, aby zobaczyć zmiany. Więc jak mogę kodować, aby usunąć ten rekord z bieżącej strony? Odpowiedź serwera byłaby taka, abyśmy mogli ustalić, czy rekord został usunięty, czy nie. Czy możesz mi pomóc to rozwinąć? –

Powiązane problemy