2012-06-04 117 views
1

这是我的声明是如何看起来像。奇怪的准备语句错误

   $stmt = $this->db->prepare(" 
         select q.id 
         from questions q 
         left outer join (
         select max(chk_date) as questions_last_chk_date 
         FROM last_check_date 
         where user_id = ? 
         AND chk_token=?) lcd 
         on q.add_dt > lcd.questions_last_chk_date 
         WHERE q.author_id<>? 
       ") or die($this->db->error); 
       $stmt->bind_param("isi", $_SESSION["userID"], "q", $_SESSION["userID"]) or die($stmt->error); 

我有2个问题

1)获得错误信息

致命错误:无法通过引用

为什么会出现此错误传递参数3?顺便说一句,我知道last_check_date表是空的,但我认为这与这个问题没有关系。

2)在windows上,获取错误消息表last_check_date不存在,但我100%知道没有错字,并且存在表。我用Navicat - db amanger应用程序尝试了相同的查询并得到了结果。但是,当我尝试使用PHP获取此错误。在远程Linux服务器上它工作,并在问题1中获取错误消息。尝试重新启动mysql服务,重命名为其他名称并将名称更改回上一个。没有成功!我该如何解决这个问题?

+1

我不是MySQLi专家,但我认为你不能将静态参数绑定到查询。在我看来,这是完全合理的。因此,要么将参数3设置为变量并传递它,要么更改查询,以便现在参数3已经存在。 – clentfort

+0

@clentfort我gachu。但无法通过外连接获得此项工作。我没有外连接的经验。这就是为什么向社区发布问题 – heron

回答

3

您必须将q放入一个变量中。

仅供参考,尽量不要使用等于表别名或引用的字符串值。当您使用q别名表时,您传递的值为q。这不是一个错误,但如果您需要对查询进行回显,可能会非常困惑。