mysql查询无法从应用程序内部正确运行

时间:2010-03-27 23:17:05

标签: php mysql database codeigniter

我完全难过了。这是我的php(CodeIgniter)代码:

function mod()
{
    $uid = $this->session->userdata('uid');
    $pid = $this->input->post('pid');
    if ($this->_verify($uid,$pid))
    {
        $name  = $this->input->post('name');
        $price = $this->input->post('price');
        $curr  = $this->input->post('curr');
        $url   = $this->input->post('url');

        $query = $this->db->query("UPDATE items SET
                        name=".$this->db->escape($name).",
                        price=".$this->db->escape($price).",
                        currency=".$this->db->escape($curr),",
                        url=".$this->db->escape($url)."
                        WHERE pid=".$this->db->escape($pid)." LIMIT 1");
    }
    header('location: '.$this->session->userdata('current'));

}

此代码的目的是修改“项目”表中行的属性(名称,价格,货币,网址)(priary键为pid)。但是,出于某种原因,允许此函数运行一次会修改表中所有条目的名称,价格,货币和网址,而不管它们的pid和我在查询结尾处添加的LIMIT 1的内容。就像查询的最后一行被完全忽略一样。

好像这不够奇怪,我用“$query = $this->db->query(”替换了“echo”来查看正在运行的SQL查询,它输出的查询与我期望的一样: / p>

UPDATE items 
   SET name = 'newname', 
       price = 'newprice', 
       currency = 'newcurrency', 
       url = 'newurl' 
 WHERE pid = '10' 
 LIMIT 1

将其复制粘贴到MySQL窗口中的行为完全符合我的要求:它使用选定的pid修改行。

这里发生了什么???

2 个答案:

答案 0 :(得分:0)

现在我觉得很愚蠢:只需要用不同的字体查看我的代码即可。我的代码有

currency=".$this->db->escape($curr),",

而不是

currency=".$this->db->escape($curr).",

回声使它工作得很好,因为显然你可以给echo多个字符串,逗号分隔,然后连接它们

哭泣我在这个上花了好几个小时

答案 1 :(得分:0)

我知道你回答了自己的问题,但是让我把它添加到堆中:你没有在这种查询中利用CodeIgniter AT ALL - 如果你按照预期使用CI,你就不会有那个错字。您的查询应该如下(除其他外):

$query = $this->db->update('items', 
                           array('name' => $this->input->post('name'),
                                 'price' => $this->input->post('price'),
                                 'curr' => $this->input->post('curr')),
                           array('id' => $this->input->post('id')),
                           1);

通过手动汇编查询字符串,您可以撤消CI为您执行的操作。只有当你使用一些复杂的JOIN语句时,你应该在CI中编写自己的SQL,即使这样,你也想使用sprintf PHP函数来确保你没有引入拼写错误。