Php 尝试更新时发生PDO更新错误

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

我正在尝试更新用户信息,它工作正常,但是

当我只更新单列时有5列,其他四列值变为空(它覆盖以前的值)


这是我更新用户信息的代码

当我只更新一列时,其他四列值应该相同


有人能帮我做点类似的事情吗

$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;
    }