MySQLi SELECT связывает параметры, не возвращая строку - PullRequest
1 голос
/ 06 декабря 2010

Я использую MySQLi для обработки некоторых баз данных, и я не понимаю, почему мой код не работает.

// 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')) {
 $stmt->bind_param('s', $username);

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

    $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();

С именем пользователя "gooduser" и "goodpass" это должно вернуть правильную строку, и она должна работать оттуда. Обратите внимание, что $ _SESSION ['messages'] - мой трекер сообщений. При выводе сообщений я получаю такой вывод:

Num rows: 0
Line 67
Line 77

Он пропускает цикл while, потому что Num строк равен 0. При изменении фрагмента по запросу, чтобы не использовать связанные параметры, это работает:

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

Возвращает:

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

Кто-нибудь хочет объяснить, что я здесь делаю неправильно? Я пытаюсь создать простой сценарий входа в систему.

РЕДАКТИРОВАТЬ: Вот структура таблицы:

-- 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 ;

ОБНОВЛЕНИЕ : Из разных источников похоже, что полный набор функций MySQLi доступен в v4.1.3, несмотря на документацию v4.1. Некоторые функции работают, а другие (например, bind_param) - нет. Я уже поговорил со своим хостом и ищу обновление до последней версии.

1 Ответ

0 голосов
/ 06 декабря 2010

Вам нужно установить $username = 'gooduser';, прежде чем позвонить $stmt->bind_param('s', $username); , протестировать и работать.

РЕДАКТИРОВАТЬ для меня следующие работы, пожалуйста, скопируйте, вставьте его в файл и посмотрите, какой вывод вы получите

    <?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);

возвращает:

    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"


 }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...