2014-12-04 79 views
-1

我想做一個註冊表單,但sql查詢只是不會工作..試圖添加的內容和刪除它們,添加(')標誌插入的數據,並刪除它們..沒有任何作品!我不確定我的錯誤在哪裏......有人可以幫忙嗎?MySQL查詢錯誤 - 隱藏錯誤?

PHP代碼:

 $mysqli = new mysqli('localhost','root','','wisdom') or die("CONNECTION ERROR"); 

    $query = "INSERT INTO net_users VALUES (NULL,'$fname','$mname','$lname','$dob','$uname','$pasw','$phone1','$phone2','$email',NULL,NULL,NULL,'$date');"; 

     if($mysqli->query($query)) echo "REGISTERED"; 
     else echo "<br><br>FAILED: ".$mysqli->error; 

ERROR:

FAILED: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '123456789,987654321,[email protected],NULL,NULL,NULL,14/12/04)' at line 1 

數據($ _POST):

Array ( 
[fname] => A //$fname 
[mname] => A //$mname 
[lname] => A //$lname 
[dob] => 2014-07-17 //$dob 
[username] => bakriawad //$uname 
[password] => horray  //$passw 
[cpassword] => horray 
[email] => [email protected]   //$email 
[phone1] => 123456789 //$phone1 
[phone2] => 987654321 //$phone2 
[botchk] => 
[tos] => on) 

// $日期=日期( 「年/月/ d」 );

我確保數據匹配行數據類型...我試着改變和重寫代碼多次...沒有任何作品!它只是卡在那裏!

--------------------------------------------- ------------------------------------------ \

EDIT 服務器被凍結(或什麼..),重新啓動後它接受輸入..抱歉的麻煩..但工作6小時後,你很難直接思考...即使sql不斷變化,錯誤永遠不會改變,那是一個明確的標誌。

+1

** WARNING **:當使用'mysqli'你應該使用參數化查詢,而['bind_param'(http://php.net/manual/en/mysqli-stmt.bind-param。 PHP)將用戶數據添加到您的查詢。 **不要**使用字符串插值來實現這一點,因爲你會產生嚴重[SQL注入漏洞(http://bobby-tables.com/)。在你解決這個問題之前,這些代碼都不會一直工作。 – tadman 2014-12-04 18:39:16

+0

有趣的是,這也會解決他目前遇到的問題。 – 2014-12-05 04:25:59

回答

0

您應該用單引號括住這些值。嘗試將單引號添加到您的值。

$query = "INSERT INTO net_users VALUES (NULL,'$fname','$mname','$lname','$dob','$uname','$pasw','$phone1','$phone2','$email',NULL,NULL,NULL,'$date');"; 

您也有一個sqlinjection attack風險。建議您改爲使用bind_param()

+0

我試過......沒有工作!它正在與我搞砸!我知道,它不接受它,除非它被(')包圍,但如果你看錯誤,它不顯示錯誤的開始......爲什麼? – bakriawad 2014-12-04 18:36:55

+0

其實它只是工作....這使我瘋了..我試圖加入他們3次現在..每次它給了我一個錯誤。我認爲生病要洗澡,謝謝。 – bakriawad 2014-12-04 18:40:07

+0

這不是任何延伸的解決方案,這只是挖一個更深的洞。 – tadman 2014-12-04 18:40:43

2

兩件事;一個很糟糕,另一個很糟糕。

  1. 你忘記在字符串值中加引號,所以SQL表達式不是一個寫得很好的表達式。
  2. 您首先遇到了SQL注入攻擊風險。 Please read this看看它是什麼以及如何預防它。
+0

如果遵守#2,#1是無關緊要的。 – tadman 2014-12-04 18:40:15

+0

我知道這兩個...它沒有插入,所以嘗試儘量減少代碼..我試着用報價3次,但它從來沒有工作......但現在「出於某種原因」它的工作..我剛剛重新啓動我的個人電腦,它開始迴應罰款..那些是我花了3個小時試圖解決這個問題 - 謝謝 – bakriawad 2014-12-04 18:42:03

2

您不能只將您的變量連接到SQL查詢字符串,並期望它工作。您需要在字符串值附加引號,並確保每個字符都被正確格式化/轉義。

$query = "INSERT INTO net_users VALUES (NULL,'$fname','$mname','$lname','$dob','$uname','$pasw','$phone1','$phone2','$email',NULL,NULL,NULL,'$date');"; 

雖然,我不建議做這種方式。如果您將用戶輸入連接到SQL查詢中,您剛剛打開了SQL注入的大門。你想要做的是使用「準備好的陳述」。你要做的是將?添加到你想要變量去的查詢中。然後這些變量被傳遞給一個單獨的函數。沒有引用,沒有轉義,沒有SQL注入的擔憂。

$mysqli = new mysqli('localhost','root','','wisdom') or die("CONNECTION ERROR"); 
$query = $mysqli->prepare('INSERT INTO net_users VALUES (NULL,?,?,?,?,?,?,?,?,?,NULL,NULL,NULL,?)'); 

// No quoting or escaping needed, this passes the values separate from the query 
$query->bind_param('ssssssssss', $fname, $mname, $lname, $dob, $uname, $pasw, $phone1, $phone2, $email, $date); 

// This actually runs the query 
$query->execute(); 
+1

絕對是永久解決這個問題的正確方法。 – tadman 2014-12-04 18:41:08

+0

我知道real_escape_string,但這是一個奇怪的..我看到它的其他地方,但現在它吸引了我的眼睛!你能給我這個方法的名稱(或鏈接),所以我可以更詳細地閱讀它嗎? – bakriawad 2014-12-04 18:48:09

+0

你不應該再使用'real_escape_string'。我正在使用的是所謂的「準備好的陳述」。看看這個:http://php.net/manual/en/mysqli.quickstart.prepared-statements.php另見http://php.net/manual/en/mysqli.prepare.php和http:// php .net/manual/en/mysqli-stmt.bind-param.php – 2014-12-04 18:50:54