这有点令人困惑,所以我希望我很清楚。
我最近访问了一个网站,该网站提供了如何格式化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列,Data 3进入data_3列。也插入了三行。
有没有人做过这样的事情?
我看到了这些,但它们似乎没有覆盖同一行中的多个字段:
MySQL insert from a textarea to multiple rows How to insert multiple row from textareas in MySQL
答案 0 :(得分:0)
给出样本数据:
$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')
答案 1 :(得分:0)
您只需使用以下代码:
不要忘记你在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 */
?>