From 52a8d0cfc440f276c6ff4241a20fb7b9a63911e4 Mon Sep 17 00:00:00 2001 From: Aleksey Filippov Date: Tue, 24 Mar 2026 19:46:06 +0300 Subject: [PATCH] =?utf8?q?fix:=20BatchSyncService=20PDO=20binding=20?= =?utf8?q?=E2=80=94=20$N=20=D0=BF=D0=BB=D0=B5=D0=B9=D1=81=D1=85=D0=BE?= =?utf8?q?=D0=BB=D0=B4=D0=B5=D1=80=D1=8B=20=E2=86=92=20:pN?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit PDO::bindValue() требует индекс ≥ 1, а $params был 0-индексированным массивом с PostgreSQL-нативными $1,$2,$3 плейсхолдерами. Это вызывало: PDOStatement::bindValue(): Argument #1 ($param) must be >= 1 Результат на проде: Balances::deleteAll() удалял данные магазина, BatchSyncService->upsertBalances() падал → магазин терял ВСЕ строки. Fix: именованные :p1,:p2,:p3 плейсхолдеры вместо $1,$2,$3. Проверено на реальной БД: 5 магазинов (419-499 товаров) + characteristics. --- erp24/services/BatchSyncService.php | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/erp24/services/BatchSyncService.php b/erp24/services/BatchSyncService.php index 43a03467..b32352a3 100644 --- a/erp24/services/BatchSyncService.php +++ b/erp24/services/BatchSyncService.php @@ -168,7 +168,7 @@ class BatchSyncService return 0; } - // Подготовка плейсхолдеров для VALUES + // Подготовка плейсхолдеров для VALUES (именованные :pN для Yii2/PDO) $placeholders = []; $params = []; $paramIndex = 1; @@ -176,8 +176,9 @@ class BatchSyncService foreach ($rows as $row) { $rowPlaceholders = []; foreach ($columns as $column) { - $rowPlaceholders[] = '$' . $paramIndex; - $params[] = $row[$column] ?? null; + $paramName = ':p' . $paramIndex; + $rowPlaceholders[] = $paramName; + $params[$paramName] = $row[$column] ?? null; $paramIndex++; } $placeholders[] = '(' . implode(',', $rowPlaceholders) . ')'; -- 2.39.5