为什么`mysqli_query()`返回null?我怎么能搞清楚?

时间:2018-05-15 09:02:06

标签: php mysql c

在某些情况下,PHP中的内置函数mysqli_query会返回nullthe function's documentation解释了如何使用它,因此我没有预见到这种行为,因此我尝试深入研究PHP的源代码本身posted on GitHub,看看我是否能够找出有时为mysqli_query返回的原因null

查询本身似乎不是问题:我以两种不同的方式测试了相关的SQL查询:

  • 在MySQL服务器中手动执行它们。他们工作正常。
  • 在我创建的脚本中,其目的是通过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中进行了测试;它在两个方面都失败了。

0 个答案:

没有答案