使用一个具有可变数量的输入变量的bind_param()

9 php mysqli

我尝试使用这样的变量绑定:

$stmt = $mysqli->prepare("UPDATE mytable SET myvar1=?, myvar2=... WHERE id = ?")) {
$stmt->bind_param("ss...", $_POST['myvar1'], $_POST['myvar2']...);
Run Code Online (Sandbox Code Playgroud)

但是一些$ _POST ['...']可能是空的,所以我不想在DB中更新它们.

这是不实际的,考虑到空$ _ POST各种不同的组合["..."],虽然我可以建立字符串'UPDATE mytable的设置...’我的需求,bind_param()是一个不同的野兽.

我可以尝试将其调用作为字符串构建并使用eval()但它感觉不对:(

Gum*_*mbo 25

您可以使用该call_user_func_array函数使用bind_param可变数字或参数调用该方法:

$paramNames = array('myvar1', 'myvar2', /* ... */);
$params = array();
foreach ($paramNames as $name) {
    if (isset($_POST[$name]) && $_POST[$name] != '') {
        $params[$name] = $_POST[$name];
    }
}
if (count($params)) {
    $query = 'UPDATE mytable SET ';
    foreach ($params as $name => $val) {
        $query .= $name.'=?,';
    }
    $query = substr($query, 0, -1);
    $query .= 'WHERE id = ?';
    $stmt = $mysqli->prepare($query);
    $params = array_merge(array(str_repeat('s', count($params))), array_values($params));
    call_user_func_array(array(&$stmt, 'bind_param'), $params);
}
Run Code Online (Sandbox Code Playgroud)


cgp*_*cgp -2

将其构建为字符串,但将您的值放入数组中并将其传递给bindd_param。(并用 ? 替换 SQL 字符串中的值。

$stmt = $mysqli->prepare("更新 mytable SET myvar1=?, myvar2=... WHERE id = ?")) { $stmt->bind_param("ss...", $_POST['myvar1'] , $_POST['myvar2']...);

例如:

$args = array();
$sql = "UPDATE sometable SET ";
$sep = "";
$paramtypes = "";
foreach($_POST as $key => $val) {
  $sql .= $sep.$key." = '?'";
  $paramtypes .= "s"; // you'll need to map these based on name
  array_push($args, $val);
  $sep = ",";
}
$sql .= " WHERE id = ?";
array_push($args, $id);
array_insert($args, $paramtypes, 0);

$stmt = $mysqli->prepare($sql);
call_user_func_array(array(&$stmt, 'bindparams'), $array_of_params);
$stmt->bind_param($args);
Run Code Online (Sandbox Code Playgroud)