@opaz1gota

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

Приходят переменные через post
$phrase = $_POST['phrase'];	
$secret = $_POST['secret'];	
$custom1 = $_POST['custom1'];	
$custom2 = $_POST['custom2'];	
$custom3 = $_POST['custom3'];

$tmp = [];

проверяются на то, пустые они или нет (через if isset) и добавляются в массив, таких переменных 18 и каждый раз сколько-то пост передаётся а сколько то нет, т е может придти 3 может 10 может все 18. Как мне добавлять в базу данных только те переменные, которые не пустые?

if (isset($phrase)) {
  $tmp['phrase'] = $phrase;	
}
if (isset($secret)) {
  $tmp['secret'] = $secret;	
}
if (isset($custom1)) {
  $tmp['custom1'] = $custom1;	
}
if (isset($custom2)) {
  $tmp['custom2'] = $custom2;	
}
if (isset($custom3)) {
  $tmp['custom3'] = $custom3;	
}
  • Вопрос задан
  • 267 просмотров
Решения вопроса 1
erniesto77
@erniesto77
oop, rb, py, php, js
array_filter(array)
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
FanatPHP
@FanatPHP
Чебуратор тега РНР
Начнем с того, что "if isset" не проверяет, "пустая ли переменная". Она только проверяет, было ли переменной присвоено какое-то значение.
Что, в свою очередь, очень забавно смотрится после того как буквально строчкой выше каждой переменной уже было присвоено значение.
Ну то есть это условие сработает, если в запросе вообще не было такого поля, но во-первых, мне кажется не это имелось в виду, а во-вторых, если поля не было, то уже при присвоении будет ошибка, и после этого делать isset уже как-то глупо.

И, как правильно заметил Кирилл Николаевич, наверное имеется в виду размер строки с данными. Если он нулевой, то мы можем считать поле пустым. Плюс, как он опять же, правильно заметил, возможно имеет смысл отрезать концевые пробелы, правда непонятно, каким местом для этого регулярки.

В общем, после такой эпичной борьбы с переменными, даже не знаю, стоит ли переходить к гибельному вопросу добавления в БД только не пустых значений. Сколько пользователей похапешечки на нем сложило голову и не смогли его осилить - не счесть. А из тех, кто смогли, потом многие начали заговариваться и слышать потусторонние голоса.
Так что ты хорошенько подумай - а надо ли оно тебе вообще.

В общем случае нам надо список полей, которые мы можем добавить в БД. Чтобы не колупаться с отдельными переменными. А дальше все просто - цикл, который проверяет на пустоту и формирует сам запрос плюс массив с данными для него.
$fields = ['phrase','secret','custom1', ...];
$conditions = [];
$params = [];
foreach($fields as $key) {
    if (strlen($val = trim(filter_input(INPUT_POST,$key)))) {
        $conditions[] = "`$key` =?";
        $params[] = $val;
    }
}
if ($params) {
    $sql = "INSERT INTO table SET ".implode(",",$conditions);
    $pdo->prepare($sql)->execute($params);
}
Ответ написан
Комментировать
MaxLK
@MaxLK
сети, виртуализация, СХД...
я чот не пойму - зачем вот это все? если дошло до INSERT то сколько там полей чем заполнено - сикулу без разницы. если вопрос в какой-то оптимизации записи в таблицу, то на вот этих проверках вы больше потеряете чем INSERT работать будет по тому, что время его работы не зависит от количества полей с явно заданными значениями. а если не в оптимизации - тогда зачем?
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы