使用内爆数组PHP更新MySQL记录

时间:2011-03-09 18:02:28

标签: php mysql

我目前正在尝试更新MySQL数据库中的现有记录。在将更新的信息发送到数据库之前,将它放在一个数组中,在使用implode函数之前运行验证函数,以使我能够将数组插入数据库。这在添加新用户时工作正常,但我在使用内爆数组进行UPDATE查询时遇到困难。

我可以从内爆数组中指定单个字符串,以便我可以将用户名设置为原始数组中包含的用户名字符串吗?

我目前有这样的东西给我一个SQL错误 - 但是,我从没想到这会起作用,因为SQL语法是错误的。

public function editUser($array, $userID) {
    $edited = 'User Ammended';
    $array['password'] = $this->hashPassword($array['password']);
    $implodeArray = '"'.implode( '","', $array ).'"';
    $sql = ('UPDATE user (email, password, firstName, lastName, officeID, departmentID, managerID, roleID, username) WHERE userID=$userID VALUES ('.$implodeArray.')');
    mysql_query($sql,$this->_db) or die(mysql_error());
    mysql_close();
}

5 个答案:

答案 0 :(得分:9)

这应该有效:

public function editUser($array, $userID) {
        $edited = 'User Ammended';
        $array['password'] = $this->hashPassword($array['password']);
        /*Assuming array keys are = to database fileds*/
        if (count($array) > 0) {
            foreach ($array as $key => $value) {

                $value = mysql_real_escape_string($value); // this is dedicated to @Jon
                $value = "'$value'";
                $updates[] = "$key = $value";
            }
        }
        $implodeArray = implode(', ', $updates);
        $sql = ("UPDATE user WHERE userID=$userID SET $implodeArray");
        mysql_query($sql,$this->_db) or die(mysql_error());
        mysql_close();
}

答案 1 :(得分:1)

首先关闭。请停止使用mysql *函数。 PDO有许多显着的优点。

至于你的具体问题:

这不是一个有效的MySQL语句:

UPDATE table (col1, col2) WHERE 1 VALUES('foo', 'bar')

您需要使用以下内容:

UPDATE table SET col1 = 'foo', col2 = 'bar' WHERE 1

使用PDO,这仍然可以使用数组输入,因为PDOStatement :: execute()方法接受一个关联的值数组,其中键对应于传递给PDO :: prepare的SQL语句中的占位符。

答案 2 :(得分:1)

我将专注于修复PHP嵌入式SQL语法错误。

首先,让我们看看法律语法: http://dev.mysql.com/doc/refman/5.1/en/update.html

接下来,让我们看看破碎的表格:

$sql = ('UPDATE user (email, password, firstName, lastName, officeID, departmentID, managerID, roleID, username) WHERE userID=$userID VALUES ('.$implodeArray.')');

最后,由于数组已经是一个有序列表(你正在破坏它),让我们修复并替换为:

$sql = "UPDATE user 
SET email = '$array[0]', 
password = '$array[1]', 
firstName = '$array[2]', 
lastName = '$array[3]', 
officeID = '$array[4]', 
departmentID = '$array[5]', 
managerID = '$array[6]', 
roleID = '$array[7]', 
username = '$array[8]' 
WHERE userID = '$userID.'";

我还假设输入值已经过转义,过滤和检查。

更新: 如果可能,在您的环境/框架中,请使用预准备语句。 https://secure.php.net/manual/en/mysqli.quickstart.prepared-statements.php

答案 3 :(得分:0)

假设匿名函数的PHP> = 5.3(否则,回调必须写为自由函数或字符串):

$implodeArray = implode(',',
    array_map(
        function($item) { return "'".mysql_real_escape_string($item)."'"; },
        $array));

不要永远将内容放入尚未首先转义的查询中!

答案 4 :(得分:0)

这假设您的信息来自一个表单(method = POST),其中输入框的字段名称与代码中的字段名称相同,并且它有一个隐藏的输入'userId',用于确定'where '条款。

它使用PDO和绑定参数。

$query = "update users set ";

foreach($_POST as $key=>$value) {
    if($key != 'userId') {
    $inputs[] = " $key = ? ";
    $valueArray[] = $value; }
    }
$query .= implode( ',', $inputs );

$query .= " where id = " . $_POST['userId'];

$sth = $pdo->prepare($query);
$sth->execute($valueArray);