2013-02-23 66 views
2

匹配的参数个数这是我的函数,它创建了事先准备好的声明:mysqli_stmt ::变量bind_param数不事先准备好的声明

function query($query, $values_array) { 

if ($stmt = $link->prepare($query)) { 

    for ($i = 1; $i < count($values_array); $i++) { 
    if (!$stmt->bind_param($values_array[0][$i-1], $values_array[$i])) { 
     return false; 
    } 
    } 

if (!$stmt->execute()) { 
    return false; 
} 
$result = $stmt->get_result(); 
$stmt->close(); 
} 

return $result; 
} 

$查询

insert into table (var1, var2, var3, var4, var5, var6) values (?, ?, ?, ?, ?, ?) 

$ values_array是

array(7) { 
[0]=> 
string(6) "diisii" 
[1]=> 
float(9) 
[2]=> 
int(1) 
[3]=> 
int(1) 
[4]=> 
string(5) "now()" 
[5]=> 
int(1) 
[6]=> 
int(1) 
} 

我找不出这个问题,因为这个错误只是绑定参数时插入语句。 Select语句毫无问题地工作!

+0

'now()'不起作用,因为它作为文字字符串传递。你可以尝试使用另一个' - > bind_param'签名来传递类型字符串和所有参数,'call_user_func_array(array($ stmt,“bind_param”),$ values_array)' – mario 2013-02-23 16:16:50

+0

离开now()时出现同样的错误。是的,我知道call_user_func_array函数,但是我需要重构我不想做的$ values_array。 – Chris 2013-02-23 16:25:11

回答

1

这是一个清晰的例子,显示为什么mysqli完全无法使用预处理语句。
要么使用PDO要么手动解析自定义占位符,如safemysql

不同于mysqli的,PDO有2个大的事,使准备的语句可用:

  • 通过绑定占位符,或者通过使用bindValue()或传递数组​​。
  • 返回查询结果为通常数组而不是单独变量的奇怪绑定。
+0

刚刚经过测试的PDO,它的工作没有问题。多么奇怪的问题...... +1 – Chris 2013-02-23 18:34:38

相关问题