无法从内爆数组中获取要运行的更新查询


Cannot get update query to run from an imploded array

我试图只使用更改的值来更新表,因此要做到这一点,我需要删除数组中的任何空白值。我已经用完成了

$edit_data = array_filter($edit_data, "check_if_empty");

其中,如果值不为空,check_if_empty将返回true。这很好,然后我这样做是为了将数据放在一种可以进行SQL查询的格式中:

$fields = "`" . implode("`, `", array_keys($edit_data)) . "`";
$fields_data   = implode("'", $edit_data);

var_dumping这两者都会返回我所期望的结果(rank是字段名,O-8是新值):

string(6)"rank"

字符串(3)"O-8"

然而,我这样做是为了尝试创建UPDATE查询:

$query = "UPDATE `personnel` SET ({$fields}) VALUES ({$fields_data}) WHERE `user_id` = '$user_id'";

呼应这一点给了我以下信息:

更新personnel集合(-8),其中user_id='1'

在这种情况下,user_id是1,所以这是可以的。然而,我不确定为什么字段和fields_data部分完全损坏。显然,这个查询没有运行,所以如果有人有任何建议,那就太好了。

谢谢。

编辑:var_dump($fields):

string(6)"rank"

var_dump($fields_data):

字符串(3)"O-8"

第2版:

所以我把fields_data行改为:

$fields_data = "'" . implode("'", $edit_data) . "'";

而"现在正按预期出现在该值周围。但是,查询仍然不起作用。我将查询更改为:

$query = "INSERT INTO `personnel` ({$fields}) VALUES ({$fields_data})";

而且它运行得很好,所以我认为问题在于以这种方式使用UPDATE是不正确的。如果有人知道如何通过遍历数组来创建INSERT语句,那就太好了。

谢谢。

使用几个自定义函数对列名及其关联值进行内爆和包装,以保持简单。它比手动连接它们更不容易出错。

/**
 *  Implode and wrap array keys
 */
function implodeKeysWrapped($before, $after, $glue, $array) {
    $out = '';
    foreach ( $array as $k => $v ) {
        $out .= $before.$k.$after.$glue;
    }
    return substr($out, 0, -strlen($glue));
}
/**
 *  Implode and wrap array values
 */
function implodeWrapped($before, $after, $glue, $array) {
    $out = '';
    foreach ( $array as $item ){
        $out .= $before.$item.$after.$glue;
    }
    return substr($out, 0, -strlen($glue));
}
// For example...
$edit_data = array(
    'column1'   => 1,
    'column2'   => 'somestring',
    'column3'   => 'blah'
);
$fields = implodeKeysWrapped('`', '`', ',', $edit_data);
$fields_data = implodeWrapped("'", "'", ',', $edit_data);
$query = "INSERT INTO `personnel` (".$fields.") VALUES (".$fields_data.")";
echo $query;