2016-09-19 65 views
1

我正在第一次使用准备语句工作,但是我陷入了这个错误。出于某种原因,我不能通过绑定类型作为参数?绑定值时的问题

我的代码:

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测试(名称)VALUES(?)”。

请让我免费我仍然是一个学习noob。

回答

1

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]); 

注意。这使插入的独特功能相当无用。

+0

注意:由于[... $ values](http://php.net/functions.arguments#functions.variable-arg-list)语法,PHP/5.6 +是必需的。 –

0

我看到你用MySQLi标记了你的文章,我很确定这里是问题所在。

相反,我会在这一个PDO上,因为它允许以更简单的方式可变数量的参数。允许你做一些类似于PHP手册中的example 5的东西。

1

让我们来看看the docs

布尔mysqli_stmt :: bind_param(字符串$类型,混合& $ VAR1 [,混合& $ ...])

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

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

你所有单独的值组合成一个逗号分隔的字符串,这不会使至少感,ESP。如果您认为该函数预计参数参考

+0

谢谢。我现在看到了这个问题,但我无法提出解决方案。 –

+0

@DennisCastelijns你正在使用什么PHP版本? –

+0

@YourCommonSense 5.5.9 –