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 的集体天才是怎么想的?

作为对评论的回应,我提供了另一个迷你代码板:

$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

如果table表名只是一个示例(请参阅 bitfox 的回答),那么您的代码没有任何问题。我可以在我的测试服务器上使用相同的代码,并通过将表名更改为我知道存在于我自己的数据库中的表名来获取结果。

然而,最令人不安的是,您指出错误表明mysql_result() expects parameter 1 to be resource, string given- 如果您的 SQL 有错误,则mysql_query返回布尔值 ( docs ),而不是字符串。因此,您要么显示的测试代码与实际使用的测试代码不同,要么向我们提供了不准确的错误消息。

在某些时候,您必须将字符串分配给变量$max_count_action。这是我在发送带有故意问题的查询时得到的结果:Warning: mysql_result() expects parameter 1 to be resource, boolean given- 注意“布尔”,而不是字符串。

所以,我认为你的第一步是选择一个不同的表名。也就是说,如果您使用保留字作为表或列名,您仍然可以通过将字符串括在反引号 (`) 字符中来访问它:

SELECT COUNT(*) FROM `table`

第二步是看看发生了什么$max_count_action将它变成一个字符串。最后,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

您问题中的“表格”是代码中的占位符还是真实姓名?尝试更改您的“表”表的另一个名称,否则我想尝试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 回答
0
$conn = mysql_connect('mysql_server', 'username', 'password');
if (!$conn) {
    die('Connect Error ' . mysql_error());
}

这没关系,但连接和代码不需要分成两行

mysql_select_db('my_database', $conn);

再次,这是值得怀疑的。如果您使用多个数据库,那么在 SQL 中引用数据库比在 PHP 代码中跟踪状态更简单、更安全。

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 回答