在PHP中使用长表单或复杂表单执行POST查询的最佳方法?

在PHP中使用长表单或复杂表单执行POST查询的最佳方法?,php,mysql,post,Php,Mysql,Post,我有一些表单,其中包含用户可以编辑的内容,一个简单的例子是profile.php,其中有五个字段,用户可以更改其中三个字段(目前);姓名、姓氏和地址。html表单从sql中提取现有数据,并将其显示在可编辑的文本框中 下面是我如何获得各种变量的: <?php //PHP to submit content of profile fields. if($_SERVER["REQUEST_METHOD"] == "POST"){ //Set ID for insert statement $i

我有一些表单,其中包含用户可以编辑的内容,一个简单的例子是profile.php,其中有五个字段,用户可以更改其中三个字段(目前);姓名、姓氏和地址。html表单从sql中提取现有数据,并将其显示在可编辑的文本框中

下面是我如何获得各种变量的:

<?php
//PHP to submit content of profile fields.

if($_SERVER["REQUEST_METHOD"] == "POST"){
//Set ID for insert statement
$id=$rows['id'];
//Get name from form
if(empty($_POST['name'])){
$name = $rows['name'];
}
elseif($_POST['name'] == $rows['name']){
    $name = $rows['name'];
}
else{
        $name = $_POST['name'];
            print $name;
}
//Get Surname from form
if(empty($_POST['surname'])){
$name = $rows['surname'];
}
elseif($_POST['surname'] == $rows['surname']){
    $surname = $rows['surname'];
}
else{
        $surname = $_POST['surname'];
}
//Get Address from form
if(empty($_POST['address'])){
$name = $rows['address'];
}
elseif($_POST['address'] == $rows['address']){
    $address = $rows['address'];
}
else{
        $address = $_POST['address'];
}


$sql    = "UPDATE usr SET name = ?, surname = ?, address = ?  
where id = ?"

您也可以使用三元函数:

$name = (empty($_POST['name'])? $rows['name'] : $_POST['name']);
比如说。如果对
empty()
的调用为true(表单变量为空),它将从
$rows
返回变量,否则它将从表单返回变量


查看表单字段是否与数据库字段相同的额外代码有点浪费,因为如果表单字段与数据库字段相同,使用表单字段和使用数据库字段之间没有区别。

您可以使用键构建一个数组,然后遍历它们,从Post值中提取,并使用有效数据构建另一个数组

$keys = ['name', 'surname', 'address'];
$final = [];
foreach ($keys as $key) {
    $final[$key] = $_POST[$key] ?? $rows[$key];
}

如果每个字段的代码都是相同的,您可能会编写一个函数来处理它。例如,如果表单变量为空,您总是将数据库结果(可能是
$rows
指定给
$name
)分配给
$name>是故意的吗?是的,我没有找到更好的方法来确保字段中的值不会被用户无意中删除并作为空白提交,提交后不检查输入错误,并将用户返回页面修复错误。你能澄清一下处理多个输入post语句的函数吗?但我的意思是,对于
姓氏
表单字段,你肯定会将其分配给
$姓氏
,对于地址,你会将其分配给
$address
,就像在表单字段中有什么东西一样。至于函数,如果表单字段为空,我将传入表单字段和数据库字段,并返回适当的值。因此,您可以将其称为类似于
$name=field\u validate($\u POST['name'],$rows['name'])
的内容,您的函数代码将决定返回什么。这篇文章可能更适合于此,它比我做的要整洁得多,并且禁止在一条语句中包含所有变量,这可能是目前最好的选择。标记为应答。只要变量名与表单字段名和数据库列名相同,就可以通过
$\u POST
数组使用动态变量名。类似于
foreach($\u POST as$key=>$value){$$key=(empty($\u POST[$key])?$rows[$key]:$value));}
但我不能100%肯定它会让阅读变得更容易,如果它真的有效的话。答案很棒。这正是我想要的,特别是当与其他评论者的一些其他建议相结合时。用这个替换我以前选择的答案。