如何将多个参数绑定到 MySQLi 准备好的语句

Aub*_*bin 1 php mysqli

我要插入的参数数量不定,(2031) No data supplied for parameters in prepared statement在警告后出现错误Number of variables doesn't match number of parameters in prepared statement in SaveIntermediateData.php5 on line 49

$link = new mysqli( DB_HOST, DB_USER, DB_PASSWORD, DB_NAME );
if( ! $link ) {
    echo "<h1>new mysqli() failed!</h1>";
    exit( 0 );
}
$queryText =
    "CREATE TABLE IF NOT EXISTS visitors (".
        "id    VARCHAR( 512) CHARACTER SET ASCII NOT NULL,".
        "name  VARCHAR(  80) CHARACTER SET ASCII NOT NULL,".
        "value VARCHAR(4096) NOT NULL,".
        "PRIMARY KEY ( `id`, `name` )".
    ")";
$link->query( $queryText );
$queryText = "INSERT INTO visitors (id,name,value) VALUES ";
foreach( $_POST as $name => $value ) {
    $queryText .= '(?,?,?),';
}
$queryText  = substr( $queryText, 0, -1 );
$queryText .= ' ON DUPLICATE KEY UPDATE name = VALUES( name ), value = VALUES( value )';
$id         = session_id();
$stmt       = $link->prepare( $queryText );
if( $stmt ) {
    $param_nr = 1;
    foreach( $_POST as $name => $value ) {
        $stmt->bind_param( 'sss', $id, $name, $value ); //<<<<<<<<< line 49
    }
    if( $stmt->execute()) {
        echo '<h1>OK</h1>';
    }
    else {
        echo "<h1>(".$stmt->errno.") ".$stmt->error."</h1>";
    }
}
else {
    echo "<h1>".$link->error."</h1>";
}
$link->close();
Run Code Online (Sandbox Code Playgroud)

我相信只bind_param考虑最后一个。在Java中,可以使用索引来绑定参数,但我不知道这样的方法mysqli。我可以创建全文查询,但我更喜欢使用绑定来避免注入。

Roc*_*mat 5

您只能调用bind_param 一次,因此您必须将所需的所有参数添加到数组中,然后通过 调用它call_user_func_array

尝试这个:

$params = array('');
foreach( $_POST as $name => $value ) {
    $params[0] .= 'sss';
    array_push($params, $id, $name, $value);
}

call_user_func_array(array($stmt, 'bind_param'), $params);

if( $stmt->execute()) {
    echo '<h1>OK</h1>';
}
Run Code Online (Sandbox Code Playgroud)