Como siempre, estaba buscando las mejores prácticas con PHP, y las declaraciones preparadas parecen el tipo de cosas que debería hacer ahora, con los ojos cerrados. Entonces comencé a jugar con algunos ejemplos que he encontrado.Declaración preparada de Mysqli en bindParam() no funciona
Tengo este error cuando se ejecuta la secuencia de comandos:
Fatal error: Call to a member function bindParam() on a non-object in /opt/lampp/htdocs/phpSecurity/PreparedStatments/Insert-Multi-Binded-Params/Insert Simple Method.php on line 10
Aquí va el código.
Insertar 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 está seguro de lo que estoy haciendo mal aquí, esto es ejemplo similar encontrado en php.net, ¿Por qué no está funcionando? 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 example debo usar bind_param()
para cada valor de la consulta. Pero gracias a Bart, logró resolver el problema con mi código.
Cuando sea:
$stmt->bindParam(1, $nome);
$stmt->bindParam(2, $telefone);
$stmt->bindParam(3, $bi);
que debe ser:
$stmt->bind_param("sii", $nome, $telefone, $bi);
Ahora para los que pudieron preguntando qué es "sii".
Bien bind_param por lo que veo une el "$ var" a cada signo de interrogación "?" en orden.
Así que con un bind_param()
puedo vincularlos 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
una Cadena, especificada por la "s";
Y los otros $telefone
y $bi
son enteros para los que tiene "i";
Para otros que tienen un problema similar aquí van otros tipos de datos (de php.net).
i = Integer;
s = String;
d = Double;
b = Blob;
Si alguien tiene una mejor explicación, publíquela o coméntela. Así que puedo mejorar el mío.
Gracias.
Buena sugerencia para las mejores prácticas. Lo intenté, pero no resolvió el problema. ¿Alguna otra idea? –
$ stmt-> bind_param ("sii", $ nome, $ telefone, $ bi); Trabajó. –
Es bueno escucharlo Fábio. –