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) 放在打开 之后的第一行 而不是提交按钮的名称有一个隐藏字段而不是&lt;input type="hidden" name="insertar" value="true" /&gt; 原因是您可以提交表单而无需单击提交按钮。如果您提交表单(即,通过在输入字段内按 Enter),则不会发送提交按钮的值!

以上是关于PHP表单以数组作为行提交的主要内容,如果未能解决你的问题,请参考以下文章

具有无限字段的表单

Simpletest PHP 脚本浏览器...如何测试提交表单名称中包含 [ ] 的表单(基本上是数组格式)?

php 提交多行多列的form表单

Ruby on Rails:以表单提交数组

关于PHP的表单数组提交显示

将数据数组从表单传递到 ajax 到 PHP 发布文件