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);
}
Великолепно. Я собираюсь сделать чай.
Посмотреть в действии !!!