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

Posted

技术标签:

【中文标题】PHP - 如何提交包含指向不同 MySQL 行的输入字段的表单【英文标题】:PHP - How to submit a form containing input fields that point to different MySQL rows 【发布时间】:2011-10-06 20:13:21 【问题描述】:

我正在使用此 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; ?>

这给了我一个具有以下外观的表单:

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

实现这一点的最佳方式是什么?

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

【问题讨论】:

在没有它的情况下表单工作之前,您不应该担心使用 ajax。究竟是什么问题,你在哪里卡住了? 每个输入类型="text" 需要有一个唯一的名字,你会使用php来GET或POST名字和他们的值。 @RPM - 这带来了 2 个问题 - (1) 有没有办法将此数据作为 JSON 字符串或数组提交? -- (2) 我如何在我的控制器中循环这些数据? @torr 我不想成为“那个人”,但通过 Ajax 提交表单的最简单方法是使用“jQuery Serialize”(谷歌)。不过,您应该先让表单在没有 Ajax 的情况下工作。 是的,您可以通过 ajax 以 json 格式提交。我可以放一个代码sn-p。 【参考方案1】:

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

例如

<?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'];
    // …

【讨论】:

【参考方案2】:

没有必要使用 ajax mate。

对于每一个隐藏的输入,该行的 ID 都采用这种格式:

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

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

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

一旦你发布了表格,你就可以迭代每一行:

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

【讨论】:

【参考方案3】:

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

标记

<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.


【讨论】:

你确定他应该使用 $_REQUEST 吗?我认为最好的方法是通过 $_GET 或 $_POST 是的 - 但我不知道他是如何提交表格的。尽管 Request 也可以使用,但使用 Get 或 Post 确实更好。然而,这不是最佳实践。 这个表单是通过 ajax 加载和提交的——为了提交,我使用了 malup 的 jQuery Form 插件——为了清楚起见,我没有把这个信息放在 OP 中,因为我认为这可以在不使用 ajax 等的情况下解决跨度> @torr 好吧 - 如果您需要更多帮助,请告诉我 - 您的问题似乎已得到解答。 @kissmyface 您知道在使用复选框时此方法是否会中断吗?一切似乎都有效,除了复选框的 POST,提交后我最终得到一个未定义的变量

以上是关于PHP - 如何提交包含指向不同 MySQL 行的输入字段的表单的主要内容,如果未能解决你的问题,请参考以下文章

在 PHP 中提交表单时如何保留输入字段中的值?

提交表单时如何保留多个空格及换行的文本样式

如何使用 PHP 将文本区域数据从 HTML 文档发送到 MySQL 数据库?

Bootstrap HTML + MySQL PHP 表单安全性

如何使用 MySQL 表过滤 php 数组?

如何通过选择 * 并使用 php 在执行时间 O(1) 中访问 mysql 字段