mysqli_stmt_execute - sentencias preparadas php mysqli
La declaraciĆ³n preparada de Mysqli en bindParam() no funciona (2)
Como de costumbre, estaba buscando las mejores prácticas con PHP, y las declaraciones preparadas parecen el tipo de cosas que debería hacer ahora, ¿cómo hago con los ojos cerrados? Entonces comencé a jugar con algunos ejemplos que he encontrado.
Tengo este error al ejecutar el script:
Error grave: llamada a una función miembro bindParam () en un no objeto en / opt / lampp / htdocs / phpSecurity / PreparedStatments / Insertar-Multi-Binded-Params / Insertar Simple Method.php en la línea 10
Aquí va el código.
Insert Simple Method.php
<?php
require_once ''../config.php'';
$stmt = $db->prepare("INSERT INTO coisas (nome, telefone, bi) VALUES (?, ?, ?)");
$nome = ''Fabio Antunes'';
$telefone = 916810641;
$bi = 123093456;
$stmt->bindParam(1, $nome);
$stmt->bindParam(2, $telefone);
$stmt->bindParam(3, $bi);
$stmt->execute();
$stmt->close();
$db->close();
?>
config.php
<?php
$server_host = ''localhost'';
$server_user = ''root'';
$server_password = '''';
$server_db = ''PreparedStatements'';
$db = new mysqli($server_host, $server_user, $server_password, $server_db);
?>
No estoy seguro de lo que estoy haciendo mal aquí, este es un ejemplo similar encontrado en php.net, ¿por qué no funciona? PD: Creo que la conexión mysqli no es el problema porque la he usado para hacer algunas declaraciones preparadas con comandos SELECT SQL. Y funcionó bastante bien.
EDITAR
La resolución y por qué.
Bueno, en el ejemplo, debería usar bind_param()
para cada valor en la consulta. Pero gracias a Bart, logró resolver el problema con mi código.
Donde es:
$stmt->bindParam(1, $nome);
$stmt->bindParam(2, $telefone);
$stmt->bindParam(3, $bi);
Debería ser:
$stmt->bind_param("sii", $nome, $telefone, $bi);
Ahora para aquellos que podrían preguntarse qué es "sii".
Bueno bind_param por lo que veo, une el "$ var" a cada signo de interrogación "?" en orden.
Entonces, con un bind_param()
puedo vincularlos a todos al mismo tiempo, y el uso normal de bind_param()
requiere especificar el tipo de datos que se enlazan.
Mi primer valor en ser encuadernado es $nome
a String, especificado por la "s";
Y los otros $telefone
y $bi
son enteros porque tiene "i";
Para otros que tienen un problema similar aquí van otros tipos de datos (de php.net).
i = Entero;
s = Cadena;
d = Doble;
b = Blob;
Si alguien es una mejor explicación, publíquela o coméntela. Así que puedo mejorar el mío.
Gracias.
Puede pensar que no hay nada de malo en la conexión, pero debe verificar para asegurarse de que:
$db = new mysqli($server_host, $server_user, $server_password, $server_db);
if (mysqli_connect_errno()) {
printf("DB error: %s", mysqli_connect_error());
exit();
}
EDITAR:
Qué sucede cuando lo haces:
$stmt = $db->prepare("INSERT INTO coisas (nome, telefone, bi) VALUES (?, ?, ?)");
$stmt->bind_param("sii", $nome, $telefone, $bi);
$stmt->execute();
?
¿La tabla coisas
escrita correctamente?
haga print_r en $ stmt después de que lo vuelva a poner en la línea 4. ¿Es un objeto real? Supongo que no.