我在PDO中读到,如果你使用prepare并在execute中传递变量,则不需要转义变量:
$st = $dbh->prepare("INSERT INTO mytable (name,email) VALUES (?,?)");
$st->execute(array($_POST['name'], $_POST['email']));
这是真的吗?
或者我还需要在那里用$ _POST做点什么吗?
答案 0 :(得分:5)
在准备好的语句中,不需要转义(并且自行转义会导致双重转义,导致转义数据被写入数据库)。
但是,PDO编写的语句无法处理所有查询变体,有时您必须将“外部”数据直接插入查询字符串,这意味着您将负责正确地转义它。特别是,无法使用预准备语句指定表和/或字段名称更改的动态查询。 e.g。
SELECT ? FROM ? WHERE ?=?
无法完成。只能使用占位符指定值。
答案 1 :(得分:2)
简短回答:不,你不需要逃避任何事情。参数化查询完全令人敬畏!:)
答案很长:不,你不需要逃避任何,因为它进入数据库。但是,在显示查询的数据库输出以防止XSS攻击时,您仍然应该使用htmlspecialchars
,否则您最终会在任意字段中填写类似这样的内容:
<script type="text/javascript">alert('sup, I'm in ur site!');</script>
。
答案 2 :(得分:2)
这是真的;代码是正确的(尽管您可能想要处理未设置$_POST['name']
的情况。)
PDO准备好的语句功能以不需要显式转义的格式移交值。