【问题标题】:PHP Mysqli returns no rows, while manual SQL query returns resultsPHP Mysqli 不返回任何行,而手动 SQL 查询返回结果
【发布时间】:2013-11-01 05:43:01
【问题描述】:

我有一段 PHP 代码,它通过 AJAX 调用以将值插入表中,然后从该表中返回匹配值的列表。插入查询运行良好,但选择查询不返回任何内容。如果我进入 phpmyadmin 并手动运行选择查询,我会得到预期的结果集,但在 PHP 代码中,fetch_assoc() 返回 null。我已经确认所有变量都被正确传递,但代码永远不会进入 while 循环,因为集合中没有结果。下面是一组相关代码:

if (isset($_POST['action']) && $_POST['action'] == "link" && !empty($_POST['link_id']) && !empty($_POST['cat_id'])) {
    require_once(realpath(dirname(__FILE__)) . "/../config/config.php");
    $link_id = (int)$_POST['link_id'];
    $category_id = (int)$_POST['cat_id'];
    $query = $conn->query("INSERT INTO links_to_categories (link_id, category_id) VALUES ({$link_id}, {$category_id})");
    if ($query) {
        $cats = $conn->query("SELECT * FROM links_to_categories lc LEFT JOIN categories c ON lc.category_id = c.category_id WHERE lc.link_id = {$link_id}");
        while ($cat = $cats->fetch_assoc()) {
            echo "{$cat['category_name']} (<a href=\"#\" onclick=\"unlinkCategory({$link_id}, {$category_id});return false;\">x</a>)<br>";
        }
    }
    die();
}

这个和另一个函数(几乎相同,但执行的是 DELETE 而不是 INSERT)是我的代码中唯一存在此问题的函数。我还有十几个正常工作的查询,包括在代码的不同部分运行正常的相同 SELECT 查询,所以这非常令人费解。

【问题讨论】:

  • 假设你做的一切都是正确的。您不认为您的$query 变量可能具有FALSE 的值吗? :)
  • 没有。我已经在不同位置使用 php mail() 函数测试了代码,以向我发送相关变量。 $query 绝对正确,因为如果我将 mail() 放在 if ($query) 语句中,它会发送给我一封邮件,但如果我将它放在 while 语句中则不会。
  • 然后你应该在那里添加一些错误检查,看看你是否遇到了 MySQL 错误。
  • 我尝试查看$conn->error的结果,返回一个空字符串,说明没有错误。对于它的价值,如果我 print_r($cats),如果出现错误,我不会得到 False。相反,我得到了这个:{"current_field":null,"field_count":null,"lengths":null,"num_rows":null,"type":null}

标签: php mysql mysqli


【解决方案1】:

-- 比尔盖茨在彩票中中大奖是真的吗?
——是的,完全正确。只不过不是比尔盖茨,而是约翰·多伊,不是彩票而是黑杰克,不是头奖而是 10 美元,不是赢了而是输了。

这个“几乎相同”破坏了整个事情。要怪 mysqli,你必须运行完全相同的查询,没有任何假设。

实际上有整个 PHP 程序可以动态构建您的查询。该程序肯定有错误。因此,如果您的查询运行不符合您的预期,您必须验证程序的结果,即 - 查询本身。

您有没有想过将生成的查询回显而不是运行它?只是为了确定它确实是您期望的查询?如果没有——是时候这样做了。

当然,它应该是一组精确的查询,与您手动运行的查询没有什么不同。

如果您确实从 mysqli 运行完全相同的 静态 查询,并且结果与其他客户端不同 - 那么您正在使用这些客户端连接到不同的服务器。虽然 mysqli 永远不会干扰您的查询。你可以肯定这一点。

【讨论】:

  • 是的,我已经做到了。这是我从回显 PHP 中得到的查询: SELECT * FROM links_to_categories lc LEFT JOIN categories c ON lc.category_id = c.category_id WHERE lc.link_id = 4068 这是我手动运行查询得到的结果集: [{"link_id": 4068,"category_id": 65,"category_id": 65,"category_name": "Test"}] 但是如果我 print_r 的结果 $cats->fetch_assoc() 我得到“null”跨度>
  • 如果你这样做了,你应该在你的问题中发布你这样做的代码,而不是一些不相关的代码。 如果您确实从 mysqli 运行完全相同的 static 查询,并且结果与其他客户端不同 - 那么您正在使用这些客户端连接到不同的服务器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多