使用mysqli将字段绑定为值?

时间:2014-03-20 13:52:48

标签: php mysql mysqli

我正在开发一个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:

  1. 接受此查询:

    UPDATE users SET name=?,password=?,mode=?,notes=? WHERE userId=?
    
  2. 更新一些值,但保留原样,如下所示:

    UPDATE users SET name='Test',password=password,mode=mode,notes='asdf' WHERE userId=723
    

1 个答案:

答案 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);

我希望这可能有用