8

ユーザー用に複数ステップのフォームを作成しています。一部またはすべてのフィールドを更新することが許可されます。したがって、値を送信し、設定されているかどうかを確認し、設定されている場合はUPDATE. これが私がこれまでに持っているものです:

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しかし、値がわからない場合は、どのようにステートメントを書くのでしょうか?

私がこれについて完全に間違っている場合は、正しい方向に向けてください。ありがとう。

4

2 に答える 2

6

まず、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 :)
于 2013-03-08T22:56:55.350 に答える
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++;
    }
  }
}
于 2013-03-08T22:57:22.263 に答える