Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 绑定值时出现的问题_Php_Mysqli - Fatal编程技术网

Php 绑定值时出现的问题

Php 绑定值时出现的问题,php,mysqli,Php,Mysqli,我第一次用准备好的语句工作,但我被这个错误卡住了。由于某些原因,我无法将绑定类型作为参数传递 我的代码: function insert($table, $columns = array(), $bindTypes, $values = array()) { // Store connection. $connection = connection(); $columnValues = null; $index = 1; // Prepare unassigned value string.

我第一次用准备好的语句工作,但我被这个错误卡住了。由于某些原因,我无法将绑定类型作为参数传递

我的代码:

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));
函数插入($table,$columns=array(),$bindTypes,$values=array()){
//存储连接。
$connection=connection();
$columnValues=null;
$index=1;
//准备未赋值字符串。
foreach($columns作为$column){
$columnValues.='?';
如果($indexprepare(“插入到{$table}(“.infrade(',',$columns)。”)值({$columnValues})”);
$statement->bind_param($bindTypes,introde(',',$values));
}
插入('test',数组('name'),'i',数组(1));
如果我回显查询示例,我会得到“插入到测试(名称)值(?)”


请原谅我,我仍然是一个学习能手。

我看到你用MySQLi标记了你的帖子,我很确定这就是问题所在

取而代之的是,我在这个问题上使用PDO,因为它以一种更简单的方式允许可变数量的参数。允许您执行与PHP手册中类似的操作。

让我们看看:

bool mysqli_stmt::bind_参数(字符串$types,mixed&$var1[,mixed&$…])

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

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

您将所有的单个值组合成一个逗号分隔的字符串,这一点没有什么意义,尤其是如果您认为函数希望通过<强>引用 .< /P> < P> PHP > 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]);

请注意,永远不要从用户输入中提取表名或列名,而应始终在脚本中硬编码它们。这使得插入的独特功能毫无用处。

谢谢。我现在明白了问题所在,但我无法想出解决方案。@Dennicastelijns您使用的PHP版本是什么?@YourCommonSense 5.5。9@DennisCastelijns真遗憾。不管是5.6版,都会有一个简单的解决方案,我对mysqli不太熟悉。如果无法多次调用
bind_param()
,则可能必须使用
call_user\u func\u array()
,这相当难看。注意:由于语法原因,需要使用PHP/5.6+。