mysqli和bind_param - 可以使用哪些参数?

时间:2013-03-13 09:40:48

标签: php data-binding mysqli bind

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

无效:

$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 &$... ] )

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

2 个答案:

答案 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注入。顺便说一句,你的第一个例子对%事物做了同样的事情。

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

希望这会有所帮助:)