调用存储过程时设置分隔符

时间:2011-09-26 00:39:52

标签: php mysql sql

传递给sql以插入表的字符串中的引号导致存储过程失败。这似乎很常见,并且PHP用户被告知要逃避引号。如果我理解正确,我将不得不逃避整个文本,为sql存储,然后unescape它为HTML显示。肯定有更好的办法。在我看来,在调用存储过程时设置分隔符可能是一种方法。或者使用php,重新定义引号。到目前为止,我还没有发现任何这些想法。

在SP CALL中定义DELIMITER

call blog.postNewBlog(delimiter // begin {$blogText} end//, 'my text1', null, null, @out_dt, @out_title, @out_text)

1 个答案:

答案 0 :(得分:0)

不同的分隔符仍然无法保存您的SQL注入:如果有人知道您的分隔符是什么,他们可以操纵您的查询以使其做坏事,只需在他们提交的任何文本中滥用分隔符字符串。

此类问题的正确解决方案是使用在查询中使用占位符的数据库绑定。例如,PEAR中有一堆数据库抽象层为您提供了大致如下的语法:

$db->query("INSERT INTO table VALUES(?, ?, ?, ?)", $var1, $var2, $var3, $var4);

关于这一点的好处是抽象层将自动处理引号(如果需要),你根本不需要关心它们。 (我很确定这也适用于将内容传递给存储过程,但我对SP和MySQL没有特定的经验。)

顺便说一句,即使使用标准类型的方法,当从数据库中获取值时,您也不需要 un 转义值:转义仅在查询中使用。引号不会以转义形式存储在数据库中,同样,查询结果也不会被转义。