在准备语句中绑定可变参数量

时间:2015-06-16 14:47:43

标签: php mysqli prepared-statement

我目前正在尝试构建一个小的通用函数来进行插入。我的目标是传递表,列,值和类型以填充插入。

我唯一的问题是声明:

$stmt -> bind_param($types, $var1, $var2 ...);

我基本上需要的是这样的事情:

$stmt -> bind_param($types, $array);

这就是我现在所得到的:

function insert($into, $columns, $values, $types) {
    global $connection;

    // Check Correct Length
    if(count($columns) != count($values) ||
       count($columns) != count($types)) {
           return false;
       }

    $count = count($columns);

    $column_string = "";
    $value_string = "";
    $value_types = "";

    for($i = 0; $i < $count; $i++) {
        $column_string .= $columns[$i];
        $value_types .= $types[$i];

        $value_string .= '?';

        if($i + 1 < $count) {
            $column_string .= ',';
            $value_string .= ',';
        }
    }

    $sql = "INSERT INTO $into ($column_string) VALUES ($value_string)";

    // Execute Statement
    if($stmt = $connection -> prepare($sql)) {

        // $stmt -> bind_param("sss", $transaction, $email, $status);
        // What to do here?

        $stmt -> execute();

        $stmt -> close();
    }

SQL语句看起来很好。类型已准备就绪 - 我只需要一种动态绑定参数的方法......

1 个答案:

答案 0 :(得分:1)

我认为, $ columns 定义为$columns = array('col1', 'col2'/*...*/); $ values 定义为$values = array($val1, $val2/*...*/);

我会为列名转义创建函数。

$escapeCols = function($column) { return sprintf('%S ', $column); };

创建的另一个功能?占位符

$placeholders = function ($values) { return array_fill(0, count($values), '?'); }

您可以准备查询

$sql = sprintf( 'INSERT INTO %s (%s) VALUES (%s)', $table, implode(', ', array_map($escapeCols, $columns), implode(', ', $placeholders($values)) );

然后你可以致电execute

$stmt = $connection->prepare($sql); $stmt->execute($values);

如果您将 $ values 定义为

,则可以轻松转换此方式

$values = array('col1' => $va1, 'col2' => $val2);