Php 为什么mysql_query()使用SELECT语句返回TRUE?
根据的手册以及我所知道的关于此函数的所有信息,我使用了很多次,如果查询是Php 为什么mysql_query()使用SELECT语句返回TRUE?,php,mysql,Php,Mysql,根据的手册以及我所知道的关于此函数的所有信息,我使用了很多次,如果查询是SELECT,它可以返回资源或FALSE。但它会不时返回TRUE 这怎么可能?这以前从未发生过。这是PHP5.3.2中的错误吗?有人知道这件事吗 代码类似于: if (!$resource = mysql_query($query, $handle)) { throw some exception; } var_dump($query); if ($resource === true && strp
SELECT
,它可以返回资源或FALSE
。但它会不时返回TRUE
这怎么可能?这以前从未发生过。这是PHP5.3.2中的错误吗?有人知道这件事吗
代码类似于:
if (!$resource = mysql_query($query, $handle)) {
throw some exception;
}
var_dump($query);
if ($resource === true && strpos($query, 'SELECT') !== false) {
throw new Exception('mysql_query() returned TRUE for SELECT');
}
这也很难复制。这只是偶尔发生的事。我还注意到,这很可能是在服务器突然中断连接的同时发生的,在这种情况下,它应该返回
FALSE
..对于SELECT、SHOW、description、EXPLAIN
和其他返回resultset的语句,mysql\u query()成功时返回资源,错误时返回FALSE
对于其他类型的SQL语句,INSERT、UPDATE、DELETE、DROP
等,mysql\u query()
成功返回TRUE
,错误返回FALSE
(来自)
你说选择返回布尔值为真?不仅仅是一个不是零的资源:)?当你说它“返回TRUE”时,你如何测试它?你不会做这种事吧
$result = mysql_query($sql);
if ($result == TRUE) { /* stuff */ }
如果是这样,请记住,返回的所有非零、非空、非空值的计算结果都将为TRUE。您可以使用更严格的:
if ($result === TRUE) { /* stuff */ }
这不仅评估等价性,还评估类型。您是否正在执行类似var_导出($result)的操作;要检查数据类型并验证您是否实际返回了布尔值TRUE?James试图说的是,如果查询被正确执行,函数mysql\u query()只会返回TRUE。这与查询产生的结果无关
如果您想实际获取结果,请使用mysql\u fetch\u assoc()/mysql\u fetch\u array()/mysql\u results()。让我们从另一个角度来看,当返回
FALSE
时,这意味着无论出于何种原因,尝试查询失败。这意味着,即使在开始查询之前,您的查询出现了一些错误,例如,对数据库没有任何影响,或者查询甚至无法到达可以看到数据库的点。如果webbiedave没有走上正确的轨道,php源代码中只有一个代码路径允许出现这种情况:
#if MYSQL_VERSION_ID < 32224
#define PHP_MYSQL_VALID_RESULT(mysql) \
(mysql_num_fields(mysql)>0)
#else
#define PHP_MYSQL_VALID_RESULT(mysql) \
(mysql_field_count(mysql)>0)
#endif
您没有提到数据长度,但您应该检查是否有超过
max\u allowed\u数据包的调用
当MySQL客户端或mysqld
服务器接收的数据包大于
允许的最大数据包字节数,它发出
数据包太大错误并关闭
连接。对于某些客户,您可以
也会丢失到MySQL的连接
如果
通信数据包太大。
[……]
客户端和服务器都具有
他们自己的最大允许包变量,
所以如果你想处理大数据包,
必须同时增加此变量
在客户端和服务器中
不确定mysql_查询返回值是如何受此影响的,但值得研究。在my.cnf中设置它以查看它是否解决了问题是最好的开始。mysql\u查询不会返回FALSE,更不用说TRUE了。它返回一个资源id,如果该id等于零,则con将被视为FALSE。我的示例是演示布尔结果
$resource = mysql_query($query, $handle);
if (!$resource) throw some exception;
if (!$resource && strpos($query, 'SELECT')) {
throw new Exception('mysql_query() returned TRUE for SELECT');
}
您确定正在处理的查询返回true吗?As true仅适用于insert update或delete。我会检查并确保您没有看到前一条语句中的变量结转。您是如何得出返回TRUE的结论的?显示您认为发生这种情况的代码段。添加了一个代码段。var\u dump()
清楚地显示了一个正常的SELECT
查询,我在一个正常的MySQL客户端中运行该查询,结果正常。如果在该查询之前显式地将$resource
设置为-1,您仍然可以重现它吗?我想知道在服务器被中断的情况下,值是实际更改了还是没有更新。@James,好主意。错误是:在查询过程中与MySQL服务器失去连接。
。但是,如果发生这种情况,手册会声明(一直都是这种情况)mysql\u query()
将返回FALSE
,而不是TRUE
。。。然而,它确实证实了这样一种怀疑,即如果服务器突然断开连接,就会发生这种奇怪的行为……这并不能解释为什么它的select返回trueYes,它是TRUE
。再次用==
检查选民的古怪。抄袭OP已经知道的内容的手册并不能回答这个问题。我不能确定,但我不记得在回答问题时读过“仅在选择语句中”部分,而且肯定是从那时起编辑的。无论如何,对于当前的问题文本来说,这似乎是一个无用的答案。是的,这是预期的行为。但是,mysql\u query()
返回TRUE
,而不是FALSE
@Radu,别忘了,$resource=mysql\u query($query,$handle)
等于TRUE
如果mysql\u query返回FALSE
。mysql\u query()可以返回FALSE并修改数据库。如果您将数据插入MyISAM表,并在插入几行后出现错误(重复唯一键等),mysql_query()将返回false(和一个错误),但这些行仍保留在表中。确实值得研究。如何找出PHP客户端的max\u allowed\u数据包是什么?这显然不是服务器上的东西,因为查询非常短。我认为您需要通过mysql\u查询发出SQL语句,其行文为SET@@max\u allowed\u packet=NUM
,我认为您可以使用缩写符号,例如64MB
,但我没有尝试过。@Radu:我不确定如何查看客户端设置。你可以试试<
Index: ext/mysql/php_mysql.c
===================================================================
--- ext/mysql/php_mysql.c (revision 311719)
+++ ext/mysql/php_mysql.c (working copy)
@@ -1485,6 +1485,9 @@
if (PHP_MYSQL_VALID_RESULT(mysql->conn)) { /* query should have returned rows */
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to save result set");
RETURN_FALSE;
+ } else if( mysql_errno(mysql->conn) != 0 ) {
+ php_error_docref("http://www.mysql.com/doc" TSRMLS_CC, E_WARNING, "%s", mysql_error(mysql->conn));
+ RETURN_FALSE;
} else {
RETURN_TRUE;
}
$resource = mysql_query($query, $handle);
if (!$resource) throw some exception;
if (!$resource && strpos($query, 'SELECT')) {
throw new Exception('mysql_query() returned TRUE for SELECT');
}