[英]How to use quotations in SQL statement with MySQLi Prepared Statements in PHP?
我正在使用准備好的語句對數據庫執行SELECT查詢,但是SQL語法的性質導致MySQLi出現問題。
當我嘗試准備時:
SELECT user_id FROM Users WHERE email='?';
我收到一個錯誤
Warning: mysqli_stmt_bind_param(): Number of variables doesn't match number of parameters in prepared statement
我知道錯誤是由在引號周圍引起引號引起的 但是問題是這些引號是SQL語法正確所必需的。 如果刪除引號,則prepared語句有效,但數據庫不會返回預期的結果。
有什么我可以做的,還是接口的限制? 如果有限制,我該如何在准備好的語句安全的情況下執行此查詢?
完整代碼:
$email = $_POST["email"];
$sql = "SELECT user_id,fname,city,state,zip FROM Users WHERE email='?';";
$types = 's';
$stmt = $db_obj->prepare($sql);
if (!mysqli_stmt_bind_param($stmt, $types, $email)) {
echo "SQL Bind Parameter error.<br/>";
exit;
}
if (!mysqli_stmt_execute($stmt)) {
echo "SQL Statement Execute error.<br/>";
exit;
}
if (!isset($row[0]))
exit ("No such email registered.");
如上面的@lc所示,准備好的語句始終將電子郵件作為字符串而不是參數傳遞給MySQL,因此我刪除了引號,因為知道不需要它們來解決我的問題。
事實證明,在語句執行后我沒有綁定輸出變量,因此即使正確完成了准備好的語句,我也無法正確讀取響應。
我補充說:
mysqli_stmt_bind_result($stmt, $user_id, $fname, $city, $state, $zip);
mysqli_stmt_fetch($stmt);
if (empty($user_id))
exit ("No such email registered.");
由於現在已經將數據庫結果正確地綁定到了變量,因此諸如$userid
類的變量現在已保存了預期的來自數據庫的數據。
正確的語法是SELECT user_id FROM Users WHERE email=?
。 您發出的准備好的語句未返回“正確的”結果,可能是由於以下原因之一:
請注意,在您的查詢中SELECT user_id FROM Users WHERE email='?'
, ?
不是參數。 它是字符串文字“?”。 該查詢將搜索“ Users
表中email
列包含值“?”的任何行。 。
請刪除對? 標記。
$stmt = $mysqli->prepare("SELECT user_id,fname,city,state,zip FROM Users WHERE email=?");
/* bind parameters for markers */
$stmt->bind_param("s", $email);
/* execute query */
$stmt->execute();
嘗試這個。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.