web-dev-qa-db-ja.com

mysql_fetch_array()/ mysql_fetch_assoc()/ mysql_fetch_row()/ mysql_num_rowsなど...パラメータ1がリソースまたは結果であると想定しています

MySQLテーブルからデータを選択しようとしていますが、以下のエラーメッセージのうちの1つを受け取ります。

mysql_fetch_array()はパラメータ1がリソースであることを期待します。

または

mysqli_fetch_array()はパラメータ1がmysqli_resultであることを想定しています。

または

ブール値/非オブジェクトでメンバ関数fetch_array()を呼び出します

これは私のコードです:

$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'];
}

同じことが次のようなコードにも当てはまります。

$result = mysqli_query($mysqli, 'SELECT ...');
// mysqli_fetch_array() expects parameter 1 to be mysqli_result, boolean given
while( $row=mysqli_fetch_array($result) ) {
    ...

そして

$result = $mysqli->query($mysqli, 'SELECT ...');
// Call to a member function fetch_assoc() on a non-object
while( $row=$result->fetch_assoc($result) ) {
    ...

そして

$result = $pdo->query('SELECT ...', PDO::FETCH_ASSOC);
// Invalid argument supplied for foreach()
foreach( $result as $row ) {
    ...

そして

$stmt = $mysqli->prepare('SELECT ...');
// Call to a member function bind_param() on a non-object
$stmt->bind_param(...);

そして

$stmt = $pdo->prepare('SELECT ...');
// Call to a member function bindParam() on a non-object
$stmt->bindParam(...);
923
iamjonesy

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

mysql_ *拡張

NOTEmysql_関数は非推奨 であり、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 extension
手続き型

$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 ) {
      ...

これらの例は、whatの実行方法(エラー処理)のみを示しており、実行方法は示していません。実動コードは、HTMLを出力するときに or die を使用しないでください。そうしないと、(少なくとも)無効なHTMLが生成されます。また、データベースエラーメッセージは、管理者以外のユーザーには表示されません。これは 情報が多すぎる であるためです。

654
Edward Dale

このエラーメッセージは、クエリに失敗した原因となるエラーがあるときに表示されます。それを使うとき、それはそれ自身を明示するでしょう:

  • mysql_fetch_array/mysqli_fetch_array()
  • mysql_fetch_assoc()/mysqli_fetch_assoc()
  • mysql_num_rows()/mysqli_num_rows()

:このエラーは、クエリの影響を受ける行がない場合にnotが表示されることを意味します。無効な構文を持つクエリのみがこのエラーを生成します。

トラブルシューティングの手順

  • 開発サーバーがすべてのエラーを表示するように設定されていることを確認してください。これをファイルの先頭または設定ファイルの error_reporting(-1); に配置することでこれを行うことができます。構文エラーがある場合は、それが指摘されます。

  • mysql_error() を使用してください。 mysql_error()はMySQLがあなたの問い合わせを実行している間に遭遇したどんなエラーでも報告するでしょう。

    使用例

    mysql_connect($Host, $username, $password) or die("cannot connect"); 
    mysql_select_db($db_name) or die("cannot select DB");
    
    $sql = "SELECT * FROM table_name";
    $result = mysql_query($sql);
    
    if (false === $result) {
        echo mysql_error();
    }
    
  • MySQLのコマンドラインまたは phpMyAdmin のようなツールからクエリを実行します。クエリに構文エラーがある場合、これはそれが何であるかを教えてくれます。

  • あなたの引用符が正しいことを確認してください。クエリまたは値の前後に引用符がないと、クエリが失敗する可能性があります。

  • あなたがあなたの価値を逃れていることを確認してください。クエリに引用符を付けると、クエリが失敗する可能性があります(また、SQLインジェクションを受け入れる可能性があります)。入力をエスケープするには mysql_real_escape_string() を使用してください。

  • mysqli_*関数とmysql_*関数が混在していないことを確認してください。それらは同じものではなく、一緒に使用することはできません。 (mysqli_*でどちらかのスティックを選ぶつもりなら。なぜなら以下を見てください。)

その他のヒント

mysql_*関数は新しいコードには使用しないでください。それらはもはや維持されておらず、コミュニティは 廃止予定プロセスを始めました 。代わりに prepared statement を学び、 _ pdo _ または MySQLi のいずれかを使用してください。あなたが決めることができないならば、 この記事 は選ぶのを手伝うでしょう。もしあなたが学びたいのであれば、これは 良いPDOチュートリアル です。

163
John Conde

ここで発生したエラーは一重引用符(')の使用によるものです。あなたはこのようにあなたの質問を置くことができます:

mysql_query("
SELECT * FROM Users 
WHERE UserName 
LIKE '".mysql_real_escape_string ($username)."'
");

SQLインジェクションを防ぐためにmysql_real_escape_stringを使用しています。ただし、PHPのアップグレード版(PHP 5.5.0以降)にはMySQLiまたはPDO_MYSQL拡張機能を使用する必要がありますが、古いバージョンの場合はmysql_real_escape_stringがうまくいきます。

110
nik

scompt.com 説明 のように、クエリは失敗する可能性があります。このコードを使用して、クエリのエラーまたは正しい結果を取得します。

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

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

if($result)
{
    while($row = mysql_fetch_array($result))
    {
        echo $row['FirstName'];
    }
} else {
    echo 'Invalid query: ' . mysql_error() . "\n";
    echo 'Whole query: ' . $query; 
}

詳しくは mysql_query() を参照してください。

実際のエラーは一重引用符であるため、変数$usernameは解析されませんでした。しかし、SQLインジェクションを避けるために本当にmysql_real_escape_string($username)を使うべきです。

60
2ndkauboy

$usernameを引用符で囲みます。数値ではなく、文字列値は引用符で囲む必要があります。

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

また、ワイルドカードを使用していない場合はLIKE条件を使用しても意味がありません。完全一致が必要な場合は、LIKEではなく=を使用してください。

54
Matteo Riva

データベースが選択されていない場合があるため、選択されたデータベースが選択されていないことを確認してください。

チェック

mysql_select_db('database name ')or DIE('Database name is not available!');

mySQLクエリの前に次のステップに進む

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

f($result === FALSE) {
    die(mysql_error());
44
yasin

あなたのコードはこのようなものであるべきです

$username = $_POST['username'];
$password = $_POST['password'];
$query = "SELECT * FROM Users WHERE UserName LIKE '$username'";
echo $query;
$result = mysql_query($query);

if($result === FALSE) {
    die(mysql_error("error message for the user")); 
}

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

それが終わったら、クエリが画面に表示されるでしょう。サーバーでこのクエリを試して、目的の結果が得られるかどうか確認してください。ほとんどの場合、エラーはクエリにあります。残りのコードは正しいです。

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

一重引用符を使用して文字列を定義すると、PHPは一重引用符で区切られた文字列を解析しません。可変補間を得るためには、二重引用符OR文字列連結(またはその組み合わせ)を使用する必要があります。詳細は http://php.net/manual/en/language.types.string.php を参照してください。

また、mysql_queryが有効な結果リソースを返したことを確認する必要があります。そうしないと、fetch_ *、num_rowsなどが結果として機能しません。 IE:

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

if( $result === FALSE ) {
   trigger_error('Query failed returning error: '. mysql_error(),E_USER_ERROR);
} else {
   while( $row = mysql_fetch_array($result) ) {
      echo $row['username'];
   }
}

http://us.php.net/manual/en/function.mysql-query.php 詳細については/。

36
derokorian

このクエリは動作するはずです:

$result = mysql_query("SELECT * FROM Users WHERE UserName LIKE '%$username%'");
while($row = mysql_fetch_array($result))
{
    echo $row['FirstName'];
}

問題は一重引用符であるため、クエリは失敗してFALSEを返し、WHILEループは実行できません。 %を使用すると、文字列を含む結果(SomeText- $ username-SomeTextなど)を照合できます。

これは単にあなたの質問に対する答えです、他の投稿で言及されているものを実装する必要があります:エラー処理、エスケープ文字列の使用(ユーザーはフィールドに何でも入力でき、任意のコードではないことを確認する必要があります)、使用 PDO 代わりにmysql_connectが廃止されました。

35
Enis P. Aginić
$username = $_POST['username'];
$password = $_POST['password'];
$result = mysql_query("SELECT * FROM Users WHERE UserName LIKE '%$username%'") or die(mysql_error());

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

クエリを@mysql_query(your query);として抑制することがあります

30
Dip Pokhrel

ここですべてを試してもうまくいかない場合は、MySQLデータベースの照合順序を確認してください。鉱山はスウェーデンの照合に設定されました。それから私はそれをutf8_general_ciに変えました、そして、すべてはただギアにクリックしました。

これが誰かに役立つことを願っています。

28
kolexinfos
$query = "SELECT Name,Mobile,Website,Rating FROM grand_table order by 4";

while( $data = mysql_fetch_array($query))
{
    echo("<tr><td>$data[0]</td><td>$data[1]</td><td>$data[2]</td><td>$data[3]</td></tr>");      
}

WHEREクエリを使用する代わりに、このORDER BYクエリを使用できます。これはクエリを使用するためにこれよりはるかに優れています。

このクエリを実行したところ、parameterやbooleanなどのエラーは発生していません。

26
Gears.of.Codes

これを試してください、それは仕事でなければなりません、そうでなければあなたの問題を特定するためにエラーをプリントする必要があります

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

$sql = "SELECT * from Users WHERE UserName LIKE '$username'";
$result = mysql_query($sql,$con);

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

次のコードを試してください。それはうまくいくかもしれません。

$username = $_POST['username'];
$password = $_POST['password'];
$result = mysql_query("SELECT * FROM Users WHERE UserName ='$username'");

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

2つの理由が考えられます。

  1. Mysql_query関数を呼び出す前にデータベースへの接続を開いたことがありますか?私はあなたのコードではそれを見ません。クエリを実行する前にmysql_connectを使用してください。 php.net/manual/en/function.mysql-connect.phpを参照してください

  2. 変数 $ username は単一引用符で囲まれて使用されるため、その値はクエリ内では評価されません。クエリは間違いなく失敗します。

第三に、クエリの構造は SQLインジェクション を受けやすいです。このセキュリティ上の脅威を回避するために、準備文を使用することができます。

21
asim-ishaq

あなたのconfig.phpに行きなさい。私は同じ問題を抱えていました。ユーザー名とパスワードを確認します。また、sql selectもconfigと同じ名前です。

16
user2835116
<?php
    $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_query("SELECT * FROM Users WHERE UserName ='".$username."'");
16
Janak Prajapati

廃止されたmysql *関数を使用しないでください(php 5.5で廃止予定のphp 7では削除されます)。 mysqli または pdo でこれを作ることができます。

これが完全な選択クエリです。

<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDB";

// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
} 

$sql = "SELECT id, firstname, lastname FROM MyGuests";
$result = $conn->query($sql);

if ($result->num_rows > 0) {
    // output data of each row
    while($row = $result->fetch_assoc()) {
        // code here 
    }
} else {
    echo "0 results";
}
$conn->close();
?>
15
Manoj Kumar

MySQLクエリの前に接続文字列変数を含めます。たとえば、次のコードの$conntは、

$results = mysql_query($connt, "SELECT * FROM users");
15
Durairaj

これを試して

$username = $_POST['username'];
$password = $_POST['password'];
$result = mysqli_query('SELECT * FROM Users WHERE UserName LIKE $username');

if($result){
while($row = mysqli_fetch_array($result))
{
    echo $row['FirstName'];
}
}
13
Suresh Ratten

いつでもあなたは...

"警告:mysqli_fetch_object()はパラメータ1がmysqli_resultであることを想定しています。ブール値が与えられます"

...おそらくクエリに問題があるためです。 prepare()またはquery()FALSE(ブール値)を返す可能性がありますが、この一般的な失敗メッセージは手がかりをあまり邪魔しません。クエリの何が問題なのか、どうやって見つけますか?あなた お願い

まず最初に、エラー報告が有効になっていて表示されていることを確認してください:<?phpタグを開いた直後に、ファイルの先頭に次の2行を追加してください。

error_reporting(E_ALL);
ini_set('display_errors', 1);

エラー報告がphp.iniに設定されている場合は、これを心配する必要はありません。エラーを適切に処理し、問題の真の原因をユーザーに明らかにしないようにしてください。あなたのサイトやサーバーに害を与えたいと思っている人たちのために、公衆に本当の原因を明らかにすることは金の彫り込まれた招待状になることができます。エラーをブラウザに送信したくない場合は、Webサーバーのエラーログをいつでも監視できます。ログの場所はサーバーによって異なります。例えば、Ubuntuではエラーログは通常/var/log/Apache2/error.logにあります。 Linux環境でエラーログを調べる場合は、コンソールウィンドウでtail -f /path/to/logを使用して、リアルタイムでエラーが発生したとき、またはエラーを発生させたときにエラーを確認できます。

標準的なエラー報告について二乗したら、データベース接続とクエリにエラーチェックを追加することで、発生している問題についてより詳細な情報を得ることができます。この例で、列名が正しくないことを確認してください。まず、一般的な致命的エラーメッセージを返すコード:

$sql = "SELECT `foo` FROM `weird_words` WHERE `definition` = ?";
$query = $mysqli->prepare($sql)); // assuming $mysqli is the connection
$query->bind_param('s', $definition);
$query->execute();

このエラーは一般的なものであり、何が起こっているのかを解決するのに役立ちません。

2〜3行のコードで、問題を解決するために使用できる非常に詳細な情報を得ることができます すぐに prepare()ステートメントの真実性をチェックし、それが良ければ、バインドと実行に進むことができます。

$sql = "SELECT `foo` FROM `weird_words` WHERE `definition` = ?";
if($query = $mysqli->prepare($sql)) { // assuming $mysqli is the connection
    $query->bind_param('s', $definition);
    $query->execute();
    // any additional code you need would go here.
} else {
    $error = $mysqli->errno . ' ' . $mysqli->error;
    echo $error; // 1054 Unknown column 'foo' in 'field list'
}

問題がある場合は、エラーメッセージを表示して直接問題を解決することができます。この場合、テーブルにfooカラムがないので、問題を解決するのは簡単です。

選択した場合は、このチェックを関数またはクラスに組み込み、前述のようにエラーを適切に処理することによってそれを拡張することができます。

11
Jay Blanchard

まず、データベースへの接続を確認してください。正常に接続されたかどうか

それが終わったら、それからその後私はこのコードを書いた、そしてそれはうまく機能する:

if (isset($_GET['q1mrks']) && isset($_GET['marks']) && isset($_GET['qt1'])) {
    $Q1mrks = $_GET['q1mrks'];
    $marks = $_GET['marks'];
    $qt1 = $_GET['qt1'];

    $qtype_qry = mysql_query("
        SELECT *
        FROM s_questiontypes
        WHERE quetype_id = '$qt1'
    ");
    $row = mysql_fetch_assoc($qtype_qry);
    $qcode = $row['quetype_code'];

    $sq_qry = "
        SELECT *
        FROM s_question
        WHERE quetype_code = '$qcode'
        ORDER BY Rand() LIMIT $Q1mrks
    ";
    $sq_qry = mysql_query("
        SELECT *
        FROM s_question
        WHERE quetype_code = '$qcode'
        LIMIT $Q1mrks
    ");
    while ($qrow = mysql_fetch_array($sq_qry)) {
        $qm = $qrow['marks'] . "<br />";
        $total += $qm . "<br />";
    }
    echo $total . "/" . $marks;
}
11
user2155518
<?php
      $username = $_POST['username'];
       $password = $_POST['password'];

     $result = mysql_query("SELECT * FROM Users WHERE UserName LIKE '".mysql_real_escape_string($username)."'")or die(mysql_error());
while($row=mysql_fetch_array($result))
  {
 echo $row['FirstName'];
 }
 ?>
11
Dennis Kiptugen

クエリを実行する前に、db_close()を使用してデータベースを閉じていないことを確認してください。

クエリやデータベース接続を含む他のページを含めても、1つのスクリプトで複数のクエリを使用している場合は、db_close()を使用してデータベース接続を閉じる可能性があります。スクリプトでこの間違いをしないでください。

10
A.Aleem11

まず接続を確認してください。

データベースから正確な値を取得したい場合は、次のように書きます。

$username = $_POST['username'];
$password = $_POST['password'];
$result = mysql_query("SELECT * FROM Users WHERE UserName =`$usernam`");

あるいはLIKE型の値を取得したい場合は、次のように書く必要があります。

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

チェック中にMySQLエラーが表示されない場合は、データベーステーブルを正しく作成したことを確認してください。これは私に起こりました。不要なコンマまたは引用符を探します。

9
user1012181

フェッチ配列を実行する前に、$resultが失敗しているかどうかも確認できます。

$username = $_POST['username'];
$password = $_POST['password'];
$result = mysql_query('SELECT * FROM Users WHERE UserName LIKE $username');
if(!$result)
{
     echo "error executing query: "+mysql_error(); 
}else{
       while($row = mysql_fetch_array($result))
       {
         echo $row['FirstName'];
       }
}
8
user28864

あなたはこのコードを試すことができます。私はあなたの問題に似た問題に遭遇したときに私は早くそれを見つけました。

if (isset($_GET['q1mrks']) && isset($_GET['marks']) && isset($_GET['qt1'])) {
$Q1mrks = $_GET['q1mrks'];
$marks = $_GET['marks'];
$qt1 = $_GET['qt1'];

$qtype_qry = mysql_query("
    SELECT *
    FROM s_questiontypes
    WHERE quetype_id = '$qt1'
");
$row = mysql_fetch_assoc($qtype_qry);
$qcode = $row['quetype_code'];

$sq_qry = "
    SELECT *
    FROM s_question
    WHERE quetype_code = '$qcode'
    ORDER BY Rand() LIMIT $Q1mrks
";
$sq_qry = mysql_query("
    SELECT *
    FROM s_question
    WHERE quetype_code = '$qcode'
    LIMIT $Q1mrks
");
while ($qrow = mysql_fetch_array($sq_qry)) {
    $qm = $qrow['marks'] . "<br />";
    $total += $qm . "<br />";
}
echo $total . "/" . $marks;
}
7
Mithun Debnath

通常、データベースの接続性が失敗するとエラーが発生します。データベースに接続するか、データベースファイルを含めるようにしてください。

include_once(db_connetc.php');

OR

// Create a connection
$connection = mysql_connect("localhost", "root", "") or die(mysql_error());

//Select database
mysql_select_db("db_name", $connection) or die(mysql_error());

$employee_query = "SELECT * FROM employee WHERE `id` ='".$_POST['id']."'";

$employee_data = mysql_query($employee_query);

if (mysql_num_rows($employee_data) > 0) {

    while ($row = mysql_fetch_array($employee_data)){
        echo $row['emp_name'];
    } // end of while loop
} // end of if
  • ベストプラクティスは、sqlyogでクエリを実行してからページコードにコピーすることです。
  • クエリを常に変数に格納してから、その変数をエコーし​​ます。それからmysql_query($query_variable);に渡します。
6
Engr Zardari

このコードを試してください。

post変数を変数に代入します

   $username = $_POST['uname'];

   $password = $_POST['pass'];

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

if(!empty($result)){

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

$ usernameはphp変数なのでmysqliに文字列として渡す必要があります。クエリuでは一重引用符で始めますので、二重引用符、一重引用符、および連結の目的でフルストップを使用します( "'。$ username。二重引用符で始めた場合は、引用符を逆にします( '"。$ username。"')。

$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'];
     }

$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の使用は多くの価値を低下させています。代わりにPDOを使用してください。簡単ですが非常に安全です。

3
Dennis Kiptugen

伝統的にPHPはコードの悪い習慣や失敗に寛容であり、デバッグをかなり困難にします。この特定の場合の問題は、 mysqli _ pdo _ の両方が、デフォルトでは問い合わせに失敗したときにFALSEを返すだけであることを教えてくれないことです。 (私は mysql extentionについては説明しません。 prepared statement のサポートは、 _ pdo _ または mysqli のいずれかに切り替えるのは当然のことです。) PHPのデフォルトの振る舞いは常に 例外を投げる クエリが失敗したときに/ /.

_ pdo _ の場合:$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);を使用

error_reporting(E_ALL);

$pdo = new PDO("mysql:Host=localhost;dbname=test", "test","");
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$result = $pdo->query('select emal from users');
$data = $result->fetchAll();

これにより、次のことがわかります。

致命的なエラー:メッセージ 'SQLSTATE [42S22]の例外' PDOException 'が見つかりませんでした:列8が見つかりません:1054 E:\ htdocs\test\mysql_errors\pdo.phpの'フィールドリスト 'に不明な列' emal '

PDOException:SQLSTATE [42S22]:列が見つかりません:1054行8のE:\ htdocs\test\mysql_errors\pdo.phpの 'フィールドリスト'に不明な列 'emal'があります

見ての通り、それは正確に、クエリの何が問題なのか、そしてあなたのコードのどこでそれを直すべきかを教えてくれます。

$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);なしであなたは得るでしょう

致命的なエラー:9行目のE:\ htdocs\test\mysql_errors\pdo.phpにあるブール値のメンバー関数fetchAll()を呼び出します

mysqli の場合:mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);を使用

error_reporting(E_ALL);

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli('localhost', 'test', '', 'test');

$result = $mysqli->query('select emal from users');
$data = $result->fetch_all();

あなたが得るでしょう

致命的なエラー:8行目のE:\ htdocs\test\mysql_errors\mysqli.phpの 'フィールドリスト'に '不明な列' emal 'というメッセージが表示され、例外' mysqli_sql_exception 'が見つかりませんでした

mysqli_sql_exception:E:\ htdocs\test\mysql_errors\mysqli.phpの8行目にある 'field list'の不明な列 'emal'

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);なしであなたが得るだけ

致命的なエラー:10行目のE:\ htdocs\test\mysql_errors\mysqli.phpにあるブール値のメンバ関数fetch_all()を呼び出します

もちろん、MySQLのエラーを手動で確認することもできます。しかし、データベースにクエリを実行するたびにタイプミスをするたびに(またはさらに悪いことに)それを行わなければならないとしたら、私は頭がおかしくなります。

0
Paul Spiegel