Intereting Posts

Как связать несколько параметров с подготовленным оператором 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(); 

Я считаю, что bind_param только последний bind_param . В Java можно использовать индекс для привязки параметра, но я не знаю такого метода с mysqli . Я могу создать полный текстовый запрос, но я предпочитаю использовать привязку, чтобы избежать инъекции.

Related of "Как связать несколько параметров с подготовленным оператором MySQLi"

Вы можете вызвать 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>'; } 

Если param имеет тип Integer в PHP, вы должны использовать d param, например:

 $statement->bind_param("dss", $id, $name, $param);