在某些情况下,PHP中的内置函数mysqli_query
会返回null
。 the function's documentation解释了如何使用它,因此我没有预见到这种行为,因此我尝试深入研究PHP的源代码本身posted on GitHub,看看我是否能够找出有时为mysqli_query
返回的原因null
。
查询本身似乎不是问题:我以两种不同的方式测试了相关的SQL查询:
mysqli_query()
测试查询。它们在此测试下工作,函数返回true
。但是,在某些情况下,这些相同的查询会返回null
。当mysqli
函数开始运行时,mysqli_query
链接对象存在,此时“返回null
失败”。
因此,查看PHP的GitHub存储库,我发现名为mysqli_nonapi.c
的文件,并且在此文件的line 556中,似乎是内置的mysqli_query
定义。查看其中的代码,看起来它执行基本检查,如果失败,则返回null
。以下是上面链接的第一行:
/* {{{ proto mixed mysqli_query(object link, string query [,int resultmode]) */
PHP_FUNCTION(mysqli_query){
MY_MYSQL *mysql;
zval *mysql_link;
MYSQLI_RESOURCE *mysqli_resource;
MYSQL_RES *result = NULL;
char *query = NULL;
size_t query_len;
zend_long resultmode = MYSQLI_STORE_RESULT;
if (zend_parse_method_parameters(ZEND_NUM_ARGS(), getThis(), "Os|l", &mysql_link, mysqli_link_class_entry, &query, &query_len, &resultmode) == FAILURE) {
return;
}
// [...]
}
尽管我有时使用C代码,但我只知道一点C.我知道它使用指针,我猜那些以*
开头的参数是指针。无论如何,我不确定如何解释这段代码,或弄清楚它的内部流程如何影响PHP的执行。
长话短说:我可以假设,由于某种原因,上面显示的函数中的初始检查失败了。但是,为了找出原因,我需要先了解这段代码。
恐怕我无法隔离问题以在生产环境之外触发错误,这对于详尽的测试非常有用。那么,我还有什么选择呢?我可以做些什么来调试内部代码,或者解决为什么它可能会失败?
我在PHP5和PHP7中进行了测试;它在两个方面都失败了。