我正在为我的用户创建一个多步骤表单。他们将被允许更新任何或所有字段。所以,我需要发送值,检查它们是否已设置,如果是,请运行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
语句?
如果我完全错了,请指出正确的方向。感谢。
答案 0 :(得分:5)
首先,使用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 :)
答案 1 :(得分: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++;
}
}
}