Mysql DELETE consulta comportamiento extraño

He llenado un formulario html con datos MySQL de una tabla.

Incluí en esa tabla un formulario que, si se envía, debería eliminar esa fila de datos de la tabla MySQL.

Este es el código que crea, llena la tabla con los datos de MySQL de mi tabla (se perdió el código de conexión de db y otro código que he considerado irrelevante).

 while($row_data=mysql_fetch_array($table_data)){
    echo "<tr>";
    echo "<td>" . $row_data['ID'] . "</td>";
    echo "<td>" . $row_data['Site'] . "</td>";
    echo "<td>" . $row_data['Date'] . "</td>";
    echo "<td>" . $row_data['Target_Site'] . "</td>";
    echo "<td>" . $row_data['Target_Contact_Email'] . "</td>";
    echo "<td>" . $row_data['Target_Contact_Name'] . "</td>";
    echo "<td>" . $row_data['Link_Type'] . "</td>";
    echo "<td>" . $row_data['Link_Acquired'] . "</td>";
    echo "<td>" . $row_data['Notes'] . "</td>";
    echo "<td>" . $row_data['Link_URL'] . "</td>";
    echo "<td></td>";
    echo "<td><form action='delete.php' method='post'><input type='hidden' name='delete_id' value=" .  $row_data['ID'] . "><input type='submit' value='&#x2713;' name='delete' style='background:none;' /></form></td>";
    echo "</tr>";
    }

Como puede ver en ese código, hay una tabla de datos al final, que es un formulario, y si se hace clic en él, se elimina esa fila determinada. Como puede ver en el formulario, la acción es delete.php.

Este es el código para delete.php (código de conexión db perdido)

$ID = $_POST['delete_id'];
$Delete = $_POST['delete'];



if(isset($Delete)){ 

mysql_query("DELETE FROM link_building WHERE 'ID'=" . $ID);

header("location:link_building.php?success2=1");
}else{
header("location:link_building.php?fail2=1");
}

Ahora, en cierto modo funciona, pero solo elimina filas de datos que tienen una ID de 0. Cada vez que intento eliminar una fila de datos con una ID de 2, por ejemplo, dice que eliminó correctamente los datos, pero en realidad no los elimina. . Pero cuando hago clic en eliminar en una fila con una identificación de 0, elimina todos los datos en lugar de solo esa fila.

preguntado el 09 de marzo de 12 a las 13:03

Intente construir la consulta en una variable (cadena) y envíela, y comente mysql_query & redirect. E intente ejecutar esta consulta generada manualmente (phpmyadmin), esto probablemente le dirá qué es lo que está mal:

@Ryan: ¿dónde leíste que tienes que citar los nombres de las columnas? Estoy realmente interesado si hay un tutorial o algo por ahí que le enseñe a la gente a hacer eso. -

Realmente no puedo recordar para ser honesto. Es increíble cómo algo tan pequeño puede marcar una gran diferencia.

Bueno, solo te muestra que no es una cosa pequeña. Para un usuario experimentado, significa que es una cadena de datos. Para los inexpertos, es una cosa pequeña, casi sin sentido. He visto bastantes preguntas en estos días que giran en torno al mismo problema: usar comillas simples para citar los nombres de las columnas en lugar del carácter `, por lo que me preguntaba si había un tutorial que enseñara a las personas a usar comillas simples. -

Consejo: use HEREDOCs para hacer que ese blob html sea más fácil de leer y eliminar los ecos repetitivos. -

1 Respuestas

Tu problema es que has citado 'ID' con comillas simples. Un número entero 0 comparado con cualquier cadena equivale a VERDADERO en MySQL, y el citado 'ID' es un literal de cadena en lugar de un nombre de columna, por lo tanto, su eliminación se produce cuando pasa el ID = 0, pero falla en todas las demás circunstancias.

Quitar las comillas de ID:

mysql_query("DELETE FROM link_building WHERE ID=" . $ID);
//------------------------------------------^^^^

Además, su código es vulnerable a la inyección de SQL. Asegúrese de filtrar correctamente el valor de $ID.

if (isset($_POST['delete_id']) && !ctype_digit($_POST['delete_id'])) {
   // Non-integer value! error! bail out!
}
else {
   $ID = $_POST['delete_id'];
   // Do your query...
}

Tenga en cuenta que el código anterior difiere del original en que comprueba la presencia de $_POST['delete_id'] y su validez antes de proceder con el resto de la operación. En su original, establece los valores de $ID y $Delete sin comprobar si existen. No es realmente necesario verificar $Delete ya que solo tiene la otra entrada de formulario.

Una nota final: no vemos ningún código de autenticación en esta publicación, pero asegúrese de que si está aceptando eliminaciones de SQL desde una entrada de formulario, verifique los permisos en la fila que se elimina antes de eliminarla. De lo contrario, cualquier usuario podría modificar el formulario para eliminar las filas de cualquier otro usuario (si esto se aplica a su situación).

respondido 09 mar '12, 14:03

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.