使用PHP将多个值插入MySQL

时间:2013-03-18 23:23:12

标签: php mysql sql

所以,我传递的值数组会随着使用而变化,然后将它们插入到数据库中。我的问题是参数绑定的方式。

public function insertValues($table, $cols, $values) 
{
    $mysqli = new mysqli(DBHOST, DBUSER, DBPASSWORD, DBDATABASE);

    $colString = implode(', ', $cols); // x, x, x
    $valString = implode(', ', array_fill(0, count($values), '?')); // ?, ?, ?

    $sql = "INSERT INTO $table ($colString) VALUES($valString)";
    if (!$stmt = $mysqli->prepare($sql))
         echo "Prepare failed: (" . $mysqli->errno . ") " . $mysqli->error;

    // THIS IS THE PROBLEM AREA
    foreach ($values as $v)
        if (!$stmt->bind_param('s', $v))
            echo "Binding parameters failed: (" . $stmt->errno . ") " . $stmt->error;

    if (!$stmt->execute())
        echo "Execute failed: (" . $stmt->errno . ") " . $stmt->error;

    $stmt->close();
    $mysqli->close();
}

我需要一种方法来一次绑定所有参数,而不是一次绑定所有参数,但我无法找到一种有用的方法来实现这一点。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:3)

我在PHP.net(http://php.net/manual/en/mysqli-stmt.bind-param.php)找到了您正在寻找的问题的答案。为了方便起见,我把它贴在这里,所有的功劳都归功于一个男人用电子邮件发送电子邮件Nick9v ^ät^ hotmail -remove- -dot- com

  

在准备时处理动态数量的字段值   声明我觉得这个课很有用。

     

[编者注:改变BindParam :: add()以通过引用接受$ value   从而防止在较新版本的PHP中发出警告。]

<?php 
class BindParam{ 
    private $values = array(), $types = ''; 

    public function add( $type, &$value ){ 
        $this->values[] = $value; 
        $this->types .= $type; 
    } 

    public function get(){ 
        return array_merge(array($this->types), $this->values); 
    } 
} 
?> 

用法非常简单。创建一个实例并使用add方法填充。当您准备好执行时,只需使用get方法即可。

<?php 
$bindParam = new BindParam(); 
$qArray = array(); 

$use_part_1 = 1; 
$use_part_2 = 1; 
$use_part_3 = 1; 

$query = 'SELECT * FROM users WHERE '; 
if($use_part_1){ 
    $qArray[] = 'hair_color = ?'; 
    $bindParam->add('s', 'red'); 
} 
if($use_part_2){ 
    $qArray[] = 'age = ?'; 
    $bindParam->add('i', 25); 
} 
if($use_part_3){ 
    $qArray[] = 'balance = ?'; 
    $bindParam->add('d', 50.00); 
} 

$query .= implode(' OR ', $qArray); 

//call_user_func_array( array($stm, 'bind_param'), $bindParam->get()); 

echo $query . '<br/>'; 
var_dump($bindParam->get()); 
?> 

这会让你得到如下结果:

SELECT * FROM users WHERE hair_color =?或者年龄=?或平衡=? array(4){[0] =&gt; string(3)“sid”1 =&gt; string(3)“red”[2] =&gt; int(25)[3] =&gt; float(50)}

答案 1 :(得分:0)

代码不起作用,因为bind_param必须在函数的单个调用中包含所有查询参数,而不是每个参数的多个调用,也需要通过引用传递的变量,所以在foreach调用中它总是是与循环的最后一次迭代中的值相同的变量。

最简单的方法是使用类型和参数组合数组,然后通过调用call_user_func_array将其传递给bind_param,例如:

$params = array();
$types = '';

foreach ($values as $k => $v)
{
    $types .= 's';
    $params[] = &$values[$k];
}

$bind_params = array_merge(array($types), $params);

if (!call_user_func_array(array($stmt, 'bind_param'), $bind_params))
    // ...

请注意,bind_param期望变量通过引用而不是值传递,否则它将是几行构造带有值的数组,而不是foreach循环。