2012-07-25 30 views
0

如何使用INSERT INTO On Duplicate Key UPDATE進行表單輸入?我在網上找到的所有例子都有計數器或預定值。使用INSERT INTO在表單輸入的重複鍵UPDATE

我已經能夠使用標準的UPDATESET方法讓我的代碼工作(感謝一些真正有用的成員),但我的表格確實需要使用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()); 
}   
?> 

,我用以前自動插入每個字段的代碼是:

$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 - 我肯定會盡快做到這一點,只要我能夠得到這個工作:-)我以前的問題之一是由別人在評論中回答 - 我應該接受,即使實際答案是不正確的? – 2012-07-25 22:54:28

+0

如果沒有人在合理的時間後回答,並且您找到了另一個解決方案,那麼您應該發佈自己的正確解決方案並接受該解決方案。這確保將來的搜索者找到他們需要的答案! – 2012-07-26 01:04:49

+0

你是對的,我只是這麼做的:-D – 2012-07-26 02:34:24

回答

2

的語法高亮顯示您在您的問題是:

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

這需要一個單引號:

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

您還應該注意,mysql_*函數已被棄用,您不應該使用它們。此外,您的原始代碼已廣泛開放給SQL注入。

有關重複鍵更新,您添加到您的SQL查詢,接着要更新所有column = value領域:

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

這樣做:-D感謝您捕捉:-)現在,它的工作,讓我意識到,我真的需要使用'在重複密鑰更新'我相應地編輯了這個問題。 – 2012-07-25 18:09:23

+0

我也非常感謝您指出其他問題,並且我將研究如何修改代碼以儘快防止注入。我不確定你的意思,但是因爲我使用的代碼是基於W3schools的代碼,我不能在他們的棄用函數列表中找到任何似乎是問題的東西。它會更好地使用: $ result = @mysql_query($ qry); \t if($ result){ \t \t exit(); \t} else { \t \t die('Error:'。mysql_error()); \t} 相反的: 如果 { 模具(的mysql_query($的SQL,$ CON)!)( '錯誤:'。mysql_error()); } – 2012-07-25 18:36:35

+0

不,那你就是在壓制錯誤。你應該使用['PDO'](http://www.php.net/PDO)。有很多關於stackoverflow和文檔的例子讓你開始。 – nickb 2012-07-25 18:38:30

0

確保你逃避你的表單輸入。現在您可以開始使用SQL注入。至少使用類似mysql_real_escape_string的東西,或者使用is_numeric來確保數字值不是SQL。非常危險的代碼,因爲它正在採取任何用戶類型並暴露您的數據庫。

+0

感謝您的建議。我將研究如何修改代碼以儘快防止注入:-) – 2012-07-25 18:38:54