2013-03-08 19 views
6

我爲我的用戶創建了多步表單。他們將被允許更新任何或所有的字段。所以,我需要發送這些值,檢查它們是否已設置,如果有,請運行UPDATE。以下是我迄今爲止:更新使用PDO的數組

public function updateUser($firstName, $lastName, $streetAddress, $city, $state, $zip, $emailAddress, $industry, $password, $public = 1, 
    $phone1, $phone2, $website,){ 

    $updates = array(
     'firstName'    => $firstName, 
     'lastName'    => $lastName, 
     'streetAddress'   => $streetAddress, 
     'city'     => $city, 
     'state'     => $state, 
     'zip'     => $zip, 
     'emailAddress'   => $emailAddress, 
     'industry'    => $industry, 
     'password'    => $password, 
     'public'    => $public, 
     'phone1'    => $phone1, 
     'phone2'    => $phone2, 
     'website'    => $website, 

); 

這裏是我的PDO(好了,開始嘗試)

$sth = $this->dbh->prepare("UPDATE user SET firstName = "); //<---Stuck here 
    $sth->execute(); 
    $result = $sth->fetchAll(PDO::FETCH_ASSOC); 
    return $result; 

基本上,我怎麼可以創建UPDATE語句,因此只將更新項目數組不是NULL

我想過運行foreach循環是這樣的:

foreach($updates as $key => $value) { 
     if($value == NULL) { 
      unset($updates[$key]); 
     } 
    } 

,但我會怎麼寫prepare聲明,如果我不能確定的價值觀?

如果我對這個問題完全錯誤,請指出正確的方向。謝謝。

+3

你可以使用'SET firstName = IFNULL(?,firstName)',參見http://stackoverflow.com/question s/2675968/sql-how-can-i-update -a-value-on-a-column-only-if-that-value-is-null – mario 2013-03-08 22:54:29

+0

@mario謝謝,好主意! – hek2mgl 2013-03-08 22:55:26

+0

@mario感謝您的提示!如果'IFNULL(NULL,10);'返回'10',我不確定這會對我的情況有所幫助,但我仍然需要知道'10'的值,對嗎?我只是試圖阻止'UPDATE'發生,如果一個項目的值是'NULL' – 2013-03-08 23:04:03

回答

4

首先,使用array_filter刪除所有NULL值:

$updates = array_filter($updates, function ($value) { 
    return null !== $value; 
}); 

其次,綁定參數,使您的生活輕鬆了許多:

$query = 'UPDATE table SET'; 
$values = array(); 

foreach ($updates as $name => $value) { 
    $query .= ' '.$name.' = :'.$name.','; // the :$name part is the placeholder, e.g. :zip 
    $values[':'.$name] = $value; // save the placeholder 
} 

$query = substr($query, 0, -1).';'; // remove last , and add a ; 

$sth = $this->dbh->prepare($query); 

$sth->execute($values); // bind placeholder array to the query and execute everything 

// ... do something nice :) 
+0

謝謝,我認爲這可能會伎倆。我會玩弄它,看看。 – 2013-03-08 23:05:26

+1

工作很好,謝謝!我剛剛修改了這個'$ updates = array_filter($ updates,function($ value){ return null!== $ value; });'to'$ updates = array_filter($ updates,'strlen');'based在這裏的評論:http://www.php.net/manual/en/function.array-filter.php#111091 – 2013-03-09 00:19:16

+1

@relentless好吧,太棒了!你也知道發生了什麼?我認爲這比代碼的工作更重要。 – 2013-03-09 08:44:26

1

以下可以進行優化:

$i = 0; $query = array(); 
foreach($updates as $key => $value) { 
    if ($value != NULL) { 
     $query[] = "{$key} = :param_{$i}"; 
     $i++; 
    } 
} 

if (! empty($query)) { 
    $finalQuery = implode(",", $query); 
    $sth = $this->dbh->prepare('UPDATE user SET ' . $finalQuery); 

    $i = 0; 
    foreach($updates as $key => $value) { 
    if ($value != NULL) { 
     $sth->bindParam(':param_'.$i, $value, PDO::PARAM_STR); 
     $i++; 
    } 
    } 
} 
+0

感謝您的答案 – 2013-03-08 23:06:37