Php 尝试更新时发生PDO更新错误
我正在尝试更新用户信息,它工作正常,但是 当我只更新单列时有5列,其他四列值变为空(它覆盖以前的值)Php 尝试更新时发生PDO更新错误,php,mysql,pdo,Php,Mysql,Pdo,我正在尝试更新用户信息,它工作正常,但是 当我只更新单列时有5列,其他四列值变为空(它覆盖以前的值) 这是我更新用户信息的代码 当我只更新一列时,其他四列值应该相同 有人能帮我做点类似的事情吗 $sql = "UPDATE user SET "; foreach($_POST as $k => $v) { if(empty($v)) continue; $sql .= "$k = :$k"; $stmt->bindParam(':$k', $v, PDO
这是我更新用户信息的代码
当我只更新一列时,其他四列值应该相同
有人能帮我做点类似的事情吗
$sql = "UPDATE user SET ";
foreach($_POST as $k => $v) {
if(empty($v)) continue;
$sql .= "$k = :$k";
$stmt->bindParam(':$k', $v, PDO::PARAM_STR);
}
$sql .= " WHERE username = :username";
当然,它需要做更多的事情(例如检查它是否是PDO::PARAM_STR)
此外,还建议对适当的列进行“映射”
更新
(以下内容不能按原样工作-只是给你一些想法)
一个高级解决方案可能是使用*update方法扩展PDO类**
public function update($table, $pairs = array(), $condition = "", $mode = null){
if($mode == null)
$mode = self::STMT_UPDATE;
$sql = $this->buildStatement($table, $pairs, $mode);
$params = array();
$sql.= $condition;
if($mode == self::STMT_UPDATE)
$params = array_merge($pairs, $params);
$stmt = $this->prepare($sql);
return $stmt->execute($params);
}
/**
* INTERNAL method to build up all statements
*
* @param string $table
* @param array $pairs
* @param number $statementType
* @throws Exception
* @return string
*/
private function buildStatement($table, $pairs = array(), $statementType = 0){
if(!is_array($pairs) && ($statementType & ~9)) throw new \Exception("buildStatement failed: parameter \$pairs is invalid");
if(empty($pairs) && ($statementType & ~9)) throw new \Exception("buildStatement failed: parameter \$pairs is empty");
$sql = "";
switch ($statementType) {
default:
case self::STMT_SELECT:
$sql.= "SELECT ";
if(count($pairs) > 0)
$sql.= implode(', ', $pairs);
else
$sql.= '*';
$sql.= ' FROM '.$table;
break;
case self::STMT_INSERT:
$tableFields = array_keys($pairs);
$sql.= 'INSERT INTO ' . $table . ' (`' . implode('`, `', $tableFields) . '`) VALUES (:' . implode(', :', $tableFields) . ')';
break;
case self::STMT_UPDATE:
$setQuery = array();
foreach ($pairs as $field => &$value){
$setQuery[] = '`' . $field . '` = :' . $field;
}
$sql.= 'UPDATE ' . $table . ' SET ' . implode(', ', $setQuery);
break;
case self::STMT_UPDATEADV:
foreach ($pairs as $field => &$value){
$setQuery[] = '`' . $field . '` = ' . $value;
}
$sql.= 'UPDATE ' . $table . ' SET ' . implode(', ', $setQuery);
break;
case self::STMT_DELETE:
$sql.= 'DELETE FROM ' . $table;
break;
}
return $sql;
}
因此,您需要更新多列,而不是使用空值进行重写。我更希望只绑定那些要更新的参数,并根据使用
var_dump(get_defined_vars())更改update语句代码>语句,检查您是否按预期在$\u POST
中获取值。@如果我更新全名,并将其他输入留空,则OleK代码应仅更新全名
public function update($table, $pairs = array(), $condition = "", $mode = null){
if($mode == null)
$mode = self::STMT_UPDATE;
$sql = $this->buildStatement($table, $pairs, $mode);
$params = array();
$sql.= $condition;
if($mode == self::STMT_UPDATE)
$params = array_merge($pairs, $params);
$stmt = $this->prepare($sql);
return $stmt->execute($params);
}
/**
* INTERNAL method to build up all statements
*
* @param string $table
* @param array $pairs
* @param number $statementType
* @throws Exception
* @return string
*/
private function buildStatement($table, $pairs = array(), $statementType = 0){
if(!is_array($pairs) && ($statementType & ~9)) throw new \Exception("buildStatement failed: parameter \$pairs is invalid");
if(empty($pairs) && ($statementType & ~9)) throw new \Exception("buildStatement failed: parameter \$pairs is empty");
$sql = "";
switch ($statementType) {
default:
case self::STMT_SELECT:
$sql.= "SELECT ";
if(count($pairs) > 0)
$sql.= implode(', ', $pairs);
else
$sql.= '*';
$sql.= ' FROM '.$table;
break;
case self::STMT_INSERT:
$tableFields = array_keys($pairs);
$sql.= 'INSERT INTO ' . $table . ' (`' . implode('`, `', $tableFields) . '`) VALUES (:' . implode(', :', $tableFields) . ')';
break;
case self::STMT_UPDATE:
$setQuery = array();
foreach ($pairs as $field => &$value){
$setQuery[] = '`' . $field . '` = :' . $field;
}
$sql.= 'UPDATE ' . $table . ' SET ' . implode(', ', $setQuery);
break;
case self::STMT_UPDATEADV:
foreach ($pairs as $field => &$value){
$setQuery[] = '`' . $field . '` = ' . $value;
}
$sql.= 'UPDATE ' . $table . ' SET ' . implode(', ', $setQuery);
break;
case self::STMT_DELETE:
$sql.= 'DELETE FROM ' . $table;
break;
}
return $sql;
}