Итак, у меня есть форма PHP для добавления строки в базу данных. Если какое-либо из необязательных полей пусто, следует использовать значение по умолчанию для этого поля.
Я попытался реализовать это с MySQLi следующим образом:
$required = $_POST["required"];
$unrequired = isset($_POST["unrequired"])?$_POST["unrequired"]:"DEFAULT(`Unrequired`)";
$sql = $mysqli->prepare("INSERT INTO `table` (`Required`,`Unrequired`) VALUES (?,?)");
$sql->bind_param("is",$required,$unrequired);
$sql->execute();
Но когда я пытаюсь получить значение необязательного поля с помощью SELECT unrequired FROM table WHERE required = 33
, Я получил УМОЛЧАНИЮ ( `Unrequired`) вместо значения по умолчанию столбца для столбцов varchar, и 0 для int и двойных столбцов.
Эта проблема вызвана PHP или MySQL?
НОТА: Некоторые из необязательных полей обнуляются, а некоторые нет. Те, которые не обнуляются, имеют установленное значение по умолчанию. значение по умолчанию для int и double полей равно 1, остальные обнуляются.
Разве вы не можете просто установить значение по умолчанию в вашей структуре базы данных. Ниже вы можете увидеть пример;
CREATE TABLE example_table
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255) NOT NULL,
Address varchar(255), DEFAULT 'unrequired'
City varchar(255) DEFAULT 'Unrequired'
)
Когда вы создаете свой стол таким образом, вы готовы идти. Вы также можете изменить свой стол
ALTER TABLE example_table
ALTER City SET DEFAULT 'Unrequired'
Хорошо, я думаю, что я понял проблему.
Поскольку я использую подготовленные заявления, каждый параметр, который я вставил в оператор запроса reslting SQL, будет преобразован в безопасные строки, целые или двойные числа, поэтому я предполагаю выражения типа DEFAULT(column)
будет интерпретироваться как "DEFAULT(column)"
и будет рассматриваться как строки.
Хотя это и не очень безопасное решение, я рассмотрел использование не подготовленных операторов, то есть согласование каждого параметра и использование ДЕФОЛТ как здесь. Чтобы сделать запросы более безопасными, я буду использовать real_escape_string () для строк.