2009-11-04 9 views
7

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.

Respuesta

6

Usted puede pensar que no hay nada malo con la conexión, pero usted debe comprobar 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(); 
} 

EDIT:

¿Qué pasa cuando haces:

$stmt = $db->prepare("INSERT INTO coisas (nome, telefone, bi) VALUES (?, ?, ?)"); 
$stmt->bind_param("sii", $nome, $telefone, $bi); 
$stmt->execute(); 

?

¿La tabla coisas está escrita correctamente?

+0

Buena sugerencia para las mejores prácticas. Lo intenté, pero no resolvió el problema. ¿Alguna otra idea? –

+0

$ stmt-> bind_param ("sii", $ nome, $ telefone, $ bi); Trabajó. –

+0

Es bueno escucharlo Fábio. –

2

haga una impresión de $ stmt después de que vuelva a estar en la línea 4. ¿Es un objeto real? Supongo que no.

+0

No estoy seguro de qué hará eso. El problema era que como uso de bind param para cada valor, solo podía usar uno, y no mencioné el tipo de entrada de valor (s = string | i = integer). Gracias de cualquier manera. –

+0

El error indicaba que el objeto ($ stmt) al que llamaba un método no era en realidad un objeto. Eso podría haber ocurrido dentro de ese método, pero mi primera suposición fue que era un valor nulo en primer lugar. – Zak

Cuestiones relacionadas