From: Aleksey Filippov Date: Tue, 24 Mar 2026 16:46:06 +0000 (+0300) Subject: fix: BatchSyncService PDO binding — $N плейсхолдеры → :pN X-Git-Url: https://gitweb.erp-flowers.ru/?a=commitdiff_plain;h=52a8d0cfc440f276c6ff4241a20fb7b9a63911e4;p=erp24_rep%2Fyii-erp24%2F.git fix: BatchSyncService PDO binding — $N плейсхолдеры → :pN 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. --- 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) . ')';