@nikitoshq

Как пропустить итерацию если команда вызывает ошибку PHP?

foreach($data as $v){
$query = 'INSERT INTO oc_product_description SET ';
        foreach($product['oc_product_description'] as $k => $v){
            $query .= $k.' = '."'$v'".',';
        }
$query = substr($query,0,-1);
$this->db->query($query);
}

Как мне можно пропустить итерацию если $this->db->query($query); вызывает ошибку?
  • Вопрос задан
  • 194 просмотра
Решения вопроса 2
PageAuditRU
@PageAuditRU
Senior SEO Анализатор
Утоните, какого уровня ошибка - PHP или БД (ошибка связи с БД, ошибка в запросе)? На что реагировать-то надо?
Ответ написан
usdglander
@usdglander Куратор тега PHP
Yipee-ki-yay
$query = 'INSERT INTO oc_product_description SET ';
        foreach($product['oc_product_description'] as $k => $v){
            $query .= $k.' = '."'$v'".',';
            $query = substr($query,0,-1);
            try {
                $this->db->query($query);
            } catch (\Throwable $e) {}
        }


upd: Но вообще да, лучше точно знать какой тип ошибки бросается (как сказал Page-Audit.ru), чтобы изменить \Throable, на что то более подходящее.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
FanatPHP
@FanatPHP
Чебуратор тега РНР
Объясняем для самых маленьких: В коде НЕ ДОЛЖНО быть ошибок синтаксиса.
Ошибки синтаксиса надо не "пропускать", а не допускать.

В данном случае ошибка возникает из-за абсолютно дебильного кода, который пытается выполнить недописанный запрос столько раз, сколько полей в таблице.
А в исправленном коде - из-за того что переменные пихаются напрямую в запрос.

Поскольку ты пока еще вообще не понимаешь, как работать с БД из пхп, то никакой динамической сборки запроса. Только руками:
$sql = "INSERT INTO oc_product_description SET field1 = ?, field2=?, ...";
$stmt = $this->db->prepare($sql);
$stmt->execute(array_values($product['oc_product_description']));


Остальные ответы это ад.
А потом мы ходим и удивляемся - почему об пэхапэшников все ноги вытирают.
Вот из-за таких ответов и вытирают
Ответ написан
Комментировать
@AUser0
Чем больше знаю, тем лучше понимаю, как мало знаю.
Плохо, плохо... Почему у вас в программировании всё так плохо?!

ПРАВИЛЬНЫЙ вариант вашего кода:
$sql_array = array();
foreach($product['oc_product_description'] as $k => $v){
        $sql_array[] = "{$k} = ?";
}
$this->db->prepare("INSERT INTO oc_product_description SET ".implode(", ", $sql_array))->execute(array_values($product['oc_product_description']));
unset($sql_array);


Но если у вас действительно ЕСТЬ необходимость создавать столько записей (напрягитесь, осознайте далее написанное), сколько всего ПОЛЕЙ (ну типа там id,type,num,cost,category_id,sklad,etc) в таблице - тогда приведённый выше код нужно поменять. Но я сильно сомневаюсь, что вам нужна толпа записей вида:
id=100
id=100, type=tovar
id=100, type=tovar, num=10
id=100, type=tovar, num=10, cost=26.4
id=100, type=tovar, num=10, cost=26.4, category_id=4
id=100, type=tovar, num=10, cost=26.4, category_id=4, sklad=true
id=100, type=tovar, num=10, cost=26.4, category_id=4, sklad=true, etc=...

А именно так ваш код заполняет таблицу, дополняя запрос поле за полем, размножая записи как тараканов.

Вердикт: Вы хоть вдумываетесь, что вы творите?!
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы