簡體   English   中英

如何在SQL語句中的引號與PHP中的MySQLi Prepared語句一起使用?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM