2012-03-05 10 views
0

古典的なPHP mysqlでSQL構文にエラーが発生した場合、そのクエリは他の効果なしには実行されません。しかし、mysqliではPHPスクリプトを致命的なエラーで終了させますPHP mysqliで非オブジェクトエラーをスキップする方法は?

mysql_query("SELECT title, misspelled_column FROM posts"); 

$mysqli->query("SELECT title, misspelled_column FROM posts"); 

最初のケースでは、他のクエリとPHP出力が表示されます。しかし、後者の場合は、問題が偽のクエリによって返さnon-objectに関連している

Fatal error: Call to a member function fetch_assoc() on a non-object 

でスクリプトを殺します。私は

if($result){$row = $result->fetch_assoc();} 

によって、このエラーをスキップすることができますが、私の質問は、なぜ私は古典的なmysqlには、このチェックを必要としなかったということでしょうか?より高度なシステムでは、私たちが持っていたものを見逃すことのない新しい機能が期待されます。

+6

は、エラーを修正します。問題が解決しました。 –

+0

MySQLの構文エラーを処理する必要はありません。これは、開発フェーズで処理する必要があるためです。そして、エラー抑制演算子をそのようなものに使用することは決してありません。 – rdlowrey

+0

エラーメッセージを含めてください。 – kapa

答えて

1

MySQLによって生成されたエラーは、実行を停止してはいけません。実際には、$mysqli->error(例では$mysqliがデータベース接続であると仮定します)を使用して、スクリプトにSQLエラーを表示させることができます。しかし、何が起こっているかは、mysqliエラーにより特定のオブジェクトが作成されなくなり、そのオブジェクトのメソッドを呼び出すと致命的なPHPエラーが発生することです。たとえば:あなたはSQLエラーをしたので、しかし$stmtがnullだったと予想される​​方法を持っていなかったので、

$dbconn = new mysqli("localhost", $username, $password, $dbname); 
$stmt = $dbconn->prepare("bluh"); // not a valid statement. fails to create a mysqli statement object in $stmt. 
echo($dbconn->error); // your script is still running, and this will show your MySQL syntax error. 
$stmt->execute(); 

はこれがない死んでしまいます。誰もが言ったように、ログをチェックして、実際のエラーの内容を確認してください。

エラーを無視するために@を使用すると、特定のコマンドがエラーを作成していることがわかるまで、ヒット・ミスになります。

更新:エラーがクエリに含まれていることがわかっている場合は、クエリを実行する前にクエリが成功したかどうかを確認できます。 1つの方法は、errorパラメータを確認することです。もう1つは、実際にあなたが望むオブジェクトの種類が返されていることを確認することです。ここで

は、両方の例を示します。

$result = $db->query("select firstname, lastname from people where firstname = 'egbert';"); 
if($db->error == '') { 
    // the query worked, so fetch results from $result and do stuff with them. 
} 
else { 
    // the query didn't work, so don't try to do anything with $result 
} 

// alternately: 
if(gettype($result) == "object") { 
    // the query worked. 
} 
else { 
    // it didn't. 
} 
+0

私は間違いを犯しました。彼らはあなたが引用した理由が原因です。 mysqliのno-object出力のために致命的なエラーを回避する方法はわかりません。 – Googlebot

+0

その場合、実際にエラーを出しているコードを投稿するのに役立つでしょう。質問に書いたサンプルコードでは十分ではありません。 – octern

+0

私は質問を非常に基本的な例に編集しました。 – Googlebot

0

私の経験では、SQLエラーはmysqliを強制終了しません。私はあなたが実際に関連する声明でPHPのエラーがあると思う。エラーログを確認してください。

PHPでは、@を使用してエラーを抑制できます。それは悪い考えここにそれを使用するだ。しかし、それがあなたが本当に望むものなら、それはhttp://php.net/manual/en/language.operators.errorcontrol.phpに文書化されています。

+1

それは「通常」ではありませんが、常に悪い考えです。そして、それは明らかにOPが必要なものではありません。 –

+1

通常の「私は質問タイトルを読んだだけで、身体を読んでもらえませんか」と答えました。 「エラーを無視する方法」のキーワードは、自動回答を引き起こします。心配はありません。私はそんなに機能がないので、熱狂者を時代遅れにしているのではないかと思う。 –

+0

@ Col.Shrapnelストーリーは、あなたが言ったようなものではありません。私のPHP設定に文法エラーが原因で致命的なエラーが発生するはずです。私は最近mysqlからmysqliに移行して以来、私は、誰かが私にこれを避けるためにPHPをセットアップするヒントを与えることができるかどうか尋ねました。 – Googlebot

関連する問題