1

我在 mysql db 中创建了一个用于更新信息的 php 文件。它将从 html 表单获取输入,然后通过匹配 ID 更新数据。就这个:

<?
$con = mysql_connect("localhost","root","");
mysql_select_db("workshop", $con);
$sql = "UPDATE apply 
          SET staffname=' ".$_POST['name']." ', 
              staffno=' ".$_POST['contact']." ',
              staffemail=' ".$_POST['mail']." ',
              staffaddress=' ".$_POST['address']." ',
              paytype=' ".$_POST['paytype']."'
        WHERE 
            staffid=' ".$_POST['ic']." '";
$result = mysql_query($sql);
printf("Records updated: %d\n", mysql_affected_rows());
    if($result){
        echo "Successful";
}
    else {
        echo "ERROR";
}

mysql_close($con);
?>

它执行得很好,但问题是对表行没有影响。即使我在phpmyadmin上运行查询,但没有运气!谁能告诉我错误在哪里?谢谢你!

4

5 回答 5

2

你的代码中有很多东西要说:

首先你使用 mysql_ API 虽然它已被弃用,你应该使用 PDO 或 mysqli。

然后,您每次都添加空格,这不利于匹配 id。

而且,您很容易受到 sql 注入的影响。

我会给你带有 mysqli api 的代码,因为你只需要去掉“i”就可以得到一个带有 mysql_api 的代码

$sql = "UPDATE apply 
      SET staffname='".mysqli_real_escape_string($con,$_POST['name'])."', 
          staffno='".mysqli_real_escape_string($con,$_POST['contact'])."',
          staffemail='".mysqli_real_escape_string($con,$_POST['mail'])."',
          staffaddress='".mysqli_real_escape_string($con,$_POST['address'])."',
          paytype='".mysqli_real_escape_string($con,$_POST['paytype'])."'
    WHERE 
        staffid='".mysqli_real_escape_string($con,$_POST['ic'])."'";
  $result = mysqli_query($con,$sql);
printf("Records updated: %d\n", mysql_affected_rows());
if($result){
    echo "Successful";
}
else {
    echo "ERROR";
}
于 2012-12-11T07:04:57.627 回答
2

使用以下查询:

$sql = "UPDATE `apply`
        SET `staffname` = '" . mysql_escape_string($_POST['name']) . "',
            `staffno` = '" . mysql_escape_string($_POST['contact']) . "',
            `staffemail` = '" . mysql_escape_string($_POST['mail']) . "',
            `staffaddress` = '" . mysql_escape_string($_POST['address']) . "',
            `paytype` = '" . mysql_escape_string($_POST['paytype']) . "'
        WHERE `staffid` = '" . mysql_escape_string($_POST['ic']) . "'";

编辑

使用 PDO 或 mysqli 而不是 mysql_* 函数总是更好, 但目前上述解决方案可能有效。

于 2012-12-11T07:11:57.203 回答
0

代码以非常糟糕的方式打开用于 SQL 注入。请不要在您的网站上使用它。使用 PDO 或 MySQLi 函数。

但是你确实有间距问题。

staffid=' ".$_POST['ic']." '";

应该

staffid='".$_POST['ic']."'";
于 2012-12-11T07:07:12.733 回答
0

我会小心在生产中使用此代码,因为它看起来容易受到 SQL 注入的影响。我会检查 PDO 以进行安全的 mysql 数据库通信。

http://www.thegeekstuff.com/2012/02/sql-injection-attacks/

如果您还没有这样做,请务必记录或回显 $_POST['ic'] 变量,以确保将其设置为您认为的值。

于 2012-12-11T07:03:38.127 回答
0

您需要提交您的查询或将 autoCommit 标志设置为 true(如果您的上下文中存在这样的事情)。

您的 where 子句是否匹配任何记录?是否printf("Records updated: %d\n", mysql_affected_rows());打印一些受影响的行?

正如 artragis 所提到的,由于封闭空间,可能staffid=' ".$_POST['ic']." '"与任何记录都不匹配。

于 2012-12-11T06:59:11.727 回答