[РЕШЕНО] Передача значений checkbox в базу данных Opencart/OcStore 3.x

Тема в разделе "Общие вопросы", создана пользователем Иван Николаев, 23 ноя 2022.

  1. Иван Николаев

    Иван Николаев Пользователь

    Сообщения:
    108
    Симпатии:
    7
    Всем привет.

    Сделал checkbox, но он передаёт только 1 значение, даже если я выберу 4.

    Хочу чтобы результат в бд записывал в формате
    value1, value2, value3, value4.
     
  2. Blast

    Blast Продвинутый пользователь

    Сообщения:
    212
    Симпатии:
    74
    так чекбокс один все-таки или их 4?
    а чем вопрос то? sql-запрос нужен для записи в БД?
     
  3. Иван Николаев

    Иван Николаев Пользователь

    Сообщения:
    108
    Симпатии:
    7
    4 чекбокса
    Скорее всего да, sql запрос. У меня сейчас он такой
    Код:
    result_checkbox = '" . $this->db->escape($data['result_checkbox']) . "'
     
  4. Иван Николаев

    Иван Николаев Пользователь

    Сообщения:
    108
    Симпатии:
    7
  5. Blast

    Blast Продвинутый пользователь

    Сообщения:
    212
    Симпатии:
    74
    ну с точки зрения запроса тут все верно. вопрос что вы закинули в $data['result_checkbox']
    без кода сложно что-то понять
     
  6. Иван Николаев

    Иван Николаев Пользователь

    Сообщения:
    108
    Симпатии:
    7
    У меня передавалось одно значение, потому что name был везде был одинаковый и он записывал последнее данные, сейчас подкорректировал twig
    Код:
              <div class="form-group">
                <label class="col-sm-2 control-label" for="result_checkbox">{{ entry_result_checkbox }}</label>
                <div class="col-sm-10">
                  <div>
                    <div class="checkbox">
                      <label>
                        <input type="checkbox" name="result_checkbox[]" value="Value 1"/>Value 1</label>
                    </div>
                    <div class="checkbox">
                      <label>
                        <input type="checkbox" name="result_checkbox[]" value="Value 2"/>Value 2</label>
                    </div>
                    <div class="checkbox">
                      <label>
                        <input type="checkbox" name="result_checkbox[]" value="Value 3"/>Value 3</label>
                    </div>
                  </div>
                </div>
              </div>
    Но теперь ему не нравиться видимо значение в value
    Код:
    PHP Warning:  mysqli::real_escape_string() expects parameter 1 to be string, array given in /system/library/db/mysqli.php on line 46
    Контроллер
    Код:
            if (isset($this->request->post['result_checkbox'])) {
                $data['result_checkbox'] = $this->request->post['result_checkbox'];
            } else {
                $data['result_checkbox'] = '';
            }
     
  7. devimirochnik

    devimirochnik Продвинутый пользователь

    Сообщения:
    740
    Симпатии:
    100
    У вас в result_checkbox не строка, а массив данных.
     
    Иван Николаев нравится это.
  8. Blast

    Blast Продвинутый пользователь

    Сообщения:
    212
    Симпатии:
    74
    конечно, там же теперь массив, а не строка.
    как вариант
    Код:
    $data['result_checkbox'] = implode(',', $this->request->post['result_checkbox']);
     
    Иван Николаев нравится это.
  9. devimirochnik

    devimirochnik Продвинутый пользователь

    Сообщения:
    740
    Симпатии:
    100
    И в SQL-запросе выражение field in ( ' . result_checkbox . ' )
     
  10. devimirochnik

    devimirochnik Продвинутый пользователь

    Сообщения:
    740
    Симпатии:
    100
    Только перед этим ещё неплохо бы каждое значение проверить через db->escape, а то мало ли ручки шаловливые у пользователей))
     
  11. devimirochnik

    devimirochnik Продвинутый пользователь

    Сообщения:
    740
    Симпатии:
    100
    Ну и для полной красоты ещё неплохо бы каждое значение оборачивать одинарными кавычками (даже цифры), так как это морда, а не админка
     
  12. Blast

    Blast Продвинутый пользователь

    Сообщения:
    212
    Симпатии:
    74
    а как это должно работать если он хочет записать все значения в одно текстовое поле ?
     
  13. devimirochnik

    devimirochnik Продвинутый пользователь

    Сообщения:
    740
    Симпатии:
    100
    Это для фильтрации, если чего))
     
  14. Иван Николаев

    Иван Николаев Пользователь

    Сообщения:
    108
    Симпатии:
    7
    Не помогло всё равно ругается. И данные не сохраняет.
    Я правильно понимаю, что теперь нужно редактировать только контроллер? с твигом всё в порядке?
     
  15. Иван Николаев

    Иван Николаев Пользователь

    Сообщения:
    108
    Симпатии:
    7
    Проверить на что?
    Для чего это нужно?
     
  16. devimirochnik

    devimirochnik Продвинутый пользователь

    Сообщения:
    740
    Симпатии:
    100
    Это я для фильтра писал, не обращайте внимание.

    Вам нужно implode применять перед вставкой в SQL и проверять через $this->db->escape, а не для $data['result_checkbox'], так как это массив. Если я правильно понял
     
  17. Blast

    Blast Продвинутый пользователь

    Сообщения:
    212
    Симпатии:
    74
    ну ошибка то уже наверное другая. implode однозначно сделает из массива строку
     
  18. devimirochnik

    devimirochnik Продвинутый пользователь

    Сообщения:
    740
    Симпатии:
    100
    Фиг его знает, тут же только небольшие куски кода)) Поэтому на всякий случай описал общий подход.
     
  19. Иван Николаев

    Иван Николаев Пользователь

    Сообщения:
    108
    Симпатии:
    7
    Контроллер
    Код:
            if (isset($this->request->post['result_checkbox'])) {
                $data['result_checkbox'] = implode(',', $this->request->post['result_checkbox']);
            } else {
                $data['result_checkbox'] = '';
            }
    Модель
    Код:
    result_checkbox = '" . $this->db->escape($data['result_checkbox']) . "'
    
    Твиг
    Код:
              <div class="form-group">
                <label class="col-sm-2 control-label" for="result_checkbox">{{ entry_result_checkbox }}</label>
                <div class="col-sm-10">
                  <div>
                    <div class="checkbox">
                      <label>
                        <input type="checkbox" name="result_checkbox[]" value="Value 1"/>Value 1</label>
                    </div>
                    <div class="checkbox">
                      <label>
                        <input type="checkbox" name="result_checkbox[]" value="Value 2"/>Value 2</label>
                    </div>
                    <div class="checkbox">
                      <label>
                        <input type="checkbox" name="result_checkbox[]" value="Value 3"/>Value 3</label>
                    </div>
                  </div>
                </div>
              </div>
    Ошибка
    Код:
    PHP Warning:  mysqli::real_escape_string() expects parameter 1 to be string, array given in /system/library/db/mysqli.php on line 46
     
  20. devimirochnik

    devimirochnik Продвинутый пользователь

    Сообщения:
    740
    Симпатии:
    100
    А полный стек ошибки?