gpt4 book ai didi

php - 为什么 `mysqli_query()` 返回 null?我怎样才能弄清楚?

转载 作者:行者123 更新时间:2023-12-04 11:33:14 25 4
gpt4 key购买 nike

在某些情况下,PHP 内置函数调用 mysqli_query返回 null . the 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 中进行了测试;它在两者中都以相同的方式失败。

    最佳答案

    这在 PHP 中称为未定义行为。它的大多数实例已在 PHP 8 中根除,但在该版本之前,当您将错误的参数传递给内置函数时,该函数通常会抛出警告并返回 null(或 false)。
    有很多情况根本没有发出警告!这种行为没有记录在每个页面上,因为这会是一团糟,根据定义,“未定义行为”没有定义的行为。
    这意味着像下面这样的代码不会抛出任何警告而只是返回 null :

    //                                          V - string passed instead of a numerical value
    var_dump(mysqli_query($mysqli, 'SELECT 1', 'foo'));
    PHP 对参数类型非常宽容,当您传递错误的类型时,它会尝试将其转换为正确的类型,但是当这不可能时,PHP 没有定义应该发生的行为。值得庆幸的是,在 PHP 8.0 中,99% 的情况下都已修复此问题。

    关于php - 为什么 `mysqli_query()` 返回 null?我怎样才能弄清楚?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50346196/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com