将多行保存到数据库

时间:2012-06-29 20:05:21

标签: php html

我有一个行数未知的表。我正在尝试将编辑内容保存到复选框字段,选择字段和文本字段。

以下是表格行的示例(概括):

<tr onMouseover="this.bgColor='#EEEEEE'"onMouseout="this.bgColor='#FFFFFF'">
    <input type="hidden" name="batchupdate[][item1]" value="118">
    <td><a target="blank" href="www.link.com">Link</a></td>
    <td>Name</td>
    <td><input value="" type="text" name="batchupdate[][item2]" size=35></td>
    <td>
        <select name="batchupdate[][item3]">
        <optgroup label="Group 1">
            <option >1</option>
            <option >2</option>
            <option >3</option>
            <option >4</option>
            <option >5</option>
        </optgroup>
        <optgroup label="Group 2">
            <option >6</option>
            <option >7</option>
            <option >8</option>
            <option >9</option>
        </optgroup>
        </select>                           
    </td>
    <td><input type="checkbox" value="FALSE" name="batchupdate[][item4]"></td>
</tr>

“id”(item1)是postgresql数据库中的自动递增字段。

这是php:

if(isset($_POST['savebutton'])) {
    if(isset($_POST['bachtupdate']) || is_array($_POST['batchupdate']))
    {
        foreach($_POST['batchupdate'] as $i)
        {   
            $item1 = $i['item1'];
            $item2 = $i['item2'];
            $item2 = pg_escape_string($item2);
            $item3 = $i['item3'];

            if(isset($i['item4'])){
                $item4 = "TRUE";
            } else {
                $item4 = "FALSE";
            }

        $query = "UPDATE schema.table SET field2='$item2', field3='$item3', field4='$item4' WHERE id='$item1'";

        $result = pg_query($database, $query);

        if ($result) {
            // success
        } else {
            die("Error: " .pg_last_error());
        }

此后还有一些其他逻辑,但查询部分是失败的地方。我得到一个错误,基本上item3和id(item1)是空的,所以它找不到要更新的行。第2项和第4项工作正常,我可以在postgres提供的错误消息中看到它们包含的内容。

我在网上找到了这个解决方案并根据自己的需要进行了调整。我只是为什么有些领域有效而其他领域没有,我感到很困惑。想法?

编辑:

这是回声与forech循环内部相似的结果(在foreach循环中)。我评论了postgres查询。请注意,它会执行两次。我也注意到复选框没有返回true。但是,所有信息都在......,

118(id), 文字框1, 选项2, FALSE(复选框)

119(id), 文字框2, 备选方案3

118(id), 文字框1, 选项2, FALSE(复选框)

119(id), 文字框2, 备选方案3

编辑:

接下来我将尝试以下其中一项:

  1. 使用php创建唯一的名称属性(item11item12item13等),并增加一个for循环计算多少表中的行有,更改变量并执行查询。这似乎太乱了,但我想不出别的......,

  2. 不要执行foreach,而是执行for循环,如我发现的其他示例所示。不知道它会改变什么,但我觉得值得一试。

  3. 我会报告我发现的内容。

1 个答案:

答案 0 :(得分:0)

您展示的HTML有多广泛?

我的意思是,当你写作

 <input type="hidden" name="batchupdate[][item1]" value="118">

你确实在batchupdate的第一个键中放了一些东西,不是吗?

因为否则POST会发出,比方说

batchupdate[][item1]=118&batchupdate[][item3]=124...

将在batchupdate []中创建两个不同的行,一个用item1,另一个只有item3,因为[]是自动递增语法。

行的每个“组”应具有不同的ID作为第一个索引:

 <input type="hidden" name="batchupdate[row1][item1]" value="118">
 <input type="hidden" name="batchupdate[row1][item2]" value="119">
 <input type="hidden" name="batchupdate[row1][item3]" value="120">
 ...
 <input type="hidden" name="batchupdate[row2][item1]" value="123">

这将导致batchupdate的一个条目,其中item1,2和3已定义,并且等于118,119和120,这似乎正是您要找的。