Неверный номер параметра в eloquent - PullRequest
0 голосов
/ 19 марта 2019

У меня есть этот запрос:

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 / подсветка / база данных / Connection.php: 330 трассировки стека: # 0 /var/www/vendor/illuminate/database/Connection.php(330): PDOStatement-> execute () # 1 / var / www / vendor / подсветка/database/Connection.php(657): Подсветка \ База данных \ Соединение-> Подсветка \ База данных {закрытие} ('SELECT categoryori ...', Array) # 2 /var/www/vendor/illuminate/database/Connection.php(624): Освещение \ База данных \ Соединение-> runQueryCallback ('ВЫБРАТЬ категорию ...', Массив, Объект (Закрытие)) # 3 /var/www/vendor/illuminate/database/Connection.php(333): Осветить \База данных \ Соединение-> Выполнить ('ВЫБЕРИТЕ имя ...', Массив, Объект (Закрытие)) # 4 /var/www/vendor/illuminate/database/Capsule/Manager.php(199): Осветить \ База данных \ Соединение-> select ('SELECT name ...', Array) # 5 /var/www/categ.class.php(81): Подсветка \ Database \ Capsule \ Manager :: __ callStatic ('select', Array) # 6 / var/www/categ.class.php(123): Сайт \ Naviga in /var / www / vendor / lightingate / database / Connection.php в строке 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"
]

1 Ответ

2 голосов
/ 19 марта 2019

Решение состоит в том, чтобы использовать array_values($arr) вместо $arr в методе select():

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

$in имеет 14 ? и $arrимеет 14 элементов.Причина, по которой он не работает, заключается в том, что индексы $arr не от 0 до 13, а от 0 до 109.Так как индексы являются целыми, а не строковыми, все они от 0 до 109 существуют, даже если некоторые из них null, поэтому размер $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"
]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...