2013-05-09 52 views
0

在我創建的表單上,表單通過Javascript spry驗證進行驗證,然後發送到一個php表單,該表單通過POST方法。PHP表單並不總是寫入數據庫

然後有一個sql查詢,如下所示將數據提交給數據庫。

$title = $_POST["title"]; 
$first_name = $_POST["first_name"]; 
$surname = $_POST["surname"]; 
$address1 = $_POST["address1"]; 
$address2 = $_POST["address2"]; 
$town = $_POST["town"]; 
$county = $_POST["county"]; 
$country = $_POST["countries"]; 
$telephone_home = $_POST["telephone-home"]; 
$telephone_mobile = $_POST["telephone-mobile"]; 
$comments = $_POST["comments"]; 
$letter = $_POST["q1-letter"]; 
$updates = $_POST["q1-updates"]; 
$paye = $_POST["PAYE"]; 

//establish connection 
$con= mysqli_connect("localhost","#######","###########","############"); 
// Check connection 
if (mysqli_connect_errno()) 
    { 
    echo "Failed to connect to MySQL: " . mysqli_connect_error(); 
    } 


mysqli_query($con,"INSERT INTO wp_donations (prefix, first_name, second_name, amount, address1, address2, citytown, county, country, email, comments, letter, updates, paye) 
    VALUES ('$title','$first_name','$surname','$amount2','$address1','$address2','$town','$county','$country','$email','$comments','$letter','$updates','$paye')"); 
mysqli_close($con); 

?> 

現在大多數時候這似乎工作得很好,而且我做的任何測試都能正常工作。然而,我的客戶報告說有數據庫中沒有顯示的表單條目。該表單用於處理付款,客戶通過數據庫中的信息和付款處理程序日誌交叉檢查付款。

我不能爲了我的生活弄清楚他們中的一些可能不會出現在數據庫中,因爲沒有通過這個php頁面來處理付款是沒有辦法的(它也包含支付處理組件)

可能有我在這裏失蹤的東西,可能允許付款被處理,但不會顯示在數據庫中?

您的幫助總是非常讚賞

+0

它可能是數據破壞你的SQL,你不使用mysql_escape_string(),切換到mysqli或PDO「準備」。 I.E.如果姓氏是奧尼爾 – Waygood 2013-05-09 09:35:10

+2

他正在使用mysqli,只是他沒有正確/安全地做它 – allen213 2013-05-09 09:35:50

+0

請告訴我你對SQL注入攻擊的瞭解... – 2013-05-09 09:36:07

回答

0

您需要連接變量

就像這個...

mysqli_query($con, "INSERT INTO wp_donations (prefix, first_name, second_name, amount, address1, address2, citytown, county, country, email, comments, letter, updates, paye) 
             VALUES ('".$title."','".$first_name."','".$surname."','".$amount2."','".$address1."','".$address2."','".$town."','".$county."','".$country."','".$email."','".$comments."','".$letter".','".$updates."','".$paye."')"); 
+0

,這不是錯誤的原因。如果你使用雙引號字符串,你可以像訪問變量一樣訪問變量 – 2013-05-15 00:56:57

1

你需要尋找到mysqli prepared statements

你只是服用後你得到它們的變量,這是一個壞主意。但是,除了SQL注入的潛力,讓我們來看看我相信這是發生了什麼,你的情況基本例如:

$x = $_POST['x']; 

$sql = "INSERT INTO `table` (`address`) VALUES ('$x')"; 

現在讓我們假設$x1234 Captain's Creek rd

您的查詢將現在這個樣子:

$sql = "INSERT INTO `table` (`address`) VALUES ('Captain's Creek rd')"; 

您是否在那裏看到問題? '在字符串中終止該字段和拖尾引用值的延遲字符串是語法錯誤,這將導致您的查詢失敗。

如果bind the parameters,你可以逃脫mysqli的輸入值:

$sql = $mysqli->prepare("INSERT INTO `table` (`address`) VALUES (?)"); 
$sql->bind_param("s", $x); 
$sql->execute(); 

如果你有問題隨時問,我可以更新。

+0

這是一個很好的答案,但請閱讀[This Link](http://php.net/manual/en/mysqli-stmt.bind- param.php)來更好地理解'bind_param'如何工作,如果你有一個更復雜的查詢。 – FireCrakcer37 2013-05-15 01:40:00

+0

這是在答案中鏈接。你應該看一看關於mysqli的完整教程,或者熟悉其他人關於防止注入的建議等。 – 2013-05-15 01:44:40