2017-02-19 101 views
10

我想創建一個SQL查詢插入用戶信息到數據庫中。 $fname$lname變量包含正確的值(「John」和「Doe」),但查詢失敗。這裏是我的代碼:如何在PHP腳本中正確構建SQL查詢?

$fname = $_POST['first_name']; 
$lname = $_POST['last_name']; 
$sql = "INSERT INTO users (fname, lname) VALUES ($fname, $lname)"; 
mysqli_query($conn, $sql); 

檢查錯誤消息,我發現,這個查詢失敗,錯誤說法

未知列「約翰」在「字段列表」

後如何正確地將變量包含到SQL查詢中以使其無誤地運行?

  • 這個問題不是關於我熟悉的SQL語法,而是關於在PHP腳本中動態使用變量創建查詢的規則。
  • 我不想要一個只消除即時錯誤的快速修補程序,而是一種無錯誤且安全的最新解決方案。
+3

我明白你正在嘗試設置一些權威的複製目標,但是「失敗」從來沒有成爲一個有效的問題陳述。您需要擴展問題的描述,並指出在什麼情況下會生成語法錯誤,並且(理想情況下)包含文本表示的實際錯誤,以便人們可以通過Google找到此問題,而不是其他任何其他人, *包含真實的錯誤消息。 – meagar

+0

[在MySQL中何時使用單引號,雙引號和反引號]可能有重複(http://stackoverflow.com/questions/11321491/when-to-use-single-quotes-double-quotes-and-backticks- in-mysql) –

+0

「字段列表中的未知列'hello'」 - 這怎麼可能? –

回答

8

最防呆的方式來添加一個變量到一個SQL查詢是通過準備好的聲明添加它。

明白圍繞一個變量只是加上引號是不夠的並最終將導致無數問題,從語法錯誤到SQL注入是非常重要的。另一方面,由於準備好的陳述的本質,這是一個防彈解決方案,它不可能通過數據變量引入任何問題。

因此,對於您運行的每個查詢,如果至少要使用一個變量,則必須用佔位符替換它,然後準備查詢,然後執行它,分別傳遞變量。

首先,你必須改變你的查詢,添加佔位符代替變量。您的查詢就會變成:

$sql = "INSERT INTO users (fname, lname) VALUES (?, ?)"; 

然後,你將不得不準備它,綁定變量,並執行:

$stmt = mysqli_prepare($conn, $sql); 
mysqli_stmt_bind_param($stmt, "ss", $fname, $lname); 
mysqli_stmt_execute($stmt); 

正如你所看到的,這只是三個簡單的命令:

  • prepare()你在哪裏發送帶有佔位符的查詢
  • bind_param你發送一個字符串與類型(「s」是爲字符串,你可以用它實際上任何類型)一個nd比實際變量。
  • 和執行()

這樣,你總是可以肯定,沒有一個SQL語法錯誤可以由您添加到查詢的數據造成的!作爲獎勵,這個代碼也是防SQL注入的!

儘管如此,使用mysqli預處理語句運行SELECT查詢可能會更加複雜。所以我強烈建議選擇PDO作爲您的數據庫驅動程序for many reasons

+16

*「將變量添加到SQL查詢的唯一正確方法是通過準備好的語句添加它。」* - 假,您知道它。 –

+7

@ Fred-ii-實際的東西應該說「你不太可能犯錯的唯一方式」,但它似乎是對讀者智力的侮辱。 – Braiam

+0

@布賴安怎麼樣「最防錯的方法」? – dorukayhan