问题其实很简单,就是参数无法传递到LIMIT里去,比如这么一句

1
2
3
4
5
6
7
8
9
10
11
CREATE PROCEDURE `topic_list`(IN p1 INTEGER(11), IN p2 INTEGER(11))
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ''
BEGIN
SELECT .......
FROM user,topic
WHERE topic.topic_author_id = user.user_id
LIMIT p1 OFFSET p2;
END;

这个p1和p2就没办法传进去

然后在网上找解决方法找了久,总算找到一篇,可惜。。。里面还是有错误的,最后把纠正后的解决方法给大家说说吧,用PHP的朋友肯定会碰到这个问题的。

思路就是把整个查询语句变成带有未知参数的字符串,有点类似于Zend_Db里面有个quteInto的用法
比如要生成一句WHERE语句,可以这么写

1
$where = $dbobj->quoteInto('user_id = ?',$user_id);

那么在存储过程里就可以这么解决了,就看我前面那个举例,改成这样就可以执行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
CREATE PROCEDURE `topic_list`(IN p1 INTEGER(11), IN p2 INTEGER(11))
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ''
BEGIN
SET @queryStr = '........
WHERE topic.topic_author_id = user.user_id
LIMIT ? OFFSET ?;
';
PREPARE s1 FROM @queryStr;
SET @p1 = p1;
SET @p2 = p2;
EXECUTE @queryStrs1 USING @p1,@p2;
DEALLOCATE PREPARE s1;
END;

意思的话可以从这几个英文单词里得知,那两个?其实就是那个未知的参数,后面用了USING把p1和p2这两个参数成功的传入了LIMIT查询的语句中去。

(早上起来发现写错了一个地方,删除的部分应该改成s1)