2013-03-08 37 views
6

Tôi đang tạo biểu mẫu nhiều bước cho người dùng của mình. Họ sẽ được phép cập nhật bất kỳ hoặc tất cả các lĩnh vực. Vì vậy, tôi cần phải gửi các giá trị, kiểm tra xem chúng có được đặt hay không và nếu có, hãy chạy UPDATE. Dưới đây là những gì tôi có cho đến nay:CẬP NHẬT một mảng bằng 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, 

); 

Đây là PDO của tôi (cũng, nỗ lực bắt đầu)

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

Về cơ bản, làm thế nào tôi có thể tạo báo cáo kết quả UPDATE vì vậy nó chỉ cập nhật các mục trong mảng không phải là NULL?

Tôi nghĩ về việc chạy một vòng lặp foreach như thế này:

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

nhưng làm thế nào tôi sẽ viết báo cáo kết quả prepare nếu tôi không chắc chắn về giá trị?

Nếu tôi nói về điều này hoàn toàn sai, hãy chỉ cho tôi đi đúng hướng. Cảm ơn.

+3

Bạn có thể sử dụng 'SET firstName = IFNULL (?, firstName)', xem http://stackoverflow.com/question s/2675968/sql-how-can-i-update-a-giá trị-trên-một-cột-chỉ-nếu-giá trị-là-null – mario

+0

@mario Cảm ơn, ý tưởng tốt! – hek2mgl

+0

@mario Cảm ơn bạn đã tip! Tôi không chắc chắn rằng sẽ giúp trường hợp của tôi, nếu 'IFNULL (NULL, 10);' trả về '10', tôi vẫn cần phải biết giá trị cho' 10', đúng không? Tôi chỉ đơn giản là cố gắng để ngăn chặn 'UPDATE' xảy ra nếu giá trị của một mục là' NULL' –

Trả lời

4

Trước hết, sử dụng array_filter để loại bỏ tất cả các giá trị NULL:

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

Thứ hai, các thông số ràng buộc, mà làm cho dễ dàng hơn bạn sống rất nhiều:

$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

Cảm ơn, tôi nghĩ rằng có thể làm các trick. Tôi sẽ chơi đùa với nó và xem. –

+1

Làm việc tuyệt vời, cảm ơn! Tôi vừa sửa đổi '$ updates = array_filter ($ update, function ($ value) { return null! == $ value; });' tới '$ updates = array_filter ($ updates, 'strlen');' dựa trên nhận xét ở đây: http://www.php.net/manual/en/function.array-filter.php#111091 –

+1

@ không liên tục ok, tuyệt vời! Và bạn cũng biết điều gì đang xảy ra? Tôi nghĩ điều đó quan trọng hơn nếu mã hoạt động hay không. –

1

dưới đây có thể được tối ưu hóa:

$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

Cảm ơn câu trả lời –

Các vấn đề liên quan