无法获取更新查询以从内爆阵列运行

时间:2015-02-18 17:16:44

标签: php mysql arrays

我正在尝试仅使用更改的值更新表,因此要执行此操作,我需要删除数组中空白的任何值。我用

完成了这个
$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这两个返回我期望的结果(排名是字段​​名称,O-8是新值):

  

string(6)“rank

  

string(3)“O-8”

但是,我正在尝试创建UPDATE查询:

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

回应这一点给了我以下内容:

  

更新personnel SET(-8)WHERE user_id ='1'

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

感谢。

编辑: var_dump($ fields):

  

string(6)“rank

的var_dump($ fields_data):

  

string(3)“O-8”

EDIT2:

所以我将fields_data行更改为:

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

并且''现在出现在预期值附近。但是,查询仍然无法正常工作。我将查询更改为:

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

它工作正常,所以我认为问题在于以这种方式使用UPDATE是不正确的。如果有人对如何通过迭代数组来创建INSERT语句有任何想法。

感谢。

1 个答案:

答案 0 :(得分:0)

通过使用一些自定义函数来隐藏和包装列名及其关联值,从而保持简单。它比手动连接它更不容易出错。

/**
 *  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;