У меня есть этот запрос:
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"
]
@SougataBose строка и массив. Строка, содержащая несколько ?. И значение массива для каждого ?.
Мы видим, что. Добавьте то, что в нем есть на самом деле.
Вы можете использовать whereIn('column', $arr) вместо создания собственного запроса
@SougataBose добавил
@aynber спасибо, я знаю, но я пытаюсь понять, откуда берется проблема, а не ищу альтернативное решение :-)
Вы не используете какие-либо другие переменные в запросе, не так ли?
@aynber Да, но это «статическая» переменная, не использующая никаких ?, просто переменная int, которая прикреплена к самой строке. Логически это не должно ни на что влиять. Также я не могу использовать whereIn с DB::select
DB::select(DB::raw(...)) или DB::selectRaw(...) для выполнения необработанных запросов.
@iArcadia спасибо за комментарий, но DB::select() работает нормально, просто в данном случае это не так, и мне интересно, почему.
Да, я неправильно понял ваш вопрос. Что касается run(), который вы видите в стеке, третий аргумент по умолчанию является замыканием, поэтому вы это видите.
@iArcadia о, ладно, тогда проблема не в этом ^^ Есть идеи, почему я получаю сообщение об ошибке, даже если параметры верны? Или способ отладить это?
Пожалуйста, добавьте результат dd($str, $arr);.
У вас нет другого ? в вашем запросе? Без этих $in.
@JonasStaudenmeir сделано
Попробуйте с array_values($arr) вместо только $arr (в вашем select()).
@iArcadia, это сработало, спасибо






Решение состоит в том, чтобы использовать 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"
]
Проверьте, что содержит
$strи$arr.