PHP - 如何提交包含指向不同MySQL行的输入字段的表单

时间:2011-07-16 17:47:00

标签: php mysql ajax json codeigniter

我正在使用这个PHP设置一个表单,它循环遍历用户可能拥有的所有记录:

    <?php foreach ($items as $row): ?>
            <tr>
                <td>
                    <?php echo form_hidden('id', $row->id); ?>
                </td>
                <td>
                    <?php echo '<strong>' . $row->name . '</strong>'; ?>
                </td>
                <td>
                    <?php echo form_input('number', $number); ?>
                </td>
                <td>
                    <?php echo form_input('registry', $registry); ?>
                </td>
                <td>
                    <?php echo form_checkbox('OK', $ok, $ok); ?>
                </td>
            </tr>
    <?php endforeach; ?>

这给了我一个表格如下:

enter image description here

这里的想法是每行都属于数据库中的唯一ID /行,我想允许用户使用单个提交按钮在同一页面/表单上编辑所有内容。

实现这个目标的最佳方法是什么?

提交此数据时,应该有一种循环遍历控制器中每个信息包(来自每个用户)的方法。这可以通过ajax / json完成吗?

3 个答案:

答案 0 :(得分:2)

没有必要使用ajax配偶。

对于每个用这种格式放置一个带有行ID的隐藏输入:

<input type="hidden" name="id[<?= $row->id ?>]" value="<?= $row->id ?>" ?>

对tr中的每个元素执行相同操作,即将它们命名为

name="number[<?= $row->$id ?>]"
name="registry[<?=$row->$id ?>]"
name="ok[<?=$row->$id ?>]"

一旦发布FORM,您可以使用以下内容迭代每一行

foreach ($_POST['id'] as $key => $value) {
    echo $_POST['name'][$key];
}

答案 1 :(得分:2)

这不使用codeigntier,但在尝试使用CI来快捷此过程之前,您应该熟悉一般技术。 Codeigniter将帮助您呈现表单元素,执行验证,转义输入和执行查询 - 但如果您了解所涉及的基本原则,它只会帮助您(做任何事情)。希望这有帮助

<强> MARKUP

<form action="/process.php">
<div>
    <h2>GORDON</h2>
    <input type="text" name="user[1][number]" /> <!-- The number corresponds to the row id -->
    <input type="text" name="user[1][registry]" />
    <input type="checkbox" name="user[1][ok]" value="1" />
</div>
<div>
    <h2>ANDY</h2>
    <input type="text" name="user[242][number]" />
    <input type="text" name="user[242][registry]" />
    <input type="checkbox" name="user[242][ok]" value="1" />
</div>
<div>
    <h2>STEWART</h2>
    <input type="text" name="user[11][number]" />
    <input type="text" name="user[11][registry]" />
    <input type="checkbox" name="user[11][ok]" value="1" />
</div>

<input type="submit" />

<强> PHP

$users = $_REQUEST['user'];

foreach ($users as $rowId => $info){

    // YOU SHOULD MAKE SURE TO CLEAN YOUR INPUT - THIS IS A GUESS AT WHAT YOUR DATA TYPES MIGHT BE
    $id = (int) $rowId;
    $number = (int) $info['number'];
    $registry = mysql_real_escape_string($info['registry']);
    $ok = (int) ($info['ok']);

    $q = "UPDATE user SET number = $number, registry = '$registry', ok = $ok WHERE id = $id";
    mysql_query($q);

    // You may want to check that the above query was sucessful and log any errors etc.

}

答案 2 :(得分:1)

您需要将输入名称设置为数组名称,因此您将发送整个表单并可以迭代条目。

e.g。

<?php
echo form_input('userdata[' . $row->id . '][number]', $number);
?>

可能会创建一个

<input name="userdata[1][number]" />

(我不知道那些形式函数来自哪里......)

这将产生一个数组$_POST['userdata'],可以通过以下方式迭代:

foreach($_POST['userdata'] as $userId => $userInputFields)
{
    $user = new User($userId);
    $user->number = $userInputFields['number'];
    // …
}