0

任何人都可以确认下面的前两个陈述是好的,最后一个是错误的:

无效的:

$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.netbool mysqli_stmt::bind_param ( string $types , mixed &$var1 [, mixed &$... ] )

但这对我来说仍然不清楚。

4

2 回答 2

0

我可以不放变量,而是放它的值(我的第一个例子)

你不能。那就是问题所在。

我想正确理解 Mysqli Prepared Statements 的基本知识。

不要浪费你的时间,而是学习PDO Prepared Statements。
它们更加明智和实用。
它有bindValue()方法可以让你上面提到的一切

如果您必须使用 mysqli API - 也有一个解决方案,您可以使用构建在 mysqli 之上的SafeMysql

于 2013-03-13T09:43:16.717 回答
-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 注入。顺便说一句,你的第一个例子对这件事做同样的%事情。

对于您的第四个示例,它是有效的,因为它是一个没有围绕它的函数的变量。就像我的第二个例子一样。

希望这可以帮助 :)

于 2013-03-13T18:14:34.850 回答