sentencias preparadas mysqli_stmt_execute bind_result bind_param php mysqli prepared-statement

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.