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

Php 调用存储过程时设置分隔符,php,mysql,sql,Php,Mysql,Sql,传递给sql以插入到表中的字符串中的引号导致存储过程失败。这似乎很常见,PHP用户被告知要避开引用。如果我理解正确,我将不得不转义整个文本,用于sql存储,然后取消转义以用于html显示。一定有更好的办法。我突然想到,在调用存储过程时设置分隔符可能是一种方法。或者使用php,重新定义引号符号。到目前为止,我还没有发现任何关于这两个想法的东西 在SP CALL中定义分隔符 call blog.postNewBlog(delimiter // begin {$blogText} end//, 'my

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

在SP CALL中定义分隔符

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

另一个分隔符仍然不能使您免于SQL注入:如果有人知道您的分隔符是什么,他们可能会操纵您的查询,使其做坏事,只需在提交的任何文本中滥用分隔符字符串即可

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

$db->query("INSERT INTO table VALUES(?, ?, ?, ?)", $var1, $var2, $var3, $var4);
关于这一点,最棒的是抽象层将自动处理引号(如果必要的话),而您根本不必关心它们。(我相当肯定这也适用于将内容传递到存储过程,但我没有使用SPs和MySQL的具体经验)

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