【问题标题】:Invalid parameter number in eloquenteloquent 中的参数号无效
【发布时间】:2019-08-10 00:29:05
【问题描述】:

我有这个查询:

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 category...', 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 name...', Array) #5 /var/www/categ.class.php(81): Illuminate\Database\Capsule\Manager::__callStatic('select ', Array) #6 /var/www/categ.class.php(123): Site\Naviga in /var/www/vendor/illuminate/database/Connection.php on line 664

我不明白为什么会这样。我正在尝试回显变量 $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"
]

【问题讨论】:

  • 检查 $str$arr 包含的内容。
  • @SougataBose 一个字符串和一个数组。包含多个? 的字符串。以及每个? 的数组值。
  • 我们可以看到。添加它实际包含的内容。
  • 您可以使用whereIn('column', $arr) 而不是构建自己的查询
  • @SougataBose 添加

标签: php pdo eloquent


【解决方案1】:

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

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

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

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

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"
]

【讨论】:

    猜你喜欢
    • 2012-07-09
    • 2021-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-12
    • 2013-01-29
    • 2018-12-01
    相关资源
    最近更新 更多