【问题标题】:Update echoed data using WHILE loop. Only updates one record使用 WHILE 循环更新回显数据。只更新一条记录
【发布时间】:2013-04-20 02:55:37
【问题描述】:

我似乎无法更新除第一条记录之外的任何记录。 我不确定如何修改任何显示的记录。

<?php

    if(isset($_POST["action"]) == "update")
    {
        $id = $_POST['m_id'][0];
        $type = $_POST['type'][0];
        // if I echo $id & $type, it only gives me the first record.**
        mysql_query("
          UPDATE membership_type
          SET mt_type ='$type'
          WHERE mt_id = '$id'"
        );
    } 

    ?>

所有这些都在同一个 php 页面中。

<form name=form action='' method='post'>

  <?php 
  $result=mysql_query("SELECT * FROM membership_type;");
  while($rows=mysql_fetch_array($result))
  {  ?>
    <input size=35 class=textField type=text name='type[]' value='<?php echo  $rows['mt_type']; ?>'>
    <input type=hidden name='m_id[]' value="<?php echo $rows['mt_id']; ?>">
    <input type=submit value="Update">
  <?php 
  } 
  ?>

我如何通过点击更新按钮来编辑任何显示的记录???

【问题讨论】:

  • 不要使用 mysql_query,它已被弃用。您的代码也对 sql 注入开放。

标签: php mysql forms post while-loop


【解决方案1】:

首先:您应该切勿使用已弃用的 mysql_* 函数。
第二:试试这个代码:

<?php  

// Get a connection to the database
$mysqli = new mysqli('host', 'user', 'password', 'database');

// Check if there's POST request in this file
if($_POST){ 

    foreach($_POST['m_id'] as $id => $type){
      $query = "UPDATE membership_type
                SET mt_type = '".$type."'
                WHERE mt_id = '".$id."'";

      // Try to exec the query
      $mysqli->query($query) or die($mysqli->error);
    }
}else{ 

  // Get all membership_type records and then iterate
  $result = $mysqli->query("SELECT * FROM membership_type") or die($mysqli->error); ?>

  <form name='form' action='<?php echo $_SERVER['PHP_SELF'] ?>' method='post'>
    <?php while($row = $result->fetch_object()){ ?>
      <input size='35' 
             class='textField' 
             type='text' 
             name='m_id[<?php echo $row->mt_id ?>]' 
             value='<?php echo $row->mt_type; ?>'>
      <input type='submit' value="Update">
    <?php } ?>
  </form>

<?php } ?>

第三:为了增加安全性(此代码易受攻击),请尝试mysqli_prepare

【讨论】:

    【解决方案2】:

    每次提交表单时只更新第一条记录,因为您设置了$id = $_POST['m_id'][0],其中包含第一个type[] 文本框的值。要同时更新所有其他记录,请循环访问 $_POST['m_id']

    【讨论】:

      【解决方案3】:

      替换它。希望这行得通。

      <?php
      
          if(isset($_POST["action"]) == "update")
          {
              $id = $_POST['m_id'];
              $type = $_POST['type'];
              $i = 0;
              foreach($id as $mid) {
                   mysql_query("UPDATE membership_type
                               SET mt_type='".mysql_real_escape_string($type[$i])."'
                               WHERE mt_id = '".intval($mid)."'") OR mysql_error();
              $i++;
              }
          } 
      
          ?>
      

      【讨论】:

      • 让我试试最后一个:)
      • 它正在一次更新所有这些。我想这很好。我不需要所有的更新按钮。我猜只有一个
      【解决方案4】:

      试试这个:

      if(isset($_POST["action"]) == "update")
      {
              $id = $_POST['m_id'];
              $type = $_POST['type'];
              $loopcount = count($id);
              for($i=0; $i<$loopcount; $i++)
              {
                mysql_query("
                 UPDATE membership_type
                 SET mt_type ='$type[$i]'
                 WHERE mt_id = '$id[$i]'"
                );
             }
      } 
      

      【讨论】:

        【解决方案5】:

        您的 HTML 格式错误,您作为数组传递,但只使用第一个元素。考虑:

        <form name="form" action="" method="post">
        
        <?php 
        $result = mysql_query("SELECT * FROM membership_type;");
        while($row = mysql_fetch_array($result))
            echo sprintf('<input size="35" class="textField" type="text" name="m_ids[%s]" value="%s" />', $row['mt_id'], $row['mt_type']);
        ?>
            <input type="submit" value="Update">
        </form>
        

        然后是服务器脚本:

        <?php
        
        if(isset($_POST["action"]) && $_POST["action"] == "Update"){
        
            foreach($_POST['m_ids'] as $mt_id => $mt_type)
                mysql_query(sprintf("UPDATE membership_type SET mt_type ='%s' WHERE mt_id = %s LIMIT 1", addslashes($mt_type), (int) $mt_id));
        
        } 
        

        您还可以在这里做其他事情,例如。准备好的语句,但这应该可以工作。

        【讨论】:

          猜你喜欢
          • 2013-07-13
          • 2010-11-17
          • 2018-07-17
          • 2010-10-08
          • 1970-01-01
          • 1970-01-01
          • 2021-04-07
          • 2015-06-02
          相关资源
          最近更新 更多