我正在制作一个小型Web应用程序,它将定期接收用户输入的数据.在研究如何确保数据输入首先被清理时,为此它似乎是准备好的语句是要走的路.
然而,我发现了这个问题,因为我的应用程序(至少据我所知)每页请求不会执行多个查询,看起来我真正需要的是将值绑定到参数中查询.
我一直在浏览PDO和mysqli上的PHP手册,但我找不到任何值与普通查询绑定的示例.我发现的所有例子都$stmt->prepare在绑定之前的某个地方.
是否该语句是"准备好"由数据库的支持决定的东西,并且准备语句将始终在代码中?或者有没有办法将参数直接绑定到$dbh->query(...)?
为了解释为什么我要查看它是否可能不使用prepare,是由于我之前在帖子中链接的SO问题的声明:
何时不使用准备好的陈述?在数据库连接消失之前,您只需要运行一次语句.
何时不使用绑定查询参数(这实际上是大多数人使用预处理语句获取的)?
还有这个
我个人也不会打扰.伪准备语句可能对他们可能提供的安全变量引用有用.
如何将参数绑定到未准备的查询?
你没有.在这些问号可被视为参数值的插入点之前,需要首先解析(即准备好)具有参数(即特定位置的问号)的SQL字符串.
因此,在打电话prepare()之前,您总是需要打电话bind().
一个参数化的语句是包含SQL和占位符标记字符串(例如问号,但不同的数据库使用不同的占位符):
$sql = "SELECT user_id FROM user WHERE user_name = ?"
Run Code Online (Sandbox Code Playgroud)
现在假设您要在此位置插入一个值:
$_POST["username"]
Run Code Online (Sandbox Code Playgroud)
从广义上讲,准备一份陈述会给问题带来特殊的意义,"这里可以插入一个价值".换句话说,它从占位符创建参数.
$stmt->prepare($sql)
Run Code Online (Sandbox Code Playgroud)
将值绑定到参数会将参数设置为特定值.
$stmt->bind_param("s", $_POST["username"])
Run Code Online (Sandbox Code Playgroud)
现在可以在没有SQL字符串的情况下执行查询,并且用户提供的值实际上彼此接触.这是重要的一点: SQL和参数值分别发送到服务器.他们从不相互接触.
$stmt->execute();
Run Code Online (Sandbox Code Playgroud)
优点是:
$_POST["username"]包含什么值,SQL注入都是不可能的.