Estoy tratando de ejecutar la declaración SQL de eliminación al presionar el botón, que funcionaba si vinculaba 1 parámetro, pero quiero hacer que delete.php sea genérico, para no tener varios de ellos solo para hacer referencia a diferentes tablas:
<?php include "header.php"; include "db.php"; $_POST['table'] = "customer"; $_POST['column'] = "cID"; $_POST['del_id'] = 26; if(isset($_POST['del_id'])) { if ($stmt = $conn->prepare("DELETE FROM customer WHERE ? = ?")) { $stmt->bind_param('si', $_POST['column'], $_POST['del_id']); $stmt->execute(); } else echo("Oops"); }Este enlace se ejecuta pero no hace nada en la tabla, solo enlaza el valor final 'del_id', se ejecuta correctamente y enlaza 3 argumentos, incluido el nombre de la tabla, solo hace que prepare () falle.
Estoy configurando _POST vars en otros lugares de AJAX POST, arriba es solo para probar si este bit funciona o no. Tampoco me he puesto a hacer la validación todavía antes de que eso suceda.
Muy novato de PHP, probablemente un simple error, o simplemente algo de lo que no estoy al tanto, en cuyo caso sería bastante curioso saber por qué los nombres de las tablas/columnas no se pueden parametrizar, ya que me ha estado eludiendo durante algún tiempo. . Como solución alternativa, ¿funcionaría alguna forma de concatenación para poder colocar nombres dinámicos en esta consulta desde varios lugares diferentes?
Sí, para lograr esto necesitará tener una combinación de concatenación y parámetros para la declaración preparada:
if ($stmt = $conn->prepare("DELETE FROM " . $_POST['table'] . " WHERE " . $_POST['column'] . " = ?")) { $stmt->bind_param('si', $_POST['del_id']); $stmt->execute(); }Asegúrese de prestar atención a las validaciones adicionales que necesitará en los nombres de las tablas y columnas. Esto debe validarse con su modelo de datos y no solo asegurarse de que sea un identificador válido. Además, eche un vistazo a algunos ORM/Generadores de consultas para aprender a desarrollar esta idea. Es un buen ejercicio de aprendizaje.
Debe validar tanto el nombre de la tabla como el nombre de la columna antes de ejecutar la eliminación.
Dado que no puede preparar los nombres de las tablas o las columnas, simplemente colóquelos en la instrucción sql antes de la preparación.
<?php include "header.php"; include "db.php"; $_POST['table'] = "customer"; $_POST['column'] = "cID"; $_POST['del_id'] = 26; // Add code to prevent SQL injection $table = $_POST['table'] == 'customer' ? $_POST['table'] : ''; $column = $_POST['column'] == 'customer' ? $_POST['column'] : ''; if(isset($_POST['del_id']) && $table != '' && $column != '') { if ($stmt = $conn->prepare("DELETE FROM `".$table."` WHERE `".$column."` = ?")) { $stmt->bind_param('i', $_POST['del_id']); $stmt->execute(); } else echo("Oops"); }