我发现this SO question然而,因为我的应用程序(至少据我所知)每页请求不会执行多个查询,看起来我真正需要的是将值绑定到查询中的参数.@H_403_2@
我一直在浏览PDO和MysqLi上的PHP手册,但我找不到任何值与普通查询绑定的示例.我发现的所有示例都有一个$stmt->在绑定之前的某处准备.@H_403_2@
是否该语句是“准备”的东西是由数据库的支持决定的,而准备语句将始终在代码中?或者有没有办法将参数直接绑定到$dbh->查询(…)?@H_403_2@
为了解释为什么我要查看它是否可能不使用prepare,是由于我之前在帖子中链接的SO问题的声明:@H_403_2@
When not to use prepared statements? When you’re only going to be running the statement once before the db connection goes away.@H_403_2@
When not to use bound query parameters (which is really what most people use prepared statements to get)?@H_403_2@
还有这个@H_403_2@
Personally I wouldn’t bother. The pseudo-prepared statements are likely to be useful for the safe variable quoting they presumably provide.@H_403_2@
How do you bind parameters to a query that isn’t prepared?@H_403_2@
你没有.在那些问号可被视为参数值的插入点之前,需要首先解析(即准备好)具有参数(即特定位置的问号)的sql字符串.@H_403_2@
因此,在调用bind()之前,总是需要调用prepare().@H_403_2@
参数化语句是一个包含sql和占位符标记的字符串(例如问号,但不同的数据库使用不同的占位符):@H_403_2@
$sql = "SELECT user_id FROM user WHERE user_name = ?"
现在假设您要在此位置插入一个值:@H_403_2@
$_POST["username"]
从广义上讲,准备一份陈述会给问题带来特殊的意义,“这里可以插入一个价值”.换句话说,它从占位符创建参数.@H_403_2@
$stmt->prepare($sql)
将值绑定到参数会将参数设置为特定值.@H_403_2@
$stmt->bind_param("s",$_POST["username"])
现在可以在没有sql字符串的情况下执行查询,并且用户提供的值实际上彼此接触.这是重要的一点:sql和参数值分别发送到服务器.他们从不相互接触.@H_403_2@
$stmt->execute();
优点是:@H_403_2@
>您可以将新值绑定到参数并再次执行查询,而无需重复所有操作(在循环中很有用).>无论$_POST [“username”]包含什么值,sql注入都是不可能的.@H_403_2@