データベース処理に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など)は機能しません。私はすでにホストと話しましたが、私は最新のバージョンにアップグレードしようとしています。
を: \t $をusername = 'gooduser'; \t $ stmt-> bind_param( 's'、$ username); これは、私のOPの最初のシナリオと同じままです。 – Cletus
私は接続パスワード、ホスト、mysqlフィールドを現在のテストテーブルで動作するように変更しました。localhost上にあり、必要な出力を得ました。小さなメモ:header()関数を呼び出す前にすべての接続を閉じてくださいバグとは関係ないが、より良い慣行と関係している) –
上記の正確なcopy-> pasteは以前と全く同じ結果を返します。また、サイドノートとして、コメントにコードを投稿するにはどうしたらいいですか? – Cletus