クエリはさまざまな理由で失敗する可能性があります。その場合、mysql_*とmysqli拡張機能の両方がfalse
を返します。 それぞれのクエリ関数/メソッドから。そのエラー状態をテストし、それに応じて処理する必要があります。
注 mysql_関数は非推奨です phpバージョン7で削除されました。
$result
を確認してください mysql_fetch_array
に渡す前に 。 false
であることがわかります クエリが失敗したためです。 mysql_query
を参照してください
考えられる戻り値のドキュメントとそれらの処理方法に関する提案。
$username = mysql_real_escape_string($_POST['username']);
$password = $_POST['password'];
$result = mysql_query("SELECT * FROM Users WHERE UserName LIKE '$username'");
if($result === FALSE) {
die(mysql_error()); // TODO: better error handling
}
while($row = mysql_fetch_array($result))
{
echo $row['FirstName'];
}
mysqli拡張機能
手続き型 :
$username = mysqli_real_escape_string($mysqli, $_POST['username']);
$result = mysqli_query($mysqli, "SELECT * FROM Users WHERE UserName LIKE '$username'");
// mysqli_query returns false if something went wrong with the query
if($result === FALSE) {
yourErrorHandler(mysqli_error($mysqli));
}
else {
// as of php 5.4 mysqli_result implements Traversable, so you can use it with foreach
foreach( $result as $row ) {
...
oo-style :
$username = $mysqli->escape_string($_POST['username']);
$result = $mysqli->query("SELECT * FROM Users WHERE UserName LIKE '$username'");
if($result === FALSE) {
yourErrorHandler($mysqli->error); // or $mysqli->error_list
}
else {
// as of php 5.4 mysqli_result implements Traversable, so you can use it with foreach
foreach( $result as $row ) {
...
準備されたステートメントの使用:
$stmt = $mysqli->prepare('SELECT * FROM Users WHERE UserName LIKE ?');
if ( !$stmt ) {
yourErrorHandler($mysqli->error); // or $mysqli->error_list
}
else if ( !$stmt->bind_param('s', $_POST['username']) ) {
yourErrorHandler($stmt->error); // or $stmt->error_list
}
else if ( !$stmt->execute() ) {
yourErrorHandler($stmt->error); // or $stmt->error_list
}
else {
$result = $stmt->get_result();
// as of php 5.4 mysqli_result implements Traversable, so you can use it with foreach
foreach( $result as $row ) {
...
これらの例は、何を示しているだけです。 実行する方法ではなく、実行する必要があります(エラー処理)。本番コードでは、or die
を使用しないでください。
HTMLを出力するとき、そうでない場合は(少なくとも)無効なHTMLを生成します。また、データベースのエラーメッセージは、管理者以外のユーザーには表示しないでください。開示する情報が多すぎます
。