Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从PHP发布表单清理和构造查询的快速方法_Php_Mysql_Arrays_Forms_Http Post - Fatal编程技术网

从PHP发布表单清理和构造查询的快速方法

从PHP发布表单清理和构造查询的快速方法,php,mysql,arrays,forms,http-post,Php,Mysql,Arrays,Forms,Http Post,我有一个表单,它有100多个字段(大部分是复选框),虽然不是每个字段都被填写,但是会有大量的字段被填写。输入每个字段来清理和构造MySQL查询的想法让我哭泣,所以我想一定有办法使用PHP循环来实现这一点 我成功地清理了表单,而没有写出$\u POST数组中的每个元素,并将其以$key=>$value的形式存储在$formarray中$密钥不是数字或顺序的,需要保留。$key的值与将写入$value的数据库表中的列名相同 我希望能够构造MySQL查询,使用PHP循环将$formarray的内容插入

我有一个表单,它有100多个字段(大部分是复选框),虽然不是每个字段都被填写,但是会有大量的字段被填写。输入每个字段来清理和构造MySQL查询的想法让我哭泣,所以我想一定有办法使用PHP循环来实现这一点

我成功地清理了表单,而没有写出$\u POST数组中的每个元素,并将其以$key=>$value的形式存储在$formarray中$密钥不是数字或顺序的,需要保留。$key的值与将写入$value的数据库表中的列名相同


我希望能够构造MySQL查询,使用PHP循环将$formarray的内容插入MySQL表。这可能吗?

这是可能的,但不推荐,除非您非常小心。使这种循环方法安全可能会花费与所有表单字段的所有键入相同的时间,但您的解决方案将更加健壮和模块化

您应该创建一个映射数组,其中包含有关验证和格式化特定值的指令,如下所示:

$validator = array(
    'user_name' => array('mask' => "'%s'", 'escape' => true,  'boolean' => false),
    'user_age'  => array('mask' => "%d",   'escape' => false, 'boolean' => false),
    'has_car'   => array('mask' => "%d",   'escape' => false, 'boolean' => true)
);
然后迭代此验证程序数组,检查所发布的数据中是否存在该键,并对该值应用指令,并在单独的数组中收集所有SQL集:

$set = array();
foreach ($_POST as $key => $dirs)
{
    if ($dirs['boolean'])
    {
        $val = isset($_POST[$key]) ? 1 : 0;
        $set[] = sprintf("%s=".$dirs['mask'],$key,$val);
    }
    elseif (isset($_POST[$key]))
    {
        $val = $dirs['escape'] ? addslashes($_POST[$key]) : $_POST[$key];
        $set[] = sprintf("%s=".$dirs['mask'],$key,$val);
    }
}
在此之后,您可以通过内爆集合来创建查询:

$sql = "INSERT INTO table SET ".implode(",",$set);
我上面的方法可能不适合您的实际需要,但更适合您在服务器端处理大型表单。您可以定义更复杂的验证,并使其也处理数组,而不仅仅是像本例这样的复选框和文本字段


时刻保持警惕,你的表格是通往你宝贵数据的大门,如果你变得便宜,你会后悔的

您可能需要研究使用PDO和准备好的语句。它的一个优点是可以为您处理转义“可疑”字符。

您可以通过直接从数据库获取列名来创建列的白名单。然后,您可以根据该列表验证已发布的字段。通过PDO使用准备好的语句,您可以轻松构建SQL语句来执行插入。准备好的语句使您不必转义数据,但您可能希望在将值插入数据库之前执行一些验证

如果需要,SHOW COLUMNS语句将提供有关列的其他信息,因此您可以使用它仅获取
BOOL

下面是一个完全未经测试的示例:

$dbh    = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
$valid = array();

foreach($dbh->query('SHOW COLUMNS FROM mytable') as $col) {
    $field = $col['Field'];
    if( isset($_POST[ $field ]) ) {
        // Insert suitable validation here.
        $validated_value = get_validated_value( $_POST[ $field ] );
        $valid[ $field ] = $validated_value;
    }
}

$cols   = implode(',', array_keys($valid));
$params = implode(',', array_fill(0, count($valid), '?'));
$sql    = "INSERT INTO mytable ($cols) VALUES ($params)";
$stmt   = $dbh->prepare( $sql );
$stmt->execute( array_values($valid) );

你能提供你当前的代码吗?您的数据库看起来怎么样?它确实是一个有100列的表,还是应该将值作为单独的行插入。