Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/231.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 为什么mysql_query()使用SELECT语句返回TRUE?_Php_Mysql - Fatal编程技术网

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');
}