【问题标题】:MySQL UPDATE query problemsMySQL UPDATE 查询问题
【发布时间】:2014-03-18 20:50:47
【问题描述】:

我有一个超级简单的问题。我有一个表单,它回显了用户可以更新的 mySQL 记录。我进行了更改,它告诉我更新成功,但是当我查看表格时,更改没有通过。这里有什么问题?

这是第一个脚本。

<?php
require_once("models/config.php");
?>

<table border=1>
 <tr>
<td align=center>Edit Form</td>
  </tr>
  <tr>
   <td>
  <table>
  <?
  $personid=$_SERVER['QUERY_STRING'];

  $order = "SELECT * FROM persons where personid='$personid'";

  $result = mysqli_query($mysqli,$order);
  $row = mysqli_fetch_array($result);
  ?>
  <form method="post" action="edit_data.php">
  <input type="hidden" name="id" value="<? echo "$row[personid]"?>"> 
  <tr>Person ID:<? echo "$row[personid]"?></tr>
    <tr>        
      <td>First Name</td>
      <td>
        <input type="text" name="firstname" 
    size="20" value="<? echo "$row[firstname]"?>">
      </td>
    </tr>
    <tr>
      <td>Surname</td>
      <td>
        <input type="text" name="surname" size="40" 
      value="<? echo "$row[surname]"?>">
      </td>
    </tr>
    <tr>
      <td align="right">
        <input type="submit" 
      name="submit value" value="Edit">
      </td>
    </tr>
     </form>
    </table>
    </td>
 </tr>
  </table>
  </body>
  </html>

接下来就是这样:

<?
require_once("models/config.php");

 $personid = $_POST['personid'];
 $firstname = mysqli_real_escape_string($mysqli, htmlspecialchars($_POST['firstname']));
 $surname = mysqli_real_escape_string($mysqli, htmlspecialchars($_POST['surname']));

 $order = "UPDATE persons SET firstname='$firstname', surname='$surname' WHERE   personid='$personid'";
$result = mysqli_query($mysqli,$order);
 if (!$result) {
echo "Error entering data! <BR>";
echo mysql_error();
} else {
echo "User updated to $firstname $surname <BR>";
}
?>

这里有什么我遗漏的吗?

提前致谢。

【问题讨论】:

  • 你试过查看mysqli_error()的输出吗?
  • 您容易受到SQL injection attacks 的攻击。并使用mysql_error()(没有i的那个),而不是mysqli_error()WITH一个i)。
  • 您的 HTML 输入名为 name="id",但您的 PHP 引用了 $_POST['personid']
  • mysqli_*mysql_* 功能的混合用于一件事 echo mysql_error(); 这样对您没有帮助。将其更改为echo mysqli_error($mysqli);,它会告诉您“不”发生了什么。
  • 我没有得到 'mysqli_error()' 的任何输出。我收到一条成功消息。

标签: php mysql


【解决方案1】:

您正在发送一个名为 id 的隐藏输入并尝试使用 $_POST['personid'] 改正

你也可以关注你拥有的 cmets(至少是 SQL 注入的一个)

【讨论】:

  • 嗨,是的 - 这正是问题所在!正如我在上面的 cmets 中所说,我认为 htmlspecialchars 命令和 escape_string 就足够了。我会试一试,希望能得到一些功能代码。
  • 嗨,@Olvatha 我已经修改了脚本以包含准备好的语句并将其粘贴为我自己问题的答案。你介意看看吗?
【解决方案2】:

您的表单在字段id 中发送ID,而您将其称为personid

这似乎有效的原因是更新本身是正确的。 $personid 被视为空字符串,因此更新正确地更新了所有具有空 personid 的记录,这根本不是记录。

【讨论】:

    【解决方案3】:

    好的,这是一个带有准备好的语句的修改后的脚本。该脚本在对记录进行更新的意义上起作用。两个问题: 1) 这对 MySQL 注入安全吗? 2) 这样更新记录成功了,现在却回显“输入数据错误!”,怎么回事?

    <?
    require_once("models/config.php");
    
    $personid = $_POST['personid'];
    $firstname = mysqli_real_escape_string($mysqli, htmlspecialchars($_POST['firstname']));
    $surname = mysqli_real_escape_string($mysqli, htmlspecialchars($_POST['surname']));
    
    $order = "UPDATE persons SET firstname=?, surname=? WHERE personid=?";
    $stmt = mysqli_prepare($mysqli, $order);
    mysqli_stmt_bind_param($stmt, "ssi", $_POST['firstname'], $_POST['surname'],   $_POST['personid']);
    mysqli_stmt_execute($stmt); 
    
    
    $result = mysqli_query($mysqli,$stmt);
    if (!$result) {
    echo "Error entering data! <BR>";
    echo mysqli_error($mysqli);
    } else {
    echo "User updated to $firstname $surname <BR>";
    }
    ?>
    

    我确定第二个问题是一个相当愚蠢的问题 - 我是否只是颠倒条件?

    【讨论】:

    • 失败时,mysqli_query 返回FALSE(所以$result === false)。成功时,它返回更新的行数。您正在做的事情以相同的方式对待 0 和 FALSE。如果您以不同的方式对待它们,它将帮助您调试。我建议您还打印脚本输出中的参数值,以帮助您确保您确实向数据库发送了您认为您正在发送的值。
    • 输入 '$result === false' 有效。脚本在 SQL 注入漏洞方面可以吗?
    • 首先要说的是 mysqli_stmt_execute() 执行查询,你不需要mysql_query($mysqli,$stmt); 行,你只需更新这行两次关于SQL 注入你可以在这里阅读stackoverflow.com/questions/14199690/… 那准备好的语句对 SQL 注入有很强的抵抗力 如果您想知道是否有任何行受到影响,也许您还会发现有用的检查 mysqli_stmt_affected_rows($stmt)
    猜你喜欢
    • 1970-01-01
    • 2013-02-06
    • 2016-11-23
    • 1970-01-01
    • 1970-01-01
    • 2011-11-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多