2010-12-20 12 views
23

Estoy tratando de obligar a una variable en esta declaración preparada, pero no dejo de recibir el error:llamada a un bind_param función miembro() en un no-objeto

Call to a member function bind_param() on a non-object 

La función se llama, y ​​las variables se pasó a él. Cuando cambio la función para simplemente hacer eco de la variable, la variable imprime bien en la página, pero si intento encuadernarla aquí, recibo el error. ¿Alguien puede ayudar?

//CALL FROM PAGE ONE 
check($username); 

//FUNCTION ON PAGE 2 
function check($username){ 
$DBH = getDBH(); 
$qSelect = $DBH->prepare("SELECT * FROM users WHERE username = ?"); 
$qSelect->bind_param("s", $username); 
} 

sé que la función no está completamente escrita aquí, pero eso no debería ser un problema. No entiendo por qué estoy recibiendo este error.

+3

'var_dump ($ qSelect)' para comprobar si es lo que piensas que es. – Mchl

Respuesta

23

como dice el mensaje de error, $qSelect parece no ser un objeto. intente depurar esto usando var_dump($qSelect); justo después de su llamada de preparación. también verifique si getDBH() devuelve lo que necesita.

suena como la llamada prepare falla (no sé por qué) y por lo que devuelve false-false no es un objeto, por lo que no se puede llamar bind_param() en eso.

EDIT: No ha dado la información, pero parece que está usando la PDO de PHP. En ese caso, eche un vistazo al the documentation.

If the database server successfully prepares the statement, PDO::prepare() returns a PDOStatement object. If the database server cannot successfully prepare the statement, PDO::prepare() returns FALSE or emits PDOException (depending on error handling).

Debe configurar su servidor para que devuelva esas excepciones PDO, que le indicarán por qué falla la llamada de preparación.

+0

sí, es qSelect está devolviendo bool (falso) pero esto no tiene ningún sentido porque tengo una función que es prácticamente la misma y funciona bien. – mcbeav

+0

Estoy usando mysqli – mcbeav

+0

Hm. También estaba en la situación de tener una función que es prácticamente la misma. Resulta que lo había copiado y pegado para agregar un campo. ¡Pero olvidé la coma antes del nuevo campo! Estúpido error, pero solo demuestra que podría ser un error de tipeo de tu parte. –

67

Bien, una razón prepare() puede fallar es -

if the sql statement sent to it is not valid in the current DB. 

prepare() luego volverá falsa.

Por ejemplo, si el nombre de la tabla no es correcta o uno o más campos en la consulta no existe.

+0

información perfecta. – ripa

+0

¡Gracias! Eso me ayudó mucho. :) – dotslash

17

estoy usando el enfoque mysqli también y obtuve el mismo error cuando creé otra instancia de mysqli antes de cerrar la primera instancia. Por lo tanto, es importante utilizar close() antes de iniciar el mismo fragmento de código. Por ejemplo:

$DBH = getDBH(); 
$qSelect = $DBH->prepare("SELECT * FROM users WHERE username = ?"); 
$qSelect->bind_param("s", $username); 
$qSelect->close(); // <--- use close before calling the same function(wich contains $DBH code) again; 
+0

y si usa esa función muchas veces, creo que debería usar reset() en lugar de close(), y move prepare() fuera de la función, por ejemplo, en constructor, una declaración de put en propiedad como esta: $ this-> qSeleccione. – qdinar

2

Parece que prepararse es bastante tonto. No depende completamente de la consulta en el lado de MySQL, es decir, si en su consulta tiene una tabla que tiene el mismo nombre de palabra clave, diga "usuario", "orden", ... , simplemente no lo reconoce como una tabla, sino más bien como lo hacen los comandos de palabras clave, por lo que la consulta resulta ser un desastre y la preparación simplemente falla.

Para arreglar esto es simple, tiene que escribirlo de la manera "correcta" agregando "` "en ambos lados del nombre de la tabla. Ejemplo:

`user`, `order`, `...` 

Es correcto, sin embargo, me parece tonto de prepararse para tener este comportamiento.

1

Compruebe los permisos del usuario en la base de datos. El usuario sin permiso de "inserción" provoca "Llamar a una función miembro bind_param() en un error de mensaje no objeto" también, al intentar insertar.

1

Solo para tratar de ayudar a personas sin experiencia en PHP como yo.

En mi caso, este error se produjo porque tuve un error en SQL sintax. El seguimiento de la pila de la consola no muestra este problema.

Cuando arreglé el SQL el proceso salió bien.

Cuestiones relacionadas