插入多个复选框和文本字段中的值

时间:2014-01-03 10:14:38

标签: php mysql checkbox insert textfield

我是PHP的初学者。我遇到了问题。我的想法是,我必须将演员分配给选定的电影,并为每个电影添加一个角色。我需要从列表中选择几个值,并为每个via texfields添加一个描述。我的代码将所有选中的值添加到数据库中,但它使文本字段中的值变得混乱,选中的值与描述不匹配。我非常感谢你的帮助! 我的代码: 表格:

<?php
$sqlquery = "SELECT artistId, firstname, lastname from $artists order by 2";
$result = mysqli_query($connect, $sqlquery);
if($result) {
    echo "<table class=\"addactor\">";
    echo "<tr>
        <td id=\"text\" colspan=\"2\"><h3>Assign an actor to the movie</h3></td>
    </tr>";
    while($sqlRow = mysqli_fetch_array($result, MYSQL_ASSOC)) {
        echo "<tr>";
        echo "<td>";
        echo "<input type=\"checkbox\" name=\"checkbox[]\" value=\"" . $sqlRow['artistId'] . "\"/> " . $sqlRow['firstname'] . " " . $sqlRow['lastname'] . "</td><td><input type=\"text\" name=\"textbox[]\"/></td>";
        echo "</tr>";

    }
    echo "<tr><td align=\"right\"><input type=\"submit\" name=\"submit\" id=\"submit\" value=\"Add\"></td><td><input type=\"reset\" name=\"reset\" id=\"reset\" value=\"Reset\"></td></tr></table>;";

}
print '</table>';

与数据库的连接位于另一个文件中,该文件包含在此处。

第二部分:

if($_POST) {
        $checkbox = $_POST['checkbox'];
        $txt = $_POST['textbox'];
        $len = sizeof($checkbox);
        for($i = 0; $i < $len; $i++) {
            $sqlqr = "INSERT INTO $role (artistId, movieCode, Description) VALUES ('" . $checkbox[$i] . "', '" . $_POST['moviecode'] . "', '" . $txt[$i] . "')";
            mysqli_query($connect, $sqlqr);
        }
        $query = "INSERT INTO $movies(movieCode, title, dateOfIssue,category, description, image) VALUES ('" . $_POST['moviecode'] . "', '" . $_POST['title'] . "', '" . $_POST['dateofissue'] . "','" . $_POST['category'] . "', '" . $_POST['desc'] . "', '" . $_POST['image1'] . "')";
        mysqli_query($connect, $query);
        if(mysqli_query($connect, $query) || mysqli_query($connect, $sqlqr)) {
            echo "<h4>1 record added</h4>";

        }
        else {
            die('Error: ' . mysqli_error($connect));
        }
        print '</form>';
    }

3 个答案:

答案 0 :(得分:1)

未提交未经检查的值且checkbox数量与textbox不同。 您应该为输入名称数组提供相同的键:

$i = 0;
while($sqlRow = mysqli_fetch_array($result, MYSQL_ASSOC)) {
    echo "<tr>";
    echo "<td>";
    echo "<input type=\"checkbox\" name=\"checkbox[".$i."]\" value=\"" . $sqlRow['artistId'] . "\"/> " . $sqlRow['firstname'] . " " . $sqlRow['lastname'] . "</td><td><input type=\"text\" name=\"textbox[".$i."]\"/></td>";
    echo "</tr>";
    $i++;
}

也使用此代码:

$checkbox = $_POST['checkbox'];
$txt = $_POST['textbox'];
foreach ($checkbox as $key => $value)
    $sqlqr = "INSERT INTO $role (artistId, movieCode, Description) VALUES ('" . $value . "', '" . $_POST['moviecode'] . "', '" . $txt[$key] . "')";
    mysqli_query($connect, $sqlqr);
}

答案 1 :(得分:0)

使用mysql_escape_string($_POST[''])代替mysqlquery中的每个字段$_POST['']

答案 2 :(得分:0)

正如17.2.1 Control types所述:

  

提交表单后,只有“on”复选框控件可以变为successful

换句话说,浏览器只会提交已经“检查”的复选框控件,但会提交每个文本框控件无论复选框控件的状态,您希望它是什么相关联。

因此,除非选中所有复选框控件,否则PHP从表单提交中创建的数组$_POST['checkbox']$_POST['textbox']将包含不同数量的元素 - 因此,具有任何给定索引的数组可能不会匹配。

有两种方法可以解决这个问题:

  1. 如果取消选中相应的复选框,可以使用client-side scripting to disable the textbox:这会阻止浏览器提交文本框,因此, PHP中的数组将再次对齐(但请注意,此解决方案取决于客户端脚本的可用性 - 您必须测试并处理此类脚本不可用的情况);或

  2. 可以为控件提供显式索引,以确保它们始终对齐。

  3. 你也应该阅读正确的字符串转义(以及如何将错误暴露给你的应用程序以及bug和常被利用的攻击媒介):我完全推荐@ deceze的博客文章,{{ 3}}

    特别是,正如他在文章中所描述的那样,您应该确保在传输到浏览器之前转义变量中的任何HTML(为了防止The Great Escapism (Or: What You Need To Know To Work With Text Within Text)和要输出的文本包含字符的错误在HTML中有特殊含义,例如<):

    $result = mysqli_query($connect, "
      SELECT   artistId, CONCAT(firstname, ' ', lastname) AS fullname
      FROM     $artists
      ORDER BY firstname
    ");
    
    if ($result) {
      echo '
        <table class="addactor">
          <tr>
            <td id="text" colspan="2"><h3>Assign an actor to the movie</h3></td>
          </tr>';
    
      $i = 0;
      while ($sqlRow = mysqli_fetch_array($result, MYSQL_ASSOC)) {
        echo '
          <tr>
            <td>
              <input type="checkbox"
                     name="checkbox[',$i,']"
                     value="', htmlentities($sqlRow['artistId']), '"
              />', htmlentities($sqlRow['fullname']), '
            </td><td>
              <input type="text" name="textbox[',$i,']"/>
            </td>
          </tr>';
        $i++;
      }
    
      echo '
          <tr>
            <td align="right">
              <input type="submit" name="submit" id="submit" value="Add">
            </td><td>
              <input type="reset" name="reset" id="reset" value="Reset">
            </td>
          </tr>
        </table>';
    }
    

    此外,将用户提供的未转义字符串直接连接到SQL中不仅使您容易受到XSS attacks的攻击,而且还会引入错误,其中字符串包含在SQL字符串文字中具有特殊含义的字符(例如{{ 1}})。

    SQL injection attack准备带有占位符的SQL语句,用于在命令执行时使用变量替换的参数;这也提供了性能提升,因为语句只需要准备一次,而不管它们执行的次数如何:

    '