как оставить столбец в базе данных MYSQL phpmyadmin пустым, если данные не введены - PullRequest
0 голосов
/ 28 марта 2020

В моей базе данных есть 5 столбцов: id, post, datetime, name, img_dir

Я хочу, чтобы столбцы 'name' и 'img_dir' были необязательными для публикации. Я не могу опубликовать отправлять данные или данные даты и времени без публикации имени и данных img_dar. если я пытаюсь опубликовать только post и datetime без имени или img_dir, он не отправляет данные в базу данных. как сделать пустыми столбцы name и img_dir, если данные не опубликованы?

$sql = "INSERT INTO $table(post, datetime, name, img_dir)VALUES('$post', '$datetimeOG', '$name', '$img_dir')";
$mysqli->query($sql) or die ($mysqli->error);

1 Ответ

2 голосов
/ 28 марта 2020

OP Заявлено в комментарии:

для обоих столбцов по умолчанию установлено значение NULL, хотя проблема все еще сохраняется

Это происходит потому, что вы передаете пустое значение в SQL, потому что, как написано ваше SQL, оно ожидает значений, даже если у вас нет и значений для вставки.

Итак; Вот переписать, чтобы добавить значения в INSERT, только если они не пустые (или вы можете увеличить специфичность * и установить, если они не null)

УВЕДОМЛЕНИЕ:

Этот код предназначен только для иллюстрации и, вероятно, не должен использоваться как есть , так как он может иметь несколько проблем безопасности, унаследованных от исходного кода. В идеальном мире я бы порекомендовал вам переписать всю кодовую базу, используя блоки try..catch и MySQL Транзакции и подготовленные отчеты (подробнее о них ниже ;-)).

$insert = []; //make array
$insert['post'] = $post;
$insert['datetime'] = $datetimeOG;
$insert['name'] = $name;
$insert['img_dir'] = $img_dir;

// Now, we have an array of VALUEs and the KEYs are the column names. 
// So let's remove the 'empty' values.
$insert = array_filter($insert);

* ПРИМЕЧАНИЕ:

Сюда входят пробелы, нулевые и "ложные" значения, поэтому вам необходимо настроить свои точные требования. См. связанный вопрос для получения дополнительной информации о том, как это сделать.

Ссылка - Удаление пустых элементов массива

Security Sidenote:

Есть много вещей не так с безопасностью вашего SQL / PHP по этому вопросу, далеко за рамками этого позднего ночного ответа, но самая важная вещь - это переменная $table.

Если эта $table переменная всегда будет иметь одно и то же значение, она не должна быть переменной и должна быть жестко закодирована. Затем вы можете использовать Подготовленные операторы .

Если переменная таблицы принадлежит к короткому списку, она должна быть в белом списке, как правило, с использованием оператора switch или аналогичного.

Если переменная tavble входит в список long , то вы можете использовать REGEX, чтобы удалить что-нибудь неприятное, это то, что я сделаю, например, так как я понятия не имею, что вы за данные выглядит так:

// remove all non a-z or _ - characters. 
$table = preg_replace('/[^a-z_-]/i','',$table); 

Справочник - Как вставить в MySQL с помощью Perpared Statements

Волхвы c Имплозии!

Массивы магические существа. Их можно взорвать (как у обезьян, но с меньшим количеством волос и крови).

Итак; у нас есть массив $insert и строка $sql;

Это может быть великолепно рекомбинировано, и даже не осознавая этого, вы станете красавицей посольского бала; Я имею в виду, да, это будет работать.

    // The column string is made from the array keys
    $columns = implode(",",array_flip($insert));
    // Be careful to note the quotes...
    $values = "'".implode("','", $insert )."'"; 

Создание окончательного результата .....

Итак, давайте завернем это и соберем все вместе!

$insert = []; //make array
$insert['post'] = $post;
$insert['datetime'] = $datetimeOG;
$insert['name'] = $name;
$insert['img_dir'] = $img_dir;

$insert = array_filter($insert);

/***
 * Check just in case....
 ***/
if(count($insert) > 0 ){
    $cleanedTableName = preg_replace('/[^a-z_-]/i','',$table); 
    $columns = implode(",",array_flip($insert));
    // Be careful to note the quotes...
    $values = "'".implode("','", $insert )."'"; 
    $sql = INSERT INTO ". $cleanedTableName." (".$columns.") VALUES (".$values.")";  
    $mysqli->query($sql) or 
        error_log("You have an SQL Error! (NEVER output your error to screen): ".$mysqli->error);
}

Великолепно. Я собираюсь сделать чай.

Посмотреть в действии !!!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...