【问题标题】:Inserting multiple rows/columns from a textarea in MySQL从 MySQL 中的 textarea 插入多行/列
【发布时间】:2017-01-31 20:48:03
【问题描述】:

这有点令人困惑,所以我希望我清楚。

我最近访问了一个网站,该网站提供了有关如何在 textarea 中格式化文本的说明,并将数据插入到数据库的多个字段和多行中。

例如,在文本区域中,您可以输入:

Data 1a, Data 2a, Data 3a
Data 1b, Data 2b, Data 3b
Data 1c, Data 2c, Data 3c

提交后,数据1进入data_1列,数据2进入data_2列,数据3进入data_3列。也插入了三行。

有人做过这样的事吗?

我看到了这些,但它们似乎没有涵盖同一行中的多个字段:

MySQL insert from a textarea to multiple rows How to insert multiple row from textareas in MySQL

【问题讨论】:

  • 您只需使用explode(",", $textarea); 并创建一个数组,然后使用一个一个插入您的记录:)
  • 但这会在每行的基础上爆炸,而不是每行。那么,我需要做2次爆炸吗? 1 行,然后每行中的每个字段另一个?
  • 不,您只需在第 3 个和第 6 个值后添加逗号并检查单个爆炸并使用 str_replace 删除 \r\n
  • 但是如何在 3 个新行中插入 3 个字段?
  • 恕我直言,您必须进行 2 次爆炸 - 一次用于行/行/SQL 语句,第二次用于归档。如果有人在您的文本区域中使用分隔符和引号,还要考虑如何转义它们

标签: php mysql


【解决方案1】:

给定样本数据:

$input = 'Data 1a, Data 2a, Data 3a
Data 1b, Data 2b, Data 3b
Data 1c, Data 2c, Data 3c';

简单的方法:

$lines = explode("\n", $input);
$data = [];
foreach ($lines as $line) {
    $items = explode(",", $line);
    $row = [];
    foreach ($items as $item) {
        $row[] = trim($item);
    }
    $data[] = $row;
}

捷径:

$data = array_map(function($row){
    return preg_split("/\\s*,\\s*/", $row);
}, explode("\n", $input));

或者更好:

$data = array_map(function($line){
    return array_map('trim', str_getcsv($line));
}, explode("\n", $input));

str_getcsv() 可以做的不仅仅是explode()preg_split()。例如,一个值可以包含一个逗号,如果它被引用(如Data 1a, "Data, 2a", Data 3a

无论如何,您的 $data 数组将如下所示:

array (
  0 => 
  array (
    0 => 'Data 1a',
    1 => 'Data 2a',
    2 => 'Data 3a',
  ),
  1 => 
  array (
    0 => 'Data 1b',
    1 => 'Data 2b',
    2 => 'Data 3b',
  ),
  2 => 
  array (
    0 => 'Data 1c',
    1 => 'Data 2c',
    2 => 'Data 3c',
  ),
)

现在您可以遍历数据并将其插入数据库。不要忘记验证和转义(或使用准备好的语句)。如果数据有问题,您可能希望向用户显示错误。

如果您可以信任数据(通常不应该),您可以通过替换一些模式将给定的字符串修改为 INSERT 语句:

$sql = preg_replace('/,\\s*/', "', '", $input);
$sql = preg_replace('/\\n/', "'), \n('", $sql);
$sql = "('" . $sql . "')";
$sql = "insert into my_table (c1, c2, c3) values \n" . $sql;

$sql 现在看起来像:

insert into my_table (c1, c2, c3) values 
('Data 1a', 'Data 2a', 'Data 3a'), 
('Data 1b', 'Data 2b', 'Data 3b'), 
('Data 1c', 'Data 2c', 'Data 3c')

【讨论】:

    【解决方案2】:

    您只需使用以下代码:

    不要忘记您在 textarea 中的所有值都用逗号分隔。

     <?php
    
        $query = "insert into table (col1, col2, col3) values ";
    
        /*Get Post Data of Textarea*/
        $textarea = escape_string($_POST['yourTextArea']);
    
        /*replace values of */
        $getdata = str_replace("\r", "", str_replace("\n", "", $textarea));
    
        /* explode data to array */
        $data = explode(",", $textarea);
    
        /*create a empty array*/
        $dataForInsert = array();
    
        /*Set row start val*/
        $row = 1;
    
        foreach($data as $key=>$val){
           if(($key + 1) % 3 == 0){
                $row++;
           }
           $dataForInsert[$row][$key] = $val;
        }
    
        foreach($dataForInsert as $k=>$v){
    
            $query .= "("
    
            foreach($v as $k1=>$v1){
                 if((count($v)-1) == $k1){
                     $query .= "'".$v1."'),";     
                 }else{
                     $query .= "'".$v1."', ";
                 }
            }
    
            if(count($dataForInsert) == $k){
                $query = substr($query, 0, strlen($query)-1);
            }
        }
        /* and use your query string here */
     ?>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-27
      • 2017-05-16
      • 2016-05-12
      • 1970-01-01
      • 2012-12-21
      相关资源
      最近更新 更多