我试图只使用更改的值来更新表,因此要做到这一点,我需要删除数组中的任何空白值。我已经用完成了
$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;