有人可以确认下面的前两个陈述是好的,最后一个是错的:
无效:
$sql="SELECT Code, Name FROM Country WHERE Code LIKE ? LIMIT 5";
$stmt = $mysqli->prepare($sql);
$stmt->bind_param("s", "C%");
无效:
$sql="SELECT Code, Name FROM Country WHERE Code LIKE ? LIMIT 5";
$stmt = $mysqli->prepare();
$stmt->bind_param("s", strtolower($_POST['code']));
无效(绑定不仅仅是文字值):
$sql="SELECT Code, Name FROM Country ? LIMIT 5";
$stmt = $mysqli->prepare();
$stmt->bind_param("s", "WHERE Code LIKE C%");
有效:
$sql="SELECT Code, Name FROM Country WHERE Code LIKE ? LIMIT 5";
$stmt = $mysqli->prepare();
$stmt->bind_param("s", $_POST['code']);
我问它是因为我想要正确理解Mysqli Prepared Statements基本知识。
我仍然不确定我可以在bind_param()
中添加哪些参数。我可以把变量,但它的值(我的第一个例子)或甚至执行一些php函数(我的第二个例子)作为bind_param()中的参数吗?
php.net说bool mysqli_stmt::bind_param ( string $types , mixed &$var1 [, mixed &$... ] )
但这对我来说仍然不清楚。
答案 0 :(得分:0)
我可以放置不是变量,但是它的值(我的第一个例子)
你做不到。这就是问题所在。
我想要正确理解Mysqli Prepared Statements基本知识。
不要浪费你的时间,转而学习 PDO 准备好的陈述
它们更明智,更实用
它有bindValue()
方法,可以提供上面提到的所有内容
如果您必须使用mysqli API - 也有解决方案,您可以使用构建于mysqli之上的SafeMysql
答案 1 :(得分:-1)
首先,您在%
功能中添加了bind_param
。执行sql查询时,%
将作为普通字符串存储,不会更改语句的功能。
对于你的第二个例子,你最好这样做:
$string = strtolower($_POST['code']);
$sql="SELECT Code, Name FROM Country WHERE Code LIKE ? LIMIT 5";
$stmt = $mysqli->prepare();
$stmt->bind_param("s", $string);
对于第三个示例,bind_param
将值转换为可以传递给数据库的“事物”,并且不允许更改sql语句,即sql注入。顺便说一句,你的第一个例子对%
事物做了同样的事情。
对于你的第四个例子,它是有效的,因为它是一个没有函数的变量。就像我的第二个例子一样。
希望这会有所帮助:)