PHP表单以数组作为行提交

时间:2013-06-23 15:39:26

标签: php mysql arrays forms

我在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();
?>

insert.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 个答案:

答案 0 :(得分:3)

您需要将输入字段的名称更改为以下数组:

<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 />;
    }
}