绑定值时出现问题

时间:2016-09-19 10:00:57

标签: php mysqli

我第一次使用准备好的陈述工作,但我遇到了这个错误。由于某种原因,我不能将绑定类型作为参数传递?

我的代码:

function insert($table, $columns = array(), $bindTypes, $values = array()) {
// Store connection.
$connection = connection();
$columnValues = null;
$index = 1;

// Prepare unassigned value string.
foreach ($columns as $column) {
    $columnValues .= '?';
    if ($index < count($columns)) {
        $columnValues .= ', ';
    }
    $index++;
}

// Debugg purpose: echo query example:
echo "INSERT INTO {$table} (" . implode(', ', $columns) . ") VALUES ({$columnValues})"; 

// Prepare statement.
$statement = $connection->prepare("INSERT INTO {$table} (" . implode(', ', $columns) . ") VALUES ({$columnValues})");
$statement->bind_param($bindTypes, implode(', ', $values));
}


insert('test', array('name'), 'i', array(1));

如果我回显查询示例,我会“INSERT INTO test(name)VALUES(?)”。

请饶我,我还是一个学习菜鸟。

3 个答案:

答案 0 :(得分:1)

让我们看一下the docs

  

bool mysqli_stmt :: bind_param(string $ types,mixed&amp; $ var1 [,mixed&amp; $ ...])

换句话说,第一个参数确定数据类型,并将值作为单个参数从第二个参数开始传递。但是你有这个:

$statement->bind_param($bindTypes, implode(', ', $values));

您将所有单个值组合成一个以逗号分隔的字符串,这个字符串没有意义,尤其是。如果您认为该函数需要参数引用

答案 1 :(得分:1)

PHP&gt; 5.6版本:

function insert($connection, $table, $columns, $values) {
    $columnStr = "`".implode("`,`",$columns); 
    $valueStr =  str_repeat('?,', count($values) - 1) . '?';
    $types = str_repeat('s', count($values));
    $statement = $connection->prepare("INSERT INTO `$table` ($columnStr) VALUES ($valueStr)");
    $statement->bind_param($types, ...$values);
    $statement->execute();
}

insert($conn, 'test', ['name'], [1]);

请注意,您永远不应该从用户输入中获取表名或列名,但始终在脚本中对其进行硬编码。这使得插入物的独特功能毫无用处。

答案 2 :(得分:0)

我看到你用MySQLi标记了你的帖子,我很确定这里有问题。

相反,我会在这个上使用PDO,因为它允许以更简单的方式获得可变数量的参数。允许你从PHP手册中做一些与example 5非常相似的事情。