1

私はすべて StackExchange を行き来し、インターネットの豊富な小規模サイトの多くで、コードが機能しない正当な理由を探していましたが、これには困惑しました。特定の MySQL テーブルの行の総数を表示し、そのカウントを変数として設定して、後でスクリプトで使用したいと考えています。以下を実行すると、スクリプトが停止し、PHP の警告が表示され、mysql_result() はパラメーター 1 がリソースであり、文字列が指定されていることを期待していることを伝えます。

$conn = mysql_connect('mysql_server', 'username', 'password');
if (!$conn) {
    die('Connect Error ' . mysql_error());
}
mysql_select_db('my_database', $conn);
if (!mysql_select_db('my_database')) {
    die('Could not select database: ' . mysql_error());
}
$max_count_query = ("SELECT COUNT(*) FROM table");
// Perform Query
$max_count_action = mysql_query($max_count_query);
$mcount = mysql_result($max_count_action, 0, 0);
printf("\nNumber of Records to Process: ", $mcount);

StackOverflow の集合的な天才は何を考えていますか?

コメントに応えて、提供するコードのミニスラブがもう 1 つあります。

$conn = mysql_connect('127.0.0.1', 'username', 'password');
if (!$conn) {
    die('Connect Error ' . mysql_error());
}
mysql_select_db('my_database', $conn);
if (!mysql_select_db('my_database')) {
    die('Could not select database: ' . mysql_error());
}
$max_count_query = ("SELECT COUNT(*) FROM directory_nap");
// Perform Query
$max_count_action = mysql_query($max_count_query);
if (!$max_count_action){
    die('mysql query error: ' . mysql_error());
    }
$mcount = mysql_result($max_count_action, 0, 0);
if (!$mcount){
    die('mysql result error: ' . mysql_error());
    }
printf("\nNumber of Records to Process: ", $mcount);
4

5 に答える 5

4

テーブル名が単なるサンプルである場合 ( bitfoxtableによる回答を参照)、コードに問題はありません。テストサーバーで同じコードを使用し、テーブル名を自分のデータベースに存在することがわかっている名前に変更することで結果を取得できます。

ただし、最も厄介なのは、エラーが示すことですmysql_result() expects parameter 1 to be resource, string given。SQL にエラーがある場合は、文字列ではなくブール値 ( docsmysql_query ) を返します。したがって、実際に使用しているのと同じテスト コードが表示されていないか、不正確なエラー メッセージが表示されています。

ある時点で、変数に文字列を割り当てる必要$max_count_actionがあります。意図的な問題を含むクエリを送信すると、次のようになります。Warning: mysql_result() expects parameter 1 to be resource, boolean given-- 文字列ではなく「ブール値」に注意してください。

したがって、最初のステップは別のテーブル名を選択することだと思います。つまり、予約語をテーブルまたは列の名前として使用している場合でも、文字列をバッククォート (`) 文字で囲むことでアクセスできます。

SELECT COUNT(*) FROM `table`

$max_count_action2 番目のステップは、文字列に変換するために何が起こっているかを確認することです。最後に、一貫してデバッグに使用します。ただし、製品コードmysql_errorよりも少し良いことを行うことをお勧めします。die

// working code on my test server
$max_count_query = ("SELECT COUNT(*) FROM users");
$max_count_action = mysql_query($max_count_query);
$mcount = $max_count_action ? mysql_result($max_count_action, 0) : 'Error: '.mysql_error();
print "\nNumber of Records to Process: ". $mcount;
于 2012-05-24T22:57:49.920 に答える
1

エラーがここにある可能性が非常に高いです:

SELECT COUNT(*) FROM table

table」は SQL 言語の予約語です。変更する必要があります。

于 2012-05-24T22:42:57.967 に答える
1

この問題の原因はコード サンプルからは明らかではありませんが (間違ったテーブル名、クエリ文字列を囲む括弧などである可能性があります)、いくつかの不正確な点があります。次のコードを試すことができます。少なくともいくつかの副次的なバグが修正され、エラーの詳細が表示されます。

$conn = mysql_connect('mysql_server', 'username', 'password');
if ($conn === false) {
    die('Connect Error ' . mysql_error($conn));
}
if (mysql_select_db('my_database', $conn) === false) {
    die('Could not select database: ' . mysql_error($conn));
}
$max_count_query = "SELECT COUNT(*) FROM table";
// Perform Query
$max_count_action = mysql_query($max_count_query, $conn);
if($max_count_action === false) {
    die('Query error ' . mysql_error($conn));
}
$mcount = mysql_result($max_count_action, 0, 0);
if($mcount === false) {
    die('Result retrieval error ' . mysql_error($conn));
}
printf("\nNumber of Records to Process: %s", $mcount);
mysql_free_result($max_count_action);

これが役立つことを願っています、さようなら!

于 2012-05-24T22:48:35.863 に答える
0
$conn = mysql_connect('mysql_server', 'username', 'password');
if (!$conn) {
    die('Connect Error ' . mysql_error());
}

これは問題ありませんが、connect と coditional を 2 行に分割する必要はありません

mysql_select_db('my_database', $conn);

繰り返しますが、これは疑問です。複数のデータベースを使用している場合、PHP コード内で状態を追跡するよりも、SQL でデータベースを参照する方がはるかに簡単で安全です。

if (!mysql_select_db('my_database')) {
   die('Could not select database: ' . mysql_error());
}

あなたはすでにそれをしていませんか?

$max_count_query = ("SELECT COUNT(*) FROM table");

なぜ括弧?

// Perform Query

それはコードから明らかではありませんか?

$max_count_action = mysql_query($max_count_query);
$mcount = mysql_result($max_count_action, 0, 0);

db ハンドルを mysql_query 呼び出しに渡す方が適切です。

接続後にエラーをチェックし、データベースを切り替えた後にエラーをチェックしましたが、 mysql_query() の後にエラーをチェックしませんでしたか?

printf("\nNumber of Records to Process: ", $mcount);

mcount 引数のフォーマット文字列にプレースホルダーはありません。試してください:

printf("\nNumber of Records to Process: %d", $mcount);

PHP の警告が表示され、mysql_result() はパラメーター 1 がリソースであり、指定された文字列であると想定されていることがわかります。

あなたが実行しているコードは、あなたが私たちに示したコードではありません。mysql_query() は文字列を返しません。

于 2012-05-24T22:58:27.157 に答える
0

質問の「テーブル」はプレースホルダーですか、それともコード内の本名ですか? mysql_fetch_array「テーブル」テーブルの別の名前を変更してみてください。そうでない場合は、代わりに試してみたいと思いますmysql_result

$max_count_query = "SELECT COUNT(*) FROM t";
// Perform Query
$max_count_action = mysql_query($max_count_query) or die (mysql_error());
$mcount = mysql_fetch_array($max_count_action);
printf("\nNumber of Records to Process: ", $mcount[0]);
于 2012-05-24T22:48:16.210 に答える