2010-12-05 54 views
1

J'utilise MySQLi pour gérer certaines bases de données et je ne comprends pas pourquoi mon code ne fonctionne pas. Avec un nom d'utilisateur de "gooduser" et "goodpass", cela devrait retourner la ligne correcte et cela devrait fonctionner à partir de là. Notez que $ _SESSION ['messages'] est mon outil de suivi des messages. Lors de la sortie des messages, je reçois cette sortie:MySQLi Les paramètres liés de SELECT ne retournent pas une ligne

Num rows: 0 
Line 67 
Line 77 

Il est sauter le tout en boucle parce que les lignes Num est 0. Lorsque vous modifiez l'extrait par la requête de ne pas utiliser params lié, il fonctionne:

// create prepared statement 
if ($stmt = $mysqli->prepare('SELECT password FROM login_users WHERE user_name = "gooduser" LIMIT 1')) { 
//$stmt->bind_param('s', $username); 

//$username = 'gooduser'; 
$password = md5('goodpass'); 

Ce retour:

Num rows: 1 
Line 67 
Line 69 
Success! 
Line 77 

Quelqu'un veut expliquer ce que je fais mal ici? J'essaye de faire un script de connexion simple.

EDIT: Voici la structure de la table:

-- Table structure for table `login_users` 
-- 

CREATE TABLE `login_users` (
    `user_id` int(11) NOT NULL auto_increment, 
    `user_name` varchar(30) NOT NULL default '', 
    `password` varchar(70) NOT NULL default '', 
    PRIMARY KEY (`user_id`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ; 

MISE À JOUR: Grâce à diverses sources, il semble que l'ensemble des fonctionnalités de MySQLi est disponible en v4.1.3, malgré la documentation indiquant v4.1 . Certaines fonctionnalités fonctionnent, mais pas d'autres (comme bind_param). J'ai déjà parlé à mon hôte et je cherche à passer à la dernière version.

Répondre

0

Vous devez définir $username = 'gooduser'; avant d'appeler $stmt->bind_param('s', $username); , testé et fonctionne.

EDIT pour moi Les œuvres suivantes, s'il vous plaît copier coller sur vous êtes fichier et voir ce que la sortie que vous obtenez

<?php 
    ini_set('display_errors',1); 
    error_reporting(E_ALL); 
    // new connection 
    $mysqli = new mysqli(
    $config['database']['connect']['host'], 
    $config['database']['connect']['username'], 
    $config['database']['connect']['password'], 
    $config['database']['connect']['name'] 
    ); 


    // verify connection 
    if (mysqli_connect_errno()) { 
    printf("Connect failed: %s\n", mysqli_connect_error()); 
    exit(); 
    } 

    // create prepared statement 
    if ($stmt = $mysqli->prepare('SELECT password FROM login_users WHERE user_name = ? LIMIT 1')) { 
     $username = 'gooduser'; 
$password = md5('goodpass'); 
    $stmt->bind_param('s', $username); 


     $stmt->execute(); 
    $stmt->store_result(); 

    $_SESSION['messages'][] = 'Num rows: ' . $stmt->num_rows; 
    $stmt->bind_result($pass); 


    $_SESSION['messages'][] = 'Line 67'; 
    while ($stmt->fetch()) { 
     $_SESSION['messages'][] = 'Line 69'; 
     if ($password == $pass) { 
     $_SESSION['messages'][] = 'Success!'; 
     } 
     else { 
     $_SESSION['messages'][] = 'Bad pass'; 
     } 
    } 
    $_SESSION['messages'][] = 'Line 77'; 
    //header('Location: ' . $_SESSION['redirect']); 

     $stmt->close(); 
    } 
    $mysqli->close(); 
    var_dump($_SESSION); 

retours:

array(1) { 
     ["messages"]=> 
     array(5) { 
     [0]=> 
     string(11) "Num rows: 1" 
     [1]=> 
     string(7) "Line 67" 
     [2]=> 
     string(7) "Line 69" 
     [3]=> 
     string(8) "Success!" 
     [4]=> 
     string(7) "Line 77" 


} 
} 
+0

faire comme vous dites: \t $ nom d'utilisateur = 'bon utilisateur'; \t $ stmt-> bind_param ('s', $ nom d'utilisateur); Cela renvoie toujours le même que le premier scénario sur mon OP. – Cletus

+0

J'ai changé le mot de passe de connexion, hôte ... et les champs mysql pour travailler avec une table de test en cours j'ai sur mon localhost et j'obtiens la sortie désirée, petite note: s'il vous plaît fermer toutes les conections avant d'appeler la fonction header rien à voir avec le bug, mais a à voir avec de meilleures pratiques) –

+0

La copie exacte-> pâte de ce qui précède renvoie exactement le même que précédemment. En outre, en note, comment puis-je poster du code dans les commentaires? – Cletus