2013-03-13 92 views
0

任何人可以确认低于前两个语句都不错,最后一个是错误的:mysqli和bind_param - 可以使用哪些参数?

无效:

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

但是,目前还不清楚我。

回答

0

我可以把不变量,但它的价值(我的第一个例子)

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

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

不要浪费你的时间,学习PDO预处理语句来代替。
他们更合理,更实用。
它有bindValue()方法,这将使你,你上面

提到的情况下,你必须使用的mysqli API一切 - 有一个解决方案也可以使用SafeMysql建的mysqli

+0

我最好同意你的看法,但我不是这个问题的老板。这是使用mysqli的项目。 – Haradzieniec 2013-03-13 09:51:23

+0

对不起,我还不清楚。我已经将第四个示例添加到了我的问题中。我是对的,1-3例是无效的,唯一的第四个例子是有效的? – Haradzieniec 2013-03-13 09:59:20

-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 statment“东西” ,又名SQL注入。顺便说一句,你的第一个例子和%一样。

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

希望这会有所帮助:)