我正在尝试仅使用更改的值更新表,因此要执行此操作,我需要删除数组中空白的任何值。我用
完成了这个$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)WHEREuser_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语句有任何想法。
感谢。
答案 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;