【问题标题】:How can I efficiently insert multiple form values into my MySQL table?如何有效地将多个表单值插入到我的 MySQL 表中?
【发布时间】:2015-03-23 09:34:21
【问题描述】:

我有一长串需要插入数据库的表单值。有没有一种有效的方法可以将所有这些值插入到我的数据库中的单独列中,而不是一长串庞大的条件?

这是我的代码:

PHP:

// I've removed most of them to simplify demonstration
$title = isset($_POST['title']) ? $_POST['title'] : "";
$name = isset($_POST['name']) ? $_POST['name'] : "";
$description = isset($_POST['description']) ? $_POST['description'] : "";
$how_hear = isset($_POST['how_hear']) ? $_POST['how_hear'] : "";

// I have to do this for every single form element:
if (!empty($title)) {
    DB::query('INSERT INTO `table` (`title`) VALUES (?);', array($title));
}

【问题讨论】:

  • 这一切都取决于如果每个字段都留空会发生什么?例如,如果$name 为空白,大概您不希望任何 数据写入数据库?例如,如果$how_hear 是可选的,那么将其留空就可以了?
  • 我有处理所有这些的 JavaScript 表单验证。我所做的就是插入不为空的东西
  • 那么,如果一个是空的,那它还应该继续插入其他的吗?在这种情况下,您可以只循环遍历$_POST,而不是显式写出每个项目的条件。
  • 好的,谢谢,如何循环浏览帖子?还要注意每一列都有不同的名称,那么我应该如何在循环中将值插入到不同的列中
  • 抱歉回复晚了,但我现在在下面添加了一个答案——我认为——应该做你需要的一切!

标签: php mysql pdo


【解决方案1】:
$usrData = array(
    "user" => "hello",
    "pass" => "pass1",
    "mail" => "test@email.com"
);

$cols = "";
$vals = "";
foreach($usrData as $col => $val) {
    $col = mysql_real_escape_string($col);
    $val = mysql_real_escape_string($val);

    $cols.= "`{$col}`, ";
    $vals.= "'{$val}', ";
}
$query = "INSERT INTO `myTable` (". rtrim($cols, ", ") .") VALUES (". rtrim($vals, ", ") .");";   
mysql_query($query);

【讨论】:

  • 如果这是循环遍历每个值,并且您的查询在循环之外,这是否意味着每次循环迭代都会重置该值?
【解决方案2】:

这样试试

$usrData = array(
    array(
        "user" => "hello",
        "pass" => "pass1",
        "mail" => "test@email.com"
    ),
    array(
        "user" => "user2",
        "pass" => "pass2",
        "mail" => "user2@email.com"
    )
);

$cols = "";
$bindQuery = "";
$i = 0;
foreach($usrData as $udata) {
    $vals = "";
    foreach($udata as $col => $val){    
        $col = mysql_real_escape_string($col);
        $val = mysql_real_escape_string($val);

        $vals.= "'{$val}', ";

        if($i == 0)
            $cols.= "`{$col}`, ";       
    }
    $bindQuery.= "(" . rtrim($vals, ", ") . "), ";
    $i++;
}
echo $query = "INSERT INTO `myTable` (". rtrim($cols, ", ") .") VALUES ". rtrim($bindQuery, ", ") .";";   
mysql_query($query);

【讨论】:

    【解决方案3】:

    假设

    • 数据库字段名称和表单字段名称不相同。
    • 所有数据都应插入数据库中的同一记录中。
    • 即使一个或多个字段为空白,所有数据也应输入数据库。

    发布数据示例

    以下代码在输出示例查询时使用以下示例数据(就好像它是通过POST 方法从站点发送的一样)。

    $_POST["title"] = "Mr.";
    $_POST["name"] = "Joe Bloggs";
    $_POST["description"] = "Whatever it is this field is for, presumably some text...";
    $_POST["how_hear"] = "google / search engine";
    

    代码

    $column_names = array( 
    // Structure:           db-field-name   => form-field-name                        
                            "title"         => "title",
                            "customer_name" => "name",          // Example: Database field name would be "customer_name" and the form field name would be "name"
                            "content"       => "description",
                            "pointer"       => "how_hear"
                        ); 
    
    $insert_columns = "";
    $insert_values  = "";
    
    foreach($column_names as $db_name=>$ws_name){ // Loop through fields specified in $column_names
    
        $value           = empty($_POST[$ws_name]) ? '' : $_POST[$ws_name];
    
        $insert_columns .= ", `".$db_name."`"; // Backticks to denote field names
        $insert_values  .= ", '".$value."'";   // Single quotes to denote values
    
    }
    
    // Generate the query
    // substr function removes ", " from start of strings
    $insert_query = "INSERT INTO `table_name` (".substr($insert_columns, 2).") VALUES (".substr($insert_values, 2).")";
    
    
    
    echo $insert_query; // Show example output
    // INSERT INTO `table_name` (`title`, `customer_name`, `content`, `pointer`) VALUES ('Mr.', 'Joe Bloggs', 'Whatever it is this field is for, presumably some text...', 'google / search engine')
    

    快速点

    • 简写if 语句:

      $value = empty($_POST[$ws_name]) ? '' : $_POST[$ws_name];
      
      // Is equivalent to:
      
      if( empty($_POST[$ws_name]) ) {
          $value = "";
      }
      else {
          $value = $_POST[$ws_name];
      }
      
    • 上面的代码没有对输入进行任何清理,所以不要忘记清理数据等。

    • 您可以根据需要向$column_names 数组中添加任意数量的字段,并且顺序不相关。

    • 我使用echo 来展示代码生成的查询作为示例。您显然不会这样做......相反,您会将查询 $insert_query 传递给您的数据库连接。比如:

      DB::query($insert_query);
      

      当然,这可能(或者更确切地说:)根据您连接到数据库的方式而改变...

    【讨论】:

      猜你喜欢
      • 2014-10-12
      • 2014-12-02
      • 2023-01-26
      • 2022-01-16
      • 1970-01-01
      • 2013-12-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-18
      相关资源
      最近更新 更多