我正在开发一个PHP应用程序。它包含一个编辑数据库中用户的函数。该函数接受false
或值作为其参数; false
表示该字段应保留原样。
目前,我正在使用此代码:
function edit_user($id, $name = false, $key = false, $mode = false, $notes = false){
$changes = array();
$changestr = "";
$values = array();
if($name !== false){
$changes[] = "name=?";
$values[] = &$name;
}
// 3 more identical ifs
for($i = 0; $i < count($changes); $i++) $changestr .= 's';
$changestr .= 'i';
$values[] = &$id;
array_unshift($values, $changestr);
$query = $db_connection->prepare("UPDATE users SET " . join(",", $changes) . " WHERE userId=?");
call_user_func_array(array($query, "bind_param"), $values);
$query->execute();
return $query->affected_rows >= 1;
}
(是的,我知道这些值没有被转义,我在其他地方也这样做了。)
然而,某些东西在这里不起作用。我想要做的就是改进它只是有这样的查询:UPDATE users SET name=?,password=?,mode=?,notes=? WHERE userId=?
然后只需绑定字段名称,如果我需要保留原样。我问的是,这可能与mysqli有关吗?或者准备好的陈述是否打破了我的想法?
更新:我的意思是我可以像这样使用mysqli:
接受此查询:
UPDATE users SET name=?,password=?,mode=?,notes=? WHERE userId=?
更新一些值,但保留原样,如下所示:
UPDATE users SET name='Test',password=password,mode=mode,notes='asdf' WHERE userId=723
答案 0 :(得分:-1)
@ Pietu1998是的,它更清楚。
答案很简单:你不能这样做。但是,你可以通过一些技巧获得相同的结果,如创建像这样的函数
function buildSQLComparison($name,$value=false) {
return $name . '=' . ($value)?$value : $name;
}
function buildSQLComparisonForBinding($name,$value=false) {
return $name . '=' . ($value)?'?' : $name;
}
并称之为:
$sqlNamePart = buildSQLComparisonForBinding($$name,$name);
$sqlPasswordPart = buildSQLComparisonForBinding($$password,$password);
$param = array($sqlNamePart,$sqlPasswordPart );
$query = $db_connection->prepare("UPDATE users SET " . join(",",$param);
我希望这对你有用。
PS:我建议你不要使用var(es:&amp; $ name;)
的引用<强>更新强>:
阅读us.php.net/manual/en/mysqli-stmt.bind-param.php,你可以简单地构建一个查询:
$stmt = $mysqli->prepare("UPDATE users SET name=?,password=?,mode=?,notes=? WHERE userId=?");
$stmt->bind_param('ssss',
$name?$name:$$name,
$password?$password:$$password,
$mode?$mode:$$mode,
$notes?$notes:$$notes);
我希望这可能有用