使用php pdo在数据库表中插入空值
我为教师表制作了一个PHP接口。表中的所有列都设置为使用php pdo在数据库表中插入空值,php,mysql,pdo,Php,Mysql,Pdo,我为教师表制作了一个PHP接口。表中的所有列都设置为非空。如果我提交的表单输入为空。空值将提交给我的数据库表。我不明白表的列是否设置为NOTNULL,为什么数据库表从我的用户界面接受null值 if(filter_has_var(INPUT_POST, "add_teacher")){ function test_input($data){ $data = stripslashes($data); $data = trim($data);
非空
。如果我提交的表单输入为空。空值将提交给我的数据库表。我不明白表的列是否设置为NOTNULL,为什么数据库表从我的用户界面接受null值
if(filter_has_var(INPUT_POST, "add_teacher")){
function test_input($data){
$data = stripslashes($data);
$data = trim($data);
$data = htmlspecialchars($data);
return $data;
}
if(empty($_POST["firstname"])){
$firstname_err = "* Firstname is required!";
} else {
if(!preg_match("/^[a-zA-Z ]*$/",$_POST["firstname"])){
$firstname_err = "Invalid Firstname";
} else if (!test_input($_POST["firstname"])){
$firstname_err = "Invalid firstName, please enter a valid first name!";
} else {
$firstname = $_POST["firstname"];
}
}
if(empty($_POST["lastname"])){
$lastname_err = "* Last name is required!";
} else {
if(!preg_match("/^[a-zA-Z ]*$/",$_POST["lastname"])){
$lastname_err = "Invalid last name";
} else if (!test_input($_POST["lastname"])){
$lastname_err = "Invalid last name, please enter a valid last name!";
} else {
$lastname = $_POST["lastname"];
}
}
if(empty($_POST["DOB"])){
$DOB_err = "* Date of birth is a required field!";
} else {
$DOB = $_POST["DOB"];
}
if(empty($_POST["gender"])){
$gender_err = "* Gender is a required field!";
} else {
$gender = $_POST["gender"];
}
if(empty($_POST["tazkira_number"])){
$tazkira_number_err = "* This is a required field";
} else {
if(!filter_var($_POST["tazkira_number"], FILTER_VALIDATE_INT)){
$tazkira_number_err = "* Only numbers are allowed";
} else if(!test_input($_POST["tazkira_number"])){
$tazkira_number_err = "* Invalid data entered";
}
else {
$tazkira_number = $_POST["tazkira_number"];
}
}
if(empty($_POST["phone_number"])){
$phone_number_err = "* This is a required field";
} else {
$phone_number = $_POST["phone_number"];
}
if(empty($_POST["academic_field"])){
$academic_field_err = "* Academic field is required!";
} else {
if(!preg_match("/^[a-zA-Z ]*$/",$_POST["academic_field"])){
$academic_field_err = "Invalid academic field.";
} else if (!test_input($_POST["academic_field"])){
$academic_field_err = "Invalid academic field, please enter a valid academic field!";
} else {
$academic_field = $_POST["academic_field_err"];
}
}
if(empty($_POST["email"])){
$email_err = "* Email field is required!";
} else {
if(!filter_var($_POST["email"], FILTER_VALIDATE_EMAIL)){
$email_err = "Invalid email entered";
} else if (!test_input($_POST["email"])){
$academic_femail_err = "Invalid data, please enter a valid email address!";
} else {
$email = $_POST["email"];
}
}
if(empty($_POST["position"])){
$position_err = "* Position field is required!";
} else {
if(!preg_match("/^[a-zA-Z ]*$/",$_POST["position"])){
$position_err = "* Invalid data";
} else if (!test_input($_POST["position"])){
$position_err = "* Invalid data, please enter a valid position!";
} else {
$position = $_POST["position"];
}
}
if(empty($_POST["hire_date"])){
$hire_date_err = "* Hire date is a required field!";
} else {
$hire_date = $_POST["hire_date"];
}
$resign_date = $_POST["resign_date"];
$sql = "INSERT INTO teacher (firstname, lastname, DOB, gender, tazkira_number, phone_number, academic_field, email, position, hire_date, resign_date) VALUES (:firstname, :lastname, :DOB, :gender, :tazkira_number, :phone_number, :academic_field, :email, :position, :hire_date, :resign_date)";
$stmt = $conn->prepare($sql);
$res = $stmt->execute(["firstname"=> $firstname, "lastname" => $lastname, "DOB" => $DOB, "gender" => $gender, "tazkira_number" => $tazkira_number, "phone_number" => $phone_number, "academic_field" => $academic_field, "email" => $email, "position" => $position, "hire_date" => $hire_date, "resign_date" => $resign_date]);
$add_teacher_success_msg = "New teacher added successfully!";
}
正如您在上面看到的,这段代码在教师中插入了一些值。如果我没有在表单的输入中写入任何内容,请单击提交。空值或空值将提交到表中。请帮我解决这个问题。谢谢您正在检查无效值,但如果发现它们,则不会执行任何操作。也就是说,无论您发现什么错误,您总是运行
插入操作。我建议不要对每个错误使用单独的变量,而是将错误附加到数组中:
$errors = [];
if (empty($_POST["email"])) {
$errors[] = 'Email is required.';
}
if (empty($_POST["academic_field"])) {
$errors[] = "Academic field is required.";
}
// and so on...
然后,您可以检查$errors
是否为空,以了解是否有任何错误:
if (empty($errors)) {
// No errors, try the insert.
$sql = "INSERT INTO teacher ...";
$stmt = $conn->prepare($sql);
$res = $stmt->execute(...);
} else {
// Display the errors.
echo "You have errors:";
foreach ($errors as $error) {
echo $error;
}
}
您的“空值”实际上不是“空”值,而是“空字符串”(零字符字符串)
要使PDO将其识别为空值,必须在将空字符串插入数据库之前将其转换为空字符串
例如,您可以创建以下函数:
//e2n的意思是“空到空”,并且为了更方便的使用而缩短:
函数e2n($src)
{
if(is_string($src)&&trim($src)==“”)
{
返回null;
}
其他的
{
返回$src;
}
}
然后像这样使用它:
$sql=“在教师中插入(名字、姓氏、出生日期、性别、tazkira_号码、电话号码、学术字段、电子邮件、职位、聘用日期、辞职日期)值(:名字、:姓氏、:出生日期、:性别、:tazkira_号码、:电话号码、:学术字段、:电子邮件、:职位、:聘用日期、:辞职日期)”;
$stmt=$conn->prepare($sql);
$res=$stmt->execute([“firstname”=>e2n($firstname),“lastname”=>e2n($lastname),“DOB”=>e2n($DOB),“gender”=>e2n($tazkira_号码),“phone_号码”=>e2n($phone_号码),“学术领域”=>e2n($学术领域),“email”=>e2n($email),“position”=>e2n($position($position),“雇佣日期”=>e2n($雇佣日期),“辞职日期”=>e2n(辞职日期));
另外,我建议您重构您的算法,这样您就有了一些字段数组和用于它们的验证器名称,并遍历字段,运行相应的验证器,还可以进行e2n转换
关于错误“SQLSTATE[23000]:完整性约束冲突:1048”:
要跳过数据插入,您应该为*\u err变量添加测试:
$isOk=true;
//所有错误字段
$err_fields=['firstname_err','lastname_err','DOB_err','gender_err','tazkira_number_err','phone_number_err','position_err','academic_field_err','email_err hire_err date_err];
foreach($err_字段为$field)
{
如果(isset($$字段)和&$$字段)
{
回显“您有错误!
”;
$isOk=假;
}
}
如果($isOk)
{
//如果没有错误,则运行SQL:
$sql=“在教师中插入(名字、姓氏、出生日期、性别、tazkira_号码、电话号码、学术字段、电子邮件、职位、聘用日期、辞职日期)值(:名字、:姓氏、:出生日期、:性别、:tazkira_号码、:电话号码、:学术字段、:电子邮件、:职位、:聘用日期、:辞职日期)”;
$stmt=$conn->prepare($sql);
$res=$stmt->execute([“firstname”=>e2n($firstname),“lastname”=>e2n($lastname),“DOB”=>e2n($DOB),“性别”=>e2n($tazkira_号码),“电话号码”=>e2n($phone_号码),“学术领域”=>e2n($学术领域),“电子邮件”=>e2n($email),“职位”=>e2n($position($position),“雇佣日期”=>e2n($雇佣日期),”辞职日期“=>e2n(辞职日期)];
}
empty values!=null values请确保在尝试提交之前没有遇到任何错误。创建标志变量(开始时为false,在任何ifs中设置为true),或检查任何错误消息。SQLSTATE[23000]:完整性约束冲突:1048列“lastname”不能为null我创建了该函数并使用了该函数。从此,上面的代码出现在我的页面顶部如何删除它!为该列添加验证。如何解释更多内容?最好将所有错误推送到一个数组中,然后将其全部显示在一起,但我想编写下面的每个输入都有错误!如何操作?然后只需使用表单元素的id属性作为数组的键:$errors['name']=“您必须提供一个名称。”;
然后在呈现
时,您可以检查$errors['name']
是否存在,如果存在,请在附近呈现消息。