PHP表单以数组作为行提交
Posted
技术标签:
【中文标题】PHP表单以数组作为行提交【英文标题】:PHP Form submit with arrays as rows 【发布时间】:2013-06-20 04:30:48 【问题描述】:我在 php 中有以下表单,但我想做insert.php
操作,将所有内容插入 mysql 中的新行...我不知道该怎么做,因为有几个字段集,一个简单的表格很容易,但不是每个$_cliente
和$_servicio
代码更新
<?php
require("database.class.php");
//database server
define('DB_SERVER', "localhost");
//database usuario
define('DB_USER', "root");
//database password
define('DB_PASS', "root");
define('DB_DATABASE', "nivelservicio");
$db = new Database(DB_SERVER, DB_USER, DB_PASS, DB_DATABASE);
$db->connect();
$sql = "SELECT * FROM servicios";
$_row = $db->query($sql);
$_servicios = array();
while($row = $db->fetch_array($_row))
$_servicios[$row['id']] = $row['nombre'];
$sql = "SELECT * FROM clientes";
$_row = $db->query($sql);
$_clientes = array();
while($row = $db->fetch_array($_row))
$_clientes[$row['id']] = $row['nombre'];
?>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title></title>
<style>
body
margin:0;
border:0;
#formfieldset
width: 350px;
font-family: helvetica, sans-serif, verdana;
font-size:12px;
h1
font-size:36px;
font-family: Georgia;
font-style: italic;
border-bottom:1px solid #000;
h2
font-size:18px;
font-color:#1E1E1E;
</style>
</head>
<body>
<form action="insert.php" method="post">
<div id="formfieldset">
<?php foreach ($_clientes as $key_cliente => $cliente) :
switch ($cliente)
case "Produban":
$_servicios = array_diff($_servicios, array(
"GESTI",
"VULCANO"
));
break;
?>
<h1><?php echo $cliente ?></h1>
<input type='hidden' name='cliente_id[<?php echo $key_cliente ?>' value='<?php echo $key_cliente ?>'>
<?php foreach($_servicios as $key_servicio => $servicio) : ?>
<h2><?php echo $servicio ?></h2>
<input type="hidden" name="servicio_id[<?php echo $key_cliente ?>][<?php echo $key_servicio ?>]" value="<?php echo $key_servicio; ?>">
<label>Estado</label>
<select name="estado[<?php echo $key_cliente ?>][<?php echo $key_servicio ?>">
<option value="OK">OK</option>
<option value="KO">KO</option>
</select>
<label>Texto</label><input type="text" name="texto">
<?php endforeach; ?>
<?php endforeach; ?>
<br>
<input type="submit" name="insertar" value="Insertar">
</div>
</form>
</body>
</html>
<?php
$db->close();
?>
插入.php
if(isset($_POST['insertar']))
var_dump($_POST);
foreach ($clientes as $key_cliente => $cliente)
foreach ($servicios as $key_servicio => $servicio)
//echo $_POST['estado'][$key_cliente][$key_servicio] . '<br />';
$sql = "INSERT INTO datos
(servicio_id, cliente_id, estado, texto, fecha)
VALUES
('".$_POST['servicio_id'][$key_cliente][$key_servicio]."',
'".$_POST['cliente_id'][$key_cliente][$key_servicio]."',
'".$_POST['estado'][$key_cliente][$key_servicio]."',
'".$_POST['texto'][$key_cliente][$key_servicio]."',
'".date('d-m-Y')."'
)";
$db->query($sql);
echo "Valores insertados";
【问题讨论】:
【参考方案1】:您需要将输入字段的名称更改为这样的数组:
<select name="estado[]">
然后在你的 PHP 中你可以这样做:
<?php
foreach ($_POST['estatdo'] as $key => $val)
echo $_POST['estatdo'][$key] . ' - ' echo $_POST['texto'][$key] . ' - ' echo $_POST['servicio_id'][$key] . '<br />';
这是一个完整的例子:
<form action="insert.php" method="post">
<div id="formfieldset">
<?php foreach ($_clientes as $key_cliente => $cliente) :
switch ($cliente)
case "Produban":
$_servicios = array_diff($_servicios, array(
"GESTI",
"VULCANO"
));
break;
?>
<h1><?php echo $cliente ?></h1>
<input type='hidden' name='cliente_id[<?php echo $key_cliente ?>]' value='<?php echo $key_cliente ?>'>
<?php foreach($_servicios as $key_servicio => $servicio) : ?>
<h2><?php echo $servicio ?></h2>
<input type="hidden" name="servicio_id[<?php echo $key_cliente ?>][<?php echo $key_servicio ?>]" value="<?php echo $key_servicio; ?>">
<label>Estado</label>
<select name="estado[<?php echo $key_cliente ?>][<?php echo $key_servicio ?>]">
<option value="OK">OK</option>
<option value="KO">KO</option>
</select>
<label>Texto</label><input type="text" name="texto">
<?php endforeach; ?>
<?php endforeach; ?>
<br>
<input type="submit" name="insertar" value="Insertar">
</div>
</form>
所以在这个例子中,我们有一个双嵌套数组,所以我们有estado[][]
,而不是estado[]
。另外,我没有使用 [] 来创建具有连续数字键(即 0、1、2、3)的数组,而是将其更改为使用客户端 ID 和服务 ID,如下所示:
<select name="estado[<?php echo $key_cliente ?>][<?php echo $key_servicio ?>]>
然后在你的 php 中你可以像这样循环遍历它:
foreach ($clientes as $key_cliente => $cliente)
foreach ($servicios as $key_servicio => $servicio)
echo $_POST['estado'][$key_cliente][$key_servicio] . '<br />;
【讨论】:
这很好用,但是 $keys 有问题。我有 7 个 $_cliente 和大约 40 个 $_servicio...所以当 > 7...( ! ) Notice: Undefined offset: 8 in /var/www/nivelservicio/insert.php on line 14
你能给我一些建议吗?谢谢你:)
所以我更新了答案来告诉你如何做一个嵌套数组
@user1381537 我的猜测是 $_POST['insertar'] 没有设置。尝试将 var_dump($_POST) 放在打开 之后的第一行
而不是提交按钮的名称有一个隐藏字段而不是<input type="hidden" name="insertar" value="true" />
原因是您可以提交表单而无需单击提交按钮。如果您提交表单(即,通过在输入字段内按 Enter),则不会发送提交按钮的值!以上是关于PHP表单以数组作为行提交的主要内容,如果未能解决你的问题,请参考以下文章