1

mysql_fetch_rowfalseは、結果がある場合、または行がなくなった場合に配列を返します

しかし、コマンドの実行中に接続関連のエラーが発生した場合、どのような動作が予想されるのでしょうか?

むしろ、私は尋ねるべきです...関数mysql_fetch_rowはデータベース接続を必要としますか?

私のボックスでは、実際に接続 ( mysql_close) を閉じても、行を完全にフェッチできます。ただし、この動作が標準であること、または期待されていることを示すドキュメントは見つかりません。

4

5 に答える 5

2

mysql_error を調べる必要があると思います

http://php.net/manual/en/function.mysql-error.php

mysql_* 関数は廃止されました。PDO または Mysqli の使用を検討する必要があります。

于 2013-03-11T16:33:08.223 に答える
2

「クエリ」機能には次の 2 種類があります。

ここでmysql_query、完全な結果セットを使用すると、クライアントに保存されます。したがって、一度mysql_query返されると、サーバー通信は必要ありません。結果セットのサイズを取得して使用できますmysql_seek。内部的に関数mysql_store_resultが使用され、結果がクライアントでフェッチされている間にサーバーが停止すると、mysql_query呼び出しは失敗します。ただし、結果セットがクライアントに完全に格納されてmysql_fetch_rowいれば、フェッチ中にサーバーが停止しても失敗しません。

を使用mysql_unbuffered_queryする場合、 への有効なリンクが必要です。これは、結果セットがクライアントに保存されないためです。代わりに、 を呼び出すと各行がフェッチされますmysql_fetch_row。そのため、リンクが「死ぬ」場合、次の呼び出しmysql_fetch_rowは失敗します。C 関数mysql_use_resultは「バッファなし」呼び出しで使用されます。

これをテストするための単純な PHP スクリプトを作成しました(大きすぎて貼り付けられません)。

mysql_fetch_rowmysql C-Libraryの -function のマニュアルを引用するには:

結果セットの次の行を取得します。mysql_store_result() の後に使用すると、取得する行がそれ以上ない場合、mysql_fetch_row() は NULL を返します。mysql_use_result() の後に使用すると、取得する行がそれ以上ない場合、またはエラーが発生した場合、mysql_fetch_row() は NULL を返します。

これは暗黙的に述べています:

  • mysql_store_result(バッファリングされた通常のクエリ) が使用される場合mysql_fetch_row、フェッチする行がそれ以上ない場合は null のみを返します。
  • mysql_use_result(バッファリングされていないクエリ) が使用されている場合、それ以上行がない場合、またはサーバーから次の行をフェッチする際にエラーが発生した場合mysql_fetch_rowは、null を返します。

プラットフォーム固有の動作については言及されていないため、これはすべてのプラットフォームに当てはまると思います。もちろん、これらの関数のソース コードを調べて確認する必要があります。

エラーが発生した場合の動作について: PHP 側mysql_fetch_resultでは、バッファリングされていない結果セットのフェッチが失敗した場合 (または行がなくなった場合) に false が返されます。関数はmysql_*例外をスローしませんが、失敗した場合は警告が発せられます - 私のスクリプトではWarning: mysql_fetch_row(): 8 is not a valid MySQL result resource in .... したがって、エラーを確認したい場合は、次のようにする必要があります。

while($row = mysql_fetch_row($result)) {
   // do stuff
}

if(mysql_errno($dbhandle) !== 0) {
    echo "there was an error: ", mysql_error($dbhandle), PHP_EOL;
}

本当に防御的なコードを書きたい場合は、使用しているクエリ関数に関係なく、それを行う必要があります。

ところで、mysql 接続が で閉じられている場合、この防御コードは機能しません。これはmysql_close、ハンドルが閉じられ、mysql_errnofalse が返されるためです (さらに、警告が発行されます)。

于 2013-03-11T18:02:08.963 に答える
0

接続エラーなどを本当にチェックする必要がある場合は、 mysql_errnoを使用してください。MySQLi または PDO に移行する

于 2013-03-11T16:34:34.867 に答える
0

mysql_fetch_row() は、エラーがある場合にエラーを返す mysql_query() を呼び出します。

于 2013-03-11T16:35:27.313 に答える
0

mysql_queryの戻り値と の戻り値を区別する必要がありmysql_fetch_rowます。接続関連のエラーを確認したい場合は、最初に戻り値を確認します

$result = mysql_query(...) or die(mysql_error());

結果セットの終わりをチェックする場合は、の戻り値をチェックしますmysql_fetch_row

于 2013-03-11T16:49:20.493 に答える