我完全难过了。这是我的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修改行。
这里发生了什么???
答案 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函数来确保你没有引入拼写错误。