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