За последние 24 часа нас посетили 22494 программиста и 997 роботов. Сейчас ищут 645 программистов ...

Проблема с форычем insert into

Тема в разделе "PHP и базы данных", создана пользователем bogdan_titomir, 23 дек 2018.

  1. bogdan_titomir

    bogdan_titomir Новичок

    С нами с:
    7 окт 2017
    Сообщения:
    159
    Симпатии:
    2
    PHP:
    1. $subCats = $curObj['subCats'];
    2.  
    3. foreach ( $subCats as $subCatId => $on)
    4. {
    5. $admin->db->sql ( "INSERT INTO _@object_insubcats (objectId,subCatId) VALUES ($curObjId,$subCatId)" );
    6. }
    Вот что выдает print_r(SubCats)
    Array ( [1046] => ON [1052] => ON [939] => ON [940] => ON [946] => ON [1256] => ON [1487] => ON )

    А вот сама ошибка...

    Warning: mysqli_error() expects exactly 1 parameter, 0 given in C:\OSPanel\domains\localhost\gigal\system\db.class.php on line 41
    Array
    (
    [error] =>
    [sql] => INSERT INTO id_object_insubcats (objectId,subCatId) VALUES (6971,1046)
    )

    Что делать? Заранее спасибо
     
  2. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    Что делать? Заранее спасибо.

    Соединиться с бд?
     
  3. yanuzay

    yanuzay Активный пользователь

    С нами с:
    28 мар 2018
    Сообщения:
    498
    Симпатии:
    57
    ну и 7 запросов insert вместо 1 insert из религиозных соображений делаете?
     
  4. bogdan_titomir

    bogdan_titomir Новичок

    С нами с:
    7 окт 2017
    Сообщения:
    159
    Симпатии:
    2
    соединение в базе идет через функцию sql()
    --- Добавлено ---
    Да и забыл сказать что информация заносится через поле checkbox поэтому больше чем 1.
     
    #4 bogdan_titomir, 23 дек 2018
    Последнее редактирование: 23 дек 2018
  5. bogdan_titomir

    bogdan_titomir Новичок

    С нами с:
    7 окт 2017
    Сообщения:
    159
    Симпатии:
    2
    Проблема именно с foreach так как пробовал без него и данные добавлялись.
     
  6. bogdan_titomir

    bogdan_titomir Новичок

    С нами с:
    7 окт 2017
    Сообщения:
    159
    Симпатии:
    2
    Теперь он бьет следующую ошибку:
    [error] => Duplicate entry '6955-467' for key 'PRIMARY'
    [sql] => INSERT INTO `id_object_insubcats` ( `objectId`, `subCatId` ) VALUES ( '6955', '467' )

    Посмотрел в базе там нет дубляжа запись уникальна.
     
  7. lastdays

    lastdays Активный пользователь

    С нами с:
    27 сен 2012
    Сообщения:
    410
    Симпатии:
    74
    Проблема не в foreach, а в запросе, об этом тебе и пишет. Может, ковычки стоит добавить.

    Выше дали(намекнули) хороший совет, не обязательно пихать в foreach 55 инцертов, можно обойтись одним.
     
  8. bogdan_titomir

    bogdan_titomir Новичок

    С нами с:
    7 окт 2017
    Сообщения:
    159
    Симпатии:
    2
    Да рад конечно и одним ограничится но поле чекбокс и нужно за 1 запрос несколько данных в базу отправить.
     
  9. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    @bogdan_titomir, форыч тут не при чем. Просто вы не можете собрать корректный запрос.
    --- Добавлено ---
    @bogdan_titomir, йоу. Ты даже не понимаешь о чем тебе говорят. Запрос с помощью цикла собирается на стороне php и только потом отправляется в бд. А не один запрос на итерацию.
    Ну а по поводу ошибки чёрным по белому написано в самой ошибке. И делай echo запроса перед тем как отправить его в бд. Это сэкономит кучу времени и нервов.
     
  10. bogdan_titomir

    bogdan_titomir Новичок

    С нами с:
    7 окт 2017
    Сообщения:
    159
    Симпатии:
    2
    Понятно, буду работать над этим.
     
  11. lastdays

    lastdays Активный пользователь

    С нами с:
    27 сен 2012
    Сообщения:
    410
    Симпатии:
    74
    Запрос может иметь вид, типа
    Код (Text):
    1. INSERT INTO `table` VALUES (1,23),(2,34),(4,33);
    Оптимизация на лицо, чем 10 инцертов делать. Собери инфо в массиве и делов. Примеров куча в интернете.
     
  12. yanuzay

    yanuzay Активный пользователь

    С нами с:
    28 мар 2018
    Сообщения:
    498
    Симпатии:
    57
    только нужно явно указывать названия полей в которые записываешь, при записи сразу нескольких строк.
    Код (Text):
    1. INSERT INTO `table` (field1, field2) VALUES (1,23),(2,34),(4,33);

    В итоге можно сделать так:
    Код (PHP):
    1. $subCats = $curObj['subCats'];
    2. $sql = array();
    3. foreach ( $subCats as $subCatId => $on)
    4. {
    5.     $sql[] = "($curObjId, $subCatId)";
    6. }
    7. $admin->db->sql ( "INSERT INTO _@object_insubcats (objectId,subCatId) VALUES  ".implode("," , $sql) );