我试图通过一个准备查询并执行的函数传递一个准备好的查询,但我一直得到"Number of variables doesn't match number of parameters in prepared statement
"。
我不知道出了什么问题,因为我有相同数量的变量作为参数。
查询:
UPDATE `users` SET fullname = ?, telephone = ?, email = ?, company_name = ?, company_addr2 = ?, company_town = ?, company_postcode = ?, sra_registration = ?, company_number = ?, vat_registration = ?, company_website = ?, list_of_partners = ?, my_staff = ? WHERE id = ?
参数:
Array
(
[0] => Ben Shepherd
[1] => 071111111111
[2] => john.doe@domain.com
[3] => Company name
[4] => addr2
[5] => town
[6] => postcode
[7] => 123456
[8] => 123456
[9] => 123465
[10] => http://www.somewebsite.com
[11] => United Kingdom
[12] => "[{'''"staff_firstname'''":'''"John'''",'''"staff_surname'''":'''"Smith'''",'''"staff_email'''":'''"some@email.com'''"},{'''"staff_firstname'''":'''"Jane'''",'''"staff_surname'''":'''"Smith'''",'''"staff_email'''":'''"some2@email.com'''"},{'''"staff_firstname'''":'''"John 3'''",'''"staff_surname'''":'''"Smith 3'''",'''"staff_email'''":'''"john.smith3@email.com'''"}]"
[13] => 1
)
查询功能:
public static function query($query, $params = array())
{
$params = !is_array($params) ? array($params) : $params;
$data = array();
$stmt = self::$i->prepare($query);
if(!$stmt)
return false;
foreach($params as $value)
{
/* Bind parameters. Types: s = string, i = integer, d = double, b = blob */
switch( true )
{
case (is_double($value)):
$type = 'd';
break;
case (is_int($value)):
$type = 'i';
break;
default:
case (is_string($value)):
$type = 's';
break;
}
$stmt->bind_param($type, $value);
}
$stmt->execute();
$res = $stmt->get_result();
if(!$res) return false;
while($row = $res->fetch_array(MYSQLI_ASSOC) )
{
$data[] = $row;
}
self::$customError = "";
return $data;
}
尝试将所有参数放入一个bind_param
调用中。
因此,使用call_user_func_array:将$stmt->bind_param($type, $value);
移出foreach循环
<?php
public static function query($query, $params = array())
{
$params = !is_array($params) ? array($params) : $params;
...
$types = array();
foreach($params as $value)
{
/* Bind parameters. Types: s = string, i = integer, d = double, b = blob */
switch( true )
{
case (is_double($value)):
$type = 'd';
break;
case (is_int($value)):
$type = 'i';
break;
default:
case (is_string($value)):
$type = 's';
break;
}
$types .= $type;
}
call_user_func_array(array($stmt, 'bind_param'), array_merge(array($types), $params));