2011-10-03 2 views
0

MySQL 4.1 DB에 양식 데이터를 삽입하려고합니다. 내가 겪고있는 문제는 공백을 포함하는 양식 필드가 삽입 전에 잘 렸습니다. POST 변수는 완료, 공백 및 모두입니다. 그냥 어딘가에서 끊어진다. 예를 들어, "South Lake Tahoe"는 단순히 "South"로 삽입됩니다. 우편 번호와 대시가있는 전화 번호도 좋습니다. 제가 작업하고있는 사이트는 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)"); 

내가이 일을 더 나은 방법이 확신 해요,하지만 난 길 학습 곡선에 여전히 해요 : 제출하면, 폼 데이터 처리를 위해 다른 페이지에 게시됩니다. 제 생각에 명백한 결함을 지적하십시오. 모든 의견을 크게 환영합니다.

EDIT : MySQL의 필드 유형이 정확하고 충분히 길다. 예를 들어, City 필드는 VARCHAR (30)로 설정됩니다.

덕분에 많이 마크

+0

왜 위험스럽게 오래된 MySQL 버전을 사용하고 있습니까? –

+1

나는 완전한 대답을 모른다. 디버깅에서 앞으로 나아가려면 INSERT 명령문의 내용을 출력하여 실제로 원하는 것을 확인해보십시오 :'echo "INSERT INTO members ($ fields) VALUES ($ values_string)";' – Mansour

+0

일부는 이 코드가 SQL 인젝션에 대해 언제든지 게시 할 수 있습니다. 오 그곳에는 :-) –

답변

0

이 코드는 엄청 시리 안전하지 않습니다 - 당신은 사용자가 제공 한 값을 복용하고 위생없이 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')");