2010-12-05 117 views
1

我正在使用MySQLi进行某些数据库处理,我不明白为什么我的代码无法正常工作。MySQLi SELECT绑定参数不返回一行

// 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循环,因为民行是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 ; 

UPDATE:通过各种渠道,它看起来像全功能集的MySQLi的是v4.1.3可用,尽管文档说明V4.1 。一些功能可以工作,但其他功能(例如bind_param)却不能。我已经和我的主持人谈过了,我正在寻求升级到最新版本。

回答

0

在您拨打$stmt->bind_param('s', $username); 之前,您需要设置$username = 'gooduser';,并进行测试和工作。

我EDIT 以下工作,请复制粘贴在你的文件,看看你会得到什么输出

<?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" 


} 
} 
+0

这样做,你说: \t $ username ='gooduser'; \t $ stmt-> bind_param('s',$ username); 这仍然会返回与我的OP上的第一个场景相同的结果。 – Cletus 2010-12-05 21:54:16