【问题标题】:Quicker way of sanitising and constructing query from PHP posted form从 PHP 发布表单清理和构建查询的更快方法
【发布时间】:2011-11-01 06:01:52
【问题描述】:

我有一个包含 100 多个字段(其中大部分是复选框)的表单,虽然并非每个字段都始终填写,但会有很多字段。输入每个字段以清理和构建 MySQL 查询的想法让我哭了,所以我认为必须有一种方法可以使用 PHP 循环来做到这一点。

我已经设法清理了表单,而无需写出 $_POST 数组中的每个元素,并将其以 $key=>$value 的形式存储在 $formarray 中。 $key 不是数字或顺序的,需要保留。 $key 的值与要写入 $value 的数据库表中的列名相同。

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

【问题讨论】:

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

标签: php mysql arrays forms http-post


【解决方案1】:

这是可能的,但不推荐,除非你非常小心。确保这种循环方法安全可能会花费与为所有表单字段进行所有输入一样多的时间,但您的解决方案将更加健壮和模块化。

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

$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);

我上面的方法可能不适合您的实际需求,但更多的是您可以用来在服务器端处理大型表单的概念。您可以定义更复杂的验证,并使其也处理数组,而不仅仅是像本例那样的复选框和文本字段。

始终保持警惕,您的表单是您宝贵数据的前门,如果您贪便宜,您会后悔的!

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      您可以通过直接从数据库中获取列名来创建列白名单。然后,您可以根据该列表验证您发布的字段。通过 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) );
      

      【讨论】:

        猜你喜欢
        • 2011-10-06
        • 2011-08-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-28
        • 2012-10-08
        • 2014-08-06
        • 1970-01-01
        相关资源
        最近更新 更多