]> gitweb.erp-flowers.ru Git - erp24_rep/yii-erp24/.git/commitdiff
fix: BatchSyncService PDO binding — $N плейсхолдеры → :pN origin/fix_filippov_batch_sync_pdo_binding
authorAleksey Filippov <Aleksey.Filippov@erp-flowers.ru>
Tue, 24 Mar 2026 16:46:06 +0000 (19:46 +0300)
committerAleksey Filippov <Aleksey.Filippov@erp-flowers.ru>
Tue, 24 Mar 2026 16:46:06 +0000 (19:46 +0300)
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

index 43a0346728e6eeac541a0b91cb18a355d1341349..b32352a3f1217c39648c62a2b8da0c1ebd841a78 100644 (file)
@@ -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) . ')';