MySqli准备的声明不起作用

时间:2012-02-20 08:18:31

标签: php mysql mysqli prepared-statement

我编写了一个PHP类,它在我的开发机器上按预期运行,但是当我将它上传到我的服务器时,它不起作用。经过大量的修补,我发现了一些我无法解释的东西。

基本上,这不起作用,它绝不会返回任何内容:

$sql = $this->db->prepare("SELECT sh_value FROM sh_usermeta WHERE sh_key='points' AND sh_user_id=1");
$sql->execute();
$sql->bind_result($res);
$sql->fetch();
$sql->close();

但是,这确实会返回预期值:

$result = $this->db->query("SELECT sh_value FROM sh_usermeta WHERE sh_key='points' AND sh_user_id=1");
$result->fetch_object();

因此,语句是相同的,但由于某种原因,它只有在我使用“query()”时才有效。就像一个注释,我的第一个代码块是一个简化的例子(我已经验证不起作用)。我想使用预准备语句,因为在其他一些情况下我希望能够绑定参数,例如用户名。

同样,准备好的语句适用于我的开发环境,但在我的服务器上(PHP版本:5.2.17,MySql版本:5.0.51a)它没有。

另外,为了澄清,我在每次sql操作后都进行了错误检查,并且从未打印过错误。

有什么想法吗?

谢谢!

编辑好的,这会让事情更加困惑。我有另一份准备好的陈述,即IS工作。据我所知,唯一的区别是它正在访问另一个表。我根本不明白这一点:S

1 个答案:

答案 0 :(得分:0)

由于MySQL错误,查询无效。 key是MySQL关键字(docs),必须进行转义:

$sql = $this->db->prepare("SELECT value FROM usermeta WHERE `key`='points' AND user_id=1");

进一步暗示

您可以随时转义字段(或让图书馆为您完成工作)以防止此类名称冲突(更常见的示例包括optionorder,...)