2010-12-05 11 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 

それはヌム行が0 バインドのparamsを使用しないようにクエリによってスニペットを変更した場合ので、それが動作するwhileループをスキップします

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

誰もが私がここで間違ってやっているかを説明する気?私は簡単なログインスクリプトを作ろうとしています。

EDIT:

-- 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にもかかわらず、v4.1.3で提供されています。一部の機能は機能しますが、他の機能(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

+0

私は接続パスワード、ホスト、mysqlフィールドを現在のテストテーブルで動作するように変更しました。localhost上にあり、必要な出力を得ました。小さなメモ:header()関数を呼び出す前にすべての接続を閉じてくださいバグとは関係ないが、より良い慣行と関係している) –

+0

上記の正確なcopy-> pasteは以前と全く同じ結果を返します。また、サイドノートとして、コメントにコードを投稿するにはどうしたらいいですか? – Cletus

関連する問題