1. ホーム
  2. php

[解決済み] mysql_fetch_array()/mysql_fetch_assoc()/mysql_fetch_row()/mysql_num_rows etc. は、パラメータ 1 がリソースであることを期待する。

2022-03-23 15:15:35

質問

MySQLのテーブルからデータを選択しようとしているのですが、以下のエラーメッセージのいずれかが表示されます。

mysql_fetch_array() expects parameter 1 to be resource, boolean given.

これは私のコードです。

$username = $_POST['username'];
$password = $_POST['password'];

$result = mysql_query('SELECT * FROM Users WHERE UserName LIKE $username');

while($row = mysql_fetch_array($result)) {
    echo $row['FirstName'];
}

解決方法は?

クエリがさまざまな理由で失敗することがありますが、その場合は mysql_* と mysqli 拡張モジュールの両方が以下を返します。 false は、それぞれのクエリ関数/メソッドから返されます。そのようなエラー状態をテストし、それに応じて処理する必要があります。

mysql_* 拡張 :

ノート 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スタイル :

$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が生成されます。また、データベースのエラーメッセージは、管理者でないユーザーには表示しないようにしましょう。 情報公開が多すぎる .