mysql查询执行成功但行没有变化

时间:2012-12-11 06:56:24

标签: php mysql phpmyadmin

我在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 上运行查询,但没有运气!有谁能告诉我哪里有虫子?谢谢!

5 个答案:

答案 0 :(得分: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";
}

答案 1 :(得分: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_ *函数总是更好 但目前上述解决方案可能有效。

答案 2 :(得分:0)

您需要提交查询或将autoCommit标志设置为true(如果您的上下文中存在此类内容)。

你的where-Clause是否符合任何记录? printf("Records updated: %d\n", mysql_affected_rows());是否会打印一些受影响的行?

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

答案 3 :(得分:0)

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

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

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

答案 4 :(得分:0)

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

但你确实有间距问题。

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

应该是

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