2012-09-05 40 views
6

在試圖創建一個簡單的PHP PDO更新函數,如果該字段未找到將插入它,我創建了這個小片段。PHP PDO簡單的插入或更新功能

function updateorcreate($table,$name,$value){ 
    global $sodb; 
    $pro = $sodb->prepare("UPDATE `$table` SET value = :value WHERE field = :name"); 
    if(!$pro){ 
     $pro = $sodb->prepare("INSERT INTO `$table` (field,value) VALUES (:name,:value)"); 
    } 
    $pro->execute(array(':name'=>$name,':value'=>$value)); 
} 

如果更新功能將會與if(!$pro);上班這並不雖然檢測我們如何使這一個工作。

+2

+1使用PDO。 –

+1

我; m仍然習慣它,但不回去mySQL –

+1

-1 [使用'global'](http://stackoverflow.com/a/11923384/508666) – PeeHaa

回答

14

您正在將$pro分配給prepare,而不是執行語句。

話雖如此,如果你使用mysql,你可以使用insert... on duplicate key update語法。

insert into $table (field, value) values (:name, :value) on duplicate key update value=:value2 

不能使用相同的綁定PARAM兩次,但您可以設置兩個綁定PARAMS爲相同的值。

編輯:這個mysql語法將只有工作的地方存在一個鍵(主鍵或另一個唯一鍵)並且會導致插入失敗。

+0

我正在使用mySQL,但這是一個錯誤 –

+0

這是我試過的:function updateorcreate($ table,$ name,$ value){ \t global $ sodb; (「INSERT INTO $ table(field,value)values(:name,:value)ON DUPLICATE KEY update value =:value2」); (數組(':name'=> $ name,':value'=> $ value,':value2'=> $ value)); } –

+0

@RobinKnight對不起,我應該提到它的權利,你確實有一個唯一的約束設置在表'字段'是嗎? – Fluffeh

0

您首先需要執行它。

除此之外,這是做這件事的一個狡猾的方式。最好開始一個事務,做一個SELECT然後確定做什麼(INSERT或UPDATE)。只要檢查UPDATE查詢是否成功就不足夠,在沒有找到任何行時也會成功。

+0

好吧,我試圖看看我們是否可以繞過這一步,但如果它不安全,那麼我不會 –

+0

不,這是不安全的。 – Sherlock

+0

'SELECT'也是一個非常不好的方式。更好的辦法是在該字段上使用唯一鍵,然後使用INSERT ... ON DUPLICATE KEY UPDATE ...。 – cHao

0

嘗試,

PDO::exec() 

返回1。 2如果行已更新。

準備語句,

PDOStatement::execute() 

你可以試試,

PDOStement::rowCount()