无效的参数编号

时间:2019-03-19 12:59:58

标签: php pdo eloquent

我有这个查询:

use Illuminate\Database\Capsule\Manager as DB;

$arr = [/* Array values here */];
$in = str_repeat('?,', count($arr) - 1) . '?';
$str = "SELECT ... FROM ... WHERE ... AND ... IN ($in)";
$select_categories = DB::select($str, $arr);

现在我收到错误Uncaught PDOException: SQLSTATE[HY093]: Invalid parameter number,这是堆栈跟踪:

  

/var/www/vendor/illuminate/database/Connection.php:330堆栈跟踪:#0 /var/www/vendor/illuminate/database/Connection.php(330):PDOStatement-> execute()#1 /var/www/vendor/illuminate/database/Connection.php(657):Illuminate\Database\Connection->Illuminate\Database{closure}('SELECT categori ...',Array)#2 / var / www / vendor /illuminate/database/Connection.php(624):Illuminate \ Database \ Connection-> runQueryCallback('SELECT categori ...',Array,Object(Closure))#3 / var / www / vendor / illuminate / database / Connection .php(333):Illuminate \ Database \ Connection-> run('SELECT name ...',Array,Object(Closure))#4 /var/www/vendor/illuminate/database/Capsule/Manager.php(199 ):Illuminate \ Database \ Connection-> select('SELECT名称...',数组)#5 /var/www/categ.class.php(81):Illuminate \ Database \ Capsule \ Manager :: __ callStatic('select ',数组)#6 /var/www/categ.class.php(123):Site \ Naviga在664行的/var/www/vendor/illuminate/database/Connection.php中

我不知道为什么会这样。我试图回显变量$str$arr,以查看?的数量是否与数组的计数匹配,并且确实如此。所以我看不到为什么会生成该错误。有想法吗?

在堆栈中有3个自变量run('SELECT name...', Array, Object(Closure)),这可能是引起问题的原因,因为它认为没有第三个参数?还是类似的东西?

编辑:

$str包含:"?,?,?,?,?,?"

$arr包含:[94, 91, 97, 92, 96, 90]

dd($str, $arr);的结果:

"SELECT ... FROM ... WHERE ... IN (?,?,?,?,?,?,?,?,?,?,?,?,?,?) ORDER BY pro.sort_order"

array:14 [
  0 => "56"
  1 => "163"
  4 => "64"
  6 => "53"
  7 => "52"
  10 => "55"
  12 => "59"
  13 => "57"
  28 => "157"
  43 => "60"
  49 => "133"
  68 => "287"
  101 => "54"
  109 => "278"
]

1 个答案:

答案 0 :(得分:2)

解决方案是在$arr方法中使用array_values($arr)而不是select()

$select_categories = DB::select($str, array_values($arr));

$in具有14个?,而$arr具有14个元素。之所以不起作用,是因为$arr的索引不是从013,而是从0109。由于索引是整数而不是字符串,因此即使有一些0,也存在从109null的所有索引,因此$arr的大小为110

array_values()上使用$arr的效果:

array:14 [
  0 => "56"
  1 => "163"
  2 => "64"
  3 => "53"
  4 => "52"
  5 => "55"
  6 => "59"
  7 => "57"
  8 => "157"
  9 => "60"
  10 => "133"
  11 => "287"
  12 => "54"
  13 => "278"
]