2015-03-19 78 views
0

我有一個簡單的調查頁面,我試圖做。除了在我對調查頁面的評論中使用單引號時,一切運行良好。當我對它的單引號發表評論時,數據庫查詢不會插入到數據庫中。MYSQL轉義字符串執行

在Googleing之後,我想我必須在將字符串插入到數據庫之前將其轉義。在插入數據庫之前,我使用mysqli_real_escape_string來轉義字符串,但這似乎沒有幫助。

這裏是我的代碼,將用戶的意見爲DB(未顯示安全$ CON)

mysqli_real_escape_string($con,$_POST['question_1']); 
    mysqli_real_escape_string($con,$_POST['question_2']); 
    mysqli_real_escape_string($con,$_POST['question_3']); 
    mysqli_real_escape_string($con,$_POST['question_4']); 
    mysqli_real_escape_string($con,$_POST['question_5']); 

    mysqli_query($con, "INSERT INTO feedback (question_1, question_2, question_3, question_4, question_5) VALUES ('$_POST[question_1]', '$_POST[question_2]', '$_POST[question_3]', '$_POST[question_4]', '$_POST[question_5]')"); 

同樣,當註釋包含一個單引號這只是發生。有什麼建議麼?我是否錯誤地脫離了字符串?

+1

處理的變量分配給它第一'$ Q1 = mysqli_real_escape_string($ CON,$ _ POST [ 'question_1']);'然後執行'VALUES(' 「$ Q1。」 ')'等等,因爲你現在在做的是'VALUES'('$ _POST [question_1]','是沒有意義的,你也可以使用'stripslashes()',或者使用[prepared statements](http: /www.php.net/manual/en/mysqli.quickstart.prepared-statements.php)並完成它,不需要使用附加函數 – 2015-03-19 03:08:27

+0

我會避免使用'stripslashes()',因爲它往往會遺漏一些情況下,事情不是SQL安全的。我從來沒有逃脫函數無法返回SQL安全(不要與安全性安全混淆)字符串 – Machavity 2015-03-19 03:30:54

+0

@Machavity條帶允許有O'Malley寫入數據庫確切如圖所示,而不是奧馬利。 – 2015-03-19 03:32:16

回答

1

你誤會了,這裏

mysqli_real_escape_string($con,$_POST['question_1']); 

發生此函數返回一個字符串逃脫。然後您在您的SQL中使用此字符串

$question1 = mysqli_real_escape_string($con,$_POST['question_1']); 
//Do your other escapes here 
mysqli_query($con, "INSERT INTO feedback (question_1, question_2, question_3, question_4, question_5) 
    VALUES ('$question1', ...)"); 

此處更好的解決方案是準備語句。這並不要求你逃脫任何東西。數據被分開發送和適當

$prep = mysqli_prepare($con, 'INSERT INTO feedback (question_1, question_2, question_3, question_4, question_5) 
    VALUES (?, ?, ?, ?, ?)'); 
mysqli_stmt_bind_param($prep, "sssss", $_POST['question_1'], $_POST['question_2'], $_POST['question_3'], $_POST['question_4'], $_POST['question_5']); 
mysqli_stmt_execute($prep); 
+0

我之前對mysqli_real_escape_string的理解是,它會更新作爲參數給出的變量。謝謝你糾正這一點。現在一切正常,但我將不得不考慮mysqli_prepare,因爲這聽起來像是一種更好的方式,以更少的代碼行完成相同的任務。 – blazerunner44 2015-03-19 03:32:56