2011-10-03 57 views
0

我試圖將表單數據插入MySQL 4.1數據庫。我遇到的問題是包含空格的表單字段在插入前被截斷。 POST變量是完整的,空格和全部。只是在某處被切斷。例如,「南太浩湖」簡稱爲「南」。帶破折號的郵政編碼和電話號碼也很好。我正在使用的網站由Yahoo Small Business託管,他們仍在使用MySQL 4.1。我不知道這是否是問題,但我確實知道我從未遇到過使用MySQL 5+的問題。用戶填寫表單以添加新成員。一旦提交,表單數據發佈到另一個頁面進行處理:用空格向mysql插入表單值4.1

$k = array(); 
$v = array(); 
$first_name = $_POST['first_name']; 
$last_name = $_POST['last_name']; 

$result = mysql_query("SELECT * FROM members WHERE first_name='$first_name' AND last_name='$last_name'"); 
if(mysql_num_rows($result)>0){ 
    mysql_free_result($result); 
    exit("Duplicate User in Database"); 
} 
mysql_free_result($result); 

array_pop($_POST);//Don't need the Submit value 

foreach($_POST as $key=>$value){ 
array_push($k, "$key"); 
array_push($v, "$value"); 
} 

$fields = implode(", ", $k); 
$values = array(); 
foreach($v as $key=>$value){ 
    array_push($values, '"'.$value.'"'); 
} 
$values_string = implode(", ", $values); 

$result = mysql_query("INSERT INTO members($fields) VALUES($values_string)"); 

我敢肯定有這樣做的更好的辦法,但我仍然在路上學習曲線。請指出我思想中的任何明顯的缺陷。 任何建議,非常感謝。

編輯:在MySQL中的字段類型是正確的,足夠長。例如,City的字段被設置爲VARCHAR(30)。

謝謝了, 馬克

+0

爲什麼你使用一個危險的舊的mysql版本? – 2011-10-03 02:30:37

+1

我不知道完整的答案。爲了讓你在調試時提前打開它,試着打印你的INSERT語句的內容以確保它真的是你想要的:'echo「INSERT INTO members($ fields)VALUES($ values_string)」;' – Mansour

+0

有些人會發布此代碼是如何隨時打開SQL注入的,哦,那裏是:-) – 2011-10-03 02:39:58

回答

0

此代碼是驚人,不安全的 - 你正在做用戶提供的值,並直接plopping他們進入你的SQL語句沒有任何消毒。對於以這種方式插入查詢的任何內容,您應該調用http://php.net/manual/en/function.mysql-real-escape-string.php(使用PDO的參數化查詢更好)。

您還做出了一些假設,例如$ _POST總是按某種方式排列(這是有保證的嗎?),並且您的表單中包含字段的表單中的元素數量完全相同,並且它們是命名相同。編寫代碼是很多開始程序員所做的事情 - 它感覺高效,對吧?但最後這是一個壞主意。只要明確並列出這些字段 - 例如

$field1 = $_POST['field1']; 
$field2 = $_POST['field2']; 
$sql = "insert into mytable (field1, field2) values ('" . mysql_real_escape_string($field1) . "', '" . mysql_real_escape_string(field2) . "')"; 
mysql_query($sql); 

我還沒有談到爲什麼那些東西在第一空間切斷,因爲這將意味着你的代碼,你有它呈現爲挽救。不是。我感覺到,如上所述重做它可能會使問題消失。

0
<?php 

// Remember to always escape user input before you use them in queries. 
$first_name = mysql_real_escape_string($_POST['first_name']); 
$last_name = mysql_real_escape_string($_POST['last_name']); 

$result = mysql_query("SELECT * FROM members WHERE first_name='$first_name' AND last_name='$last_name'"); 
if (mysql_num_rows($result) > 0) { 
    mysql_free_result($result); 
    exit("Duplicate User in Database"); 
} 
mysql_free_result($result); 

// I removed your loop around $_POST as it was a security risk, 
// and could also become non-working. (What would happen if the order 
// of the $_POST keys were changed?) 
// Also the code become clearer this way. 

$result = mysql_query("INSERT INTO members(first_name, last_name) VALUES('$first_name', '$last_name')");