2013-03-13 91 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注入。順便說一句,你的第一個例子和%一樣。

對於第四個示例,它是有效的,因爲它是一個沒有圍繞它的函數的變量。就像我的第二個例子。

希望這會有所幫助:)