2013-11-01 65 views
-2

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

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

这和另外一个功能(这是几乎相同,但做了删除,而不是INSERT的)是我的代码只有那些有这个问题。我有十几个正常工作的其他查询,包括在运行良好的代码的不同部分中执行相同的SELECT查询,所以这非常令人费解。

+0

假设你一切正常。你不认为你的'$ query'变量可能具有值'FALSE'? :) –

+0

不。我已经使用php mail()函数在不同位置测试了代码,以向我发送相关变量。 $ query绝对是真的,因为如果我把它放在if($ query)语句中,mail()会给我发一封邮件,但如果我把它放在while语句中,则不会。 – NeuroXc

+0

然后你应该在那里添加一些错误检查,看看你是否得到一个MySQL错误。 –

回答

3

- 比尔盖茨是否真的在彩票中获得大奖?
- 是的,确实如此。只不过比尔盖茨,但约翰多伊,不是在彩票,但黑杰克,没有大奖,但10美元,但没有赢得,但失去了。

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

实际上有整个PHP程序来动态构建您的查询。该程序肯定会出现错误。所以,如果你的查询运行不符合你的期望,你必须验证程序的结果,即 - 这个查询本身。

你有没有想过将结果查询回显出来,而不是运行它?只是为了确定它确实是您期望的查询?如果没有 - 现在是时候这样做了。

当然,它应该是一组精确的查询,与您手动运行的查询没有区别。

如果你确实运行恰好从mysqli的相同静态查询,结果是任何其他客户端不同的 - 那么你要连接到与这些客户不同的服务器。尽管mysqli永远不会干扰你的查询。你可以确信这一点。

+0

是的,我已经这样做了。这是我通过回显PHP得到的查询: SELECT * FROM links_to_categories lc LEFT JOIN类别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” – NeuroXc

+0

如果你已经完成了这个工作,你应该在你的问题中发布代码,而不是一些不相关的代码。 **如果你确实**运行完全一样的来自mysqli的静态**查询,并且结果与任何其他客户端不同 - 那么你使用这些客户端连接到不同的服务器。 –