web-dev-qa-db-fra.com

Appel à une fonction membre bind_param () sur un non-objet

J'essaie de lier une variable dans cette déclaration préparée, mais je continue de recevoir l'erreur:

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

La fonction est appelée et des variables lui sont transmises. Lorsque je change la fonction pour ne faire qu'écho à la variable, la variable s'imprime bien sur la page, mais si j'essaye de la lier ici, je reçois l'erreur. quelqu'un peut-il aider?

//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);
}

je sais que la fonction n'est pas complètement écrite ici, mais cela ne devrait pas être un problème. Je ne comprends pas pourquoi je reçois cette erreur.

26
mcbeav

comme l'indique le message d'erreur, $qSelect ne semble pas être un objet. essayez de déboguer cela en utilisant var_dump($qSelect); juste après votre appel de préparation. vérifiez également si getDBH() renvoie ce dont vous avez besoin.

sonne comme l'appel de préparation échoue (je ne sais pas pourquoi) et donc il retourne false - false n'est pas un objet, donc vous ne pouvez pas appeler bind_param() on cette.

EDIT: vous n'avez pas donné les informations, mais il semble que vous utilisez le PDO de PHP. Dans ce cas, jetez un œil à la documentation .

Si le serveur de base de données prépare correctement l'instruction, PDO :: prepare () renvoie un objet PDOStatement. Si le serveur de base de données ne parvient pas à préparer correctement l'instruction, PDO :: prepare () renvoie FALSE ou émet PDOException (selon la gestion des erreurs).

Vous devez configurer votre serveur pour renvoyer ces exceptions PDO, qui vous indiqueraient pourquoi l'appel de préparation échoue.

24
oezi

Eh bien, une raison pour laquelle prepare() peut échouer est que l'instruction sql qui lui est envoyée n'est pas valide dans la base de données actuelle.

prepare() renverra alors false.

Par exemple - si le nom de la table n'est pas correct ou si un ou plusieurs champs de la requête n'existent pas.

68
Stefan

j'utilise également l'approche mysqli et j'ai eu la même erreur lorsque j'ai créé une autre instance de mysqli avant de fermer la première instance. Il est donc important d'utiliser close() avant de démarrer le même morceau de code. Par exemple:

$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;
17
fvdz

Il semble que préparer soit assez stupide. Il ne repose pas entièrement la requête dans le côté MySQL, par cela, je veux dire, si dans votre requête, vous avez une table qui se trouve avoir le même nom d'un mot-clé, dites "utilisateur", "commande", ... , il ne le reconnaît tout simplement pas comme une table, mais plutôt comme ce que font réellement les commandes de mots clés, donc la requête s'avère être un gâchis et la préparation échoue.

Pour résoudre ce problème est simple, vous devez le taper de la manière "correcte" en ajoutant "" "des deux côtés du nom de la table. Exemple:

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

C'est correct, pourtant, je trouve idiot de se préparer à avoir ce comportement.

2
PHP Hater

Seulement pour essayer d'aider les gens sans expérience dans PHP comme moi.

Dans mon cas, cette erreur s'est produite car j'avais une erreur dans la sintax SQL. La trace de la pile de la console ne montre pas ce problème.

Quand j'ai corrigé le SQL, le processus s'est bien passé.

1
Maciel Bombonato

Vérifiez les autorisations de l'utilisateur dans la base de données. L'utilisateur sans l'autorisation "insérer" provoque également une erreur de message "Appel à une fonction membre bind_param () sur un non-objet" lors de la tentative d'insertion.

1
itsites