【问题标题】:How to post many text boxes in one form to databases如何以一种形式将多个文本框发布到数据库
【发布时间】:2013-12-15 12:50:08
【问题描述】:

我有这个脚本,我想将表单中的值发布到我的数据库中。我想将多个文本框发布到一个表单中。

问题是,只有最后一个文本框得到更新。

<form action='' method='post'>
<?php
    for ($i=0; $i<$count; $i++) {
        echo "<input type='text' name='".$i."' />
        <input type='hidden' name='img_id' value='".$img_id."' />
        <input type='hidden' name='loop' value='".$i."' />";
    }
?>
<input type='submit' value='Update' name='update' /></form>
<?php 
    if (isset($_POST['update'])) {
        //now i need help
        $query = "UPDATE photos SET description = '".$_POST[$_POST['loop']]."' WHERE id = '".$img_id."'";
        $res = mysql_query($query) or die(mysql_error);
    }
?>

例如,循环 4 次,这意味着我有 4 个文本框。

在我的脚本中,这里没有完整编写,代码只更新数据库中的最后一个循环。

【问题讨论】:

    标签: php mysql forms post


    【解决方案1】:

    首先,您需要对 HTML 中的 name 属性使用 PHP 数组表示法。否则,您将有多个输入具有相同的name,并且只会发布其中一个

    echo "<input type='text' name='".$i."' />
          <input type='hidden' name='img_id[]' value='".$img_id."' />
          <input type='hidden' name='loop[]' value='".$i."' />";
    

    现在您可以在 PHP 中以数组的形式访问这些元素。

    foreach ($_POST['img_id'] as $key=>$value) {
        // img_id's value is in $value
        // loop's value is in $_POST['loop'][$key]
    }
    

    使用 foreach 构建查询并在循环后执行所有查询。


    您的查询对 SQL 注入开放。至少使用mysql_real_escape_string(更好的是:准备好的语句,这也将提高性能,因为您总是有相同的查询,只有不同的输入)。还要记住mysql_* 函数是officially deprecated,因此不应在新代码中使用。您可以改用 PDO 或 MySQLi。请参阅this answer on SO 了解更多信息。

    【讨论】:

    • 我在原始代码中使用了 mysql_real_escape_string :D 但我在这里缩短了代码。
    【解决方案2】:

    您需要使表单元素的名称独一无二,以免它们发生冲突。一种方法是将它们作为数组发布:

    另外,您不能使用相同的$count 变量来循环潜在结果吗?

    看起来您正在发布名称为 loop 的隐藏项,以便通过您需要执行的循环次数。如果没有,您可以像这样发布循环变量,但您可以使用它代替$count 进行更新循环。另外,我会考虑只在最后一次添加该元素 - 改为使用 $count 的值。

    例如像这样的东西可能对你有用......

    <form action='' method='post'>
    <?php
        for ($i=0; $i<$count; $i++) {
    
            // How is img_id set here?  You have no indication in your example - I'll assume that you've put them into an array...
    
            echo "<input type='hidden' name='img_id[\"".$i.\""]' value='".$img_id[$i]."' />";
            echo "<input type='text' name='name[".$i."]' />";
        }
    ?>
    <input type='submit' value='Update' name='update' /></form>
    <?php 
        if (isset($_POST['update'])) {
            for ($i=0; $i<$count; $i++) {
                if ( array_key_exists( 'name', $_POST ) && is_array( $_POST['name'] ) && array_key_exists( $i, $_POST['name' ] ) {
                    $query = "UPDATE photos SET description = '".$_POST['name'][$i]."' WHERE id = '".$_POST['img_id'][]."'";
                    $res = mysql_query($query) or die(mysql_error);
                }
            }
        }
    ?>
    

    或者,如果你不能使用$count

    <form action='' method='post'>
    <?php
        echo( "<input type='hidden' name='loop' value='".$count."' />" );
        for ($i=0; $i<$count; $i++) {
    
            // How is img_id set here?  You have no indication in your example - I'll assume that you've put them into an array...
    
            echo "<input type='hidden' name='img_id[\"".$i.\""]' value='".$img_id[$i]."' />";
            echo "<input type='text' name='name[".$i."]' />";
        }
    ?>
    <input type='submit' value='Update' name='update' /></form>
    <?php 
        if (isset($_POST['update'])) {
    
            for ($i=0; $i<$_POST['loop']; $i++) {
    
                if ( array_key_exists( 'name', $_POST ) && is_array( $_POST['name'] ) && array_key_exists( $i, $_POST['name'] ) {
                    $query = "UPDATE photos SET description = '".$_POST['name'][$i]."' WHERE id = '".$_POST['img_id'][$i]."'";
                    $res = mysql_query($query) or die(mysql_error);
                }
            }
        }
    ?>
    

    【讨论】:

    • Kingkero 还对您使用 mysql 以及您对 sql 注入攻击持开放态度这一事实发表了评论 - 不要忽视它!
    • $img_id 未定义?您与array_key_exists 的行也可以简化为if(isset($_POST['name][$i])) {
    • 如果$img_id 在我的脚本中未定义,那么它在提供的示例中未定义。和$count 一样 - 我假设提供的代码不完整。您关于if 声明的观点已被采纳,尽管我喜欢为初学者完整地阐述这些观点,以便更容易看到可能 遗漏或出错的地方。它的行为可能相同,但较长的版本在教程中传达了更多信息。
    • 不,实际上不是。
    • @AmirRami 不,什么不是?
    【解决方案3】:

    你必须使用类似的东西,

    if (isset($_POST['update'])) {
    
    for($i=0; $i<=$_POST['loop']; $i++){
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-07
      相关资源
      最近更新 更多