Недопустимый номер параметра в красноречивом

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

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 Stack trace: #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 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.

Sougata Bose 19.03.2019 14:02

@SougataBose строка и массив. Строка, содержащая несколько ?. И значение массива для каждого ?.

user11101096 19.03.2019 14:03

Мы видим, что. Добавьте то, что в нем есть на самом деле.

Sougata Bose 19.03.2019 14:04

Вы можете использовать whereIn('column', $arr) вместо создания собственного запроса

aynber 19.03.2019 14:05

@SougataBose добавил

user11101096 19.03.2019 14:06

@aynber спасибо, я знаю, но я пытаюсь понять, откуда берется проблема, а не ищу альтернативное решение :-)

user11101096 19.03.2019 14:07

Вы не используете какие-либо другие переменные в запросе, не так ли?

aynber 19.03.2019 14:10

@aynber Да, но это «статическая» переменная, не использующая никаких ?, просто переменная int, которая прикреплена к самой строке. Логически это не должно ни на что влиять. Также я не могу использовать whereIn с DB::select

user11101096 19.03.2019 14:13
DB::select(DB::raw(...)) или DB::selectRaw(...) для выполнения необработанных запросов.
Kévin Bibollet 19.03.2019 14:31

@iArcadia спасибо за комментарий, но DB::select() работает нормально, просто в данном случае это не так, и мне интересно, почему.

user11101096 19.03.2019 14:34

Да, я неправильно понял ваш вопрос. Что касается run(), который вы видите в стеке, третий аргумент по умолчанию является замыканием, поэтому вы это видите.

Kévin Bibollet 19.03.2019 14:39

@iArcadia о, ладно, тогда проблема не в этом ^^ Есть идеи, почему я получаю сообщение об ошибке, даже если параметры верны? Или способ отладить это?

user11101096 19.03.2019 14:41

Пожалуйста, добавьте результат dd($str, $arr);.

Jonas Staudenmeir 19.03.2019 14:41

У вас нет другого ? в вашем запросе? Без этих $in.

Kévin Bibollet 19.03.2019 14:41

@JonasStaudenmeir сделано

user11101096 19.03.2019 14:48

Попробуйте с array_values($arr) вместо только $arr (в вашем select()).

Kévin Bibollet 19.03.2019 14:51

@iArcadia, это сработало, спасибо

user11101096 19.03.2019 14:57
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
17
172
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Решение состоит в том, чтобы использовать 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"
]

Другие вопросы по теме