2012-07-25 5 views
0

양식 입력에 어떻게 INSERT INTO On Duplicate Key UPDATE을 사용합니까? 온라인에서 찾은 모든 예는 카운터 또는 미리 결정된 값입니다.INSERT INTO를 사용할 때 양식 입력을위한 중복 키 UPDATE

UPDATE 표준과 SET 메서드를 사용하여 코드를 만들 수 있었지만 (내게 도움이되는 회원 덕분에) INSERT INTO On Duplicate Key UPDATE을 사용해야했습니다.

'user_id'은 모든 테이블에서 고유 한 기본 키이며 계정 테이블을 제외한 모든 외부 키입니다.

<?php 
session_start(); 
require_once('config.php'); 
require_once('open_db.php');  

$setlist=''; 
foreach ($_POST as $key=>$value) { 
    $setlist.=$key .'=\''.$value.'\','; 
} 

$setlist=substr($setlist, 0, -1); 
$user_id=$_SESSION['SESS_USER_ID']; 
$sql='UPDATE style_test SET '.$setlist.' WHERE user_id='.$user_id; 

if (!mysql_query($sql,$con)) { 
    die('Error: ' . mysql_error()); 
}   
?> 

I마다 자동으로 필드를 삽입하기 위해 이전에 사용 된 코드는 다음과 같습니다 이것은을 할 필요가

$sql='UPDATE style_test SET ;.$setlist.' WHERE user_id='.$user_id; 
          ^
          Here 

: 문제가 어디에

$fieldlist=$vallist=''; 
foreach ($_POST as $key => $value) { 
    $fieldlist.=$key.','; 
    $vallist.='\''.urlencode($value).'\','; 
} 
$fieldlist=substr($fieldlist, 0, -1); 
$vallist=substr($vallist, 0, -1); 

$user_id=$_SESSION['SESS_USER_ID']; 
$fieldlist.=', user_id'; 
$vallist.=','.$user_id; 

$qry='INSERT INTO style_test1 ('.$fieldlist.') VALUES ('.$vallist.')'; 
+0

@ Nathaniel Ford - 나는 이것이 작동하도록하자마자 분명히 그렇게 할 것이다 :-) 나의 이전의 질문 중 하나는 의견에있는 누군가 다른 사람이 대답했다. 나는 실제 대답이 부정확 한가? –

+0

아무도 합리적인 시간 후에 답변을 못했고 다른 해결책을 찾은 경우 자신의 올바른 해결책을 게시하고 동의해야합니다. 이것은 미래의 수색자가 그들이 원하는 답을 찾을 수있게합니다! –

+0

당신은 절대적으로 옳았습니다. 그리고 저는 방금했습니다 :-D –

답변

2

구문 하이 라이터를 보여줍니다 작은 따옴표 :

$sql='UPDATE style_test SET '.$setlist.' WHERE user_id='.$user_id; 

mysql_* 함수는 더 이상 사용되지 않으므로 사용해서는 안됩니다. 또한 원래 코드는 SQL 주입에 대해 열려 있습니다.

$sql='INSERT INTO style_test SET ' . $setlist.' WHERE user_id = ' . $user_id. ' ON DUPLICATE KEY UPDATE ' . $setlist; 
+0

그랬습니다 :-D 그걸 잡아 주셔서 감사합니다 .--) 이제는 그것이 작동하고있어, 제가 정말로 '중복 키 업데이트' 그에 따라 질문을 편집했습니다. –

+0

다른 문제를 지적 해 주셔서 감사 드리며 코드를 수정하여 인젝션을 가능한 빨리 예방하는 방법을 살펴 보겠습니다. 내가 사용한 코드가 W3schools 제안 코드를 기반으로하고 deprecated 함수 목록에서 문제가되는 것을 찾지 못했기 때문에 당신이 mysql_ * 함수에 대해 어떻게 생각하는지 모르겠다. 다음과 같이 사용하는 것이 더 낫습니다 : $ result = @mysql_query ($ qry); \t if ($ result) { \t \t exit(); \t} else { \t \t die ('Error :'. mysql_error()); \t} 대신 : 경우 { 다이 (는 mysql_query ($의 SQL, $ 콘)!) ('오류 :'. mysql_error를()); } –

+0

아니요, 오류를 표시하지 않습니다.['PDO'] (http://www.php.net/PDO)를 사용해야합니다. stackoverflow와 docs에 대한 많은 예제가 여러분을 시작하게합니다. – nickb

0

당신이 당신의 폼 입력을 탈출하고 있는지 확인하십시오 : 중복 키 업데이트에 대한 내용은

, 당신은 업데이트 할 모든 column = value 필드 다음에 당신의 SQL 쿼리에 있음을 추가 할 수 있습니다. 지금 SQL 인젝션에 대해 열려 있습니다. 최소한 mysql_real_escape_string과 같은 것을 사용하거나 is_numeric을 사용하여 숫자 값이 SQL이 아닌 숫자인지 확인하십시오. 매우 위험한 코드는 사용자가 입력하고 DB를 노출하기 때문에 발생합니다.

+0

제안에 감사드립니다. 나는 주사를 최대한 빨리 방지하기 위해 코드를 수정하는 방법을 살펴볼 것이다 :-) –

관련 문제