2012-12-10 3 views
-2

enter image description hereMySQLi déclaration préparée se plaint que "seules les variables doivent être passés par référence"

code:

$stmt->bind_param("s", md5($input['user'] . $config['salt'])); 

Erreur PHP Message:

Seules les variables doivent être transmises par référence

J'ai travaillé sur ce projet mais je suis coincé maintenant. Je suis nouveau à PHP. Que faire?

+6

S'il vous plaît ne pas coller des captures d'écran de code. Au lieu de cela, collez le code lui-même. Lorsque les numéros de ligne importent, signalez simplement la ligne incorrecte. – Charles

+0

http://php.net/language.references.pass – hakre

Répondre

6

Merci d'utiliser les instructions préparées MySQLi! Ils sont une douleur, mais ça vaut le coup.

bind_param prend les valeurs par référence. Il le fait en regardant la variable que vous passez et en pointant vers les entrailles directement.

Dans votre appel, vous renvoyez le résultat de chaîne d'un appel de fonction - md5 dans ce cas. Parce qu'il n'y a pas de variable impliquée, il n'y a pas d'entrailles à pointer. PHP se plaint de ne pas pouvoir transmettre les données par référence.

Vous devrez coller le résultat de l'appel de fonction dans une variable, puis passer cette variable dans la liaison à la place.

BIG FAT AVERTISSEMENT!md5 est pas un hachage sécurisé plus longtemps, et devrait pas être utilisé pour stocker les mots de passe. Lorsque vous avez la chance, vous devriez mettre à jour vers un meilleur format de hachage, tel que bcrypt, PBKDF2, scrypt, etc.

+0

Merci @charles. L'erreur a maintenant disparu, mais je ne suis toujours pas sur le point de me connecter au système, même si mon mot de passe et mon nom d'utilisateur sont corrects. Lorsque je clique sur Envoyer, cela suppose de me diriger vers la page des membres (ligne 54). Au lieu de cela, il a affiché le message d'erreur à la ligne 60. $ stmt-> execute(); $ stmt-> store_result(); if ($ stmt-> num_rows> 0) {// Définit la variable de session $ _SESSION ['username'] = $ input ['user']; header ("Location: members.php"); // ligne 54} else {// nom d'utilisateur/mot de passe incorrect $ error ['alert'] = "Nom d'utilisateur ou mot de passe incorrect!"; // line60 - –

2

Chaque paramètre (mais le premier) du bind_param method doit être une variable et non comme dans votre cas, une valeur de retour de fonction. Seules les variables peuvent être passed by reference.

Avec cela à l'esprit, vous pouvez facilement changer le code pour se débarrasser du message d'erreur:

$input['hash'] = md5($input['pass'] . $config['salt']); 
$stmt->bind_param("ss", $input['user'], $input['hash']); 
+0

Merci @hakre. L'erreur a maintenant disparu, mais je ne suis toujours pas sur le point de me connecter au système, même si mon mot de passe et mon nom d'utilisateur sont corrects. Lorsque je clique sur Envoyer, cela suppose de me diriger vers la page des membres (ligne 54). Au lieu de cela, il a affiché le message d'erreur à la ligne 60. \t \t \t $ stmt-> execute(); \t $ stmt-> store_result(); \t \t if ($ stmt-> num_rows> 0) { \t \t // Variable set session \t $ _SESSION [ 'username'] = entrée $ [ 'user']; \t \t header ("Location: members.php"); // ligne 54 \t} \t autre \t {// \t nom d'utilisateur/mot de passe incorrect \t $ error [ 'alerte'] = « Nom d'utilisateur ou mot de passe incorrect! "; // line60 –

+0

Si vous êtes sûr que votre nom d'utilisateur et votre mot de passe sont corrects, il est évident que leur traitement doit contenir le problème. Voir ici pour quelques infos générales http://php.net/manual/fr/faq.passwords.php Veuillez aussi améliorer votre question ici et clarifier votre problème actuel/de suivi. Vous avez déjà eu quelques commentaires hier et j'ai fait quelques modifications partielles par moi-même, mais s'il vous plaît continuez là où je me suis arrêté. – hakre

Questions connexes