更新SQL表中的数据

时间:2014-04-08 18:31:15

标签: php html mysql

我创建了一个让用户登录的网页,如果他们没有帐户,那么他们可以注册并为他们创建新用户。

这是数据库中的表用户 user_registration

    user_id    username   password    email                 wage
    1          johnsmith  jsmith99    jsmith@gmail.com      0
    2          davidscott dscott95    davidscott@gmail.com  0

当新用户注册时,工资的默认值为0.我希望他们能够通过使用表单来编辑它 - 这是表单的HTML代码: -

<form method="post" action="<?php $_PHP_SELF ?>">
  <input name="new-wage" type="text" id="new-wage" class="textbox" placeholder="New Wage">
  <input name="update" type="submit" id="update" value="Update" class="btn">
</form>

PHP代码:(注意 - php和html表单都在同一个文件中(index.php))

 <?php
 if(isset($_POST['update']))
 {
$dbhost = 'localhost';
$dbuser = 'root';
$dbpass = '';
$conn = mysql_connect($dbhost, $dbuser, $dbpass);
if(! $conn )
{
   die('Could not connect: ' . mysql_error());
}

$user_id = $_SESSION['MM_Username'];;
$wage = $_POST['new-wage'];

$query = "UPDATE users ".
       "SET wage = '$wage' ".
       "WHERE user_id = '$user_id'" ;

mysql_select_db('user_registration');
$retval = mysql_query( $query, $conn );
if(! $retval )
{
die('Could not update data: ' . mysql_error());
}
echo "Updated data successfully\n";
mysql_close($conn);
}
else
{
?>

当我填写此表单并点击更新按钮时,它会重新加载网页并显示成功更新数据,这正是应该发生的事情。但是 - 当我在PHP My Admin中刷新表时,它将工资保持为0,而不是我在表单中输入的内容。

有没有人知道我的代码可能有什么问题?

提前感谢您的任何答案。

PS .-我知道我使用的函数是 mysql _ * 而不是 mysqli _ ,因为我不知道如何转换它,你能帮我解决这个问题吗?

2 个答案:

答案 0 :(得分:2)

您很容易受到sql injection attacks的攻击。<​​/ p>

另外,您似乎没有致电session_start(),因此$_SESSION可能为空,导致$user_id为空,且您的查询不匹配任何内容。一个简单的var_dump($query)将向您展示实际发生的事情。

您还需要检查mysql_affected_rows(),看看是否有任何实际更新。

答案 1 :(得分:1)

根据您在评论中所说的内容:

此:

$user_id = $_SESSION['MM_Username'];
$wage = $_POST['new-wage'];

$query = "UPDATE users ".
       "SET wage = '$wage' ".
       "WHERE user_id = '$user_id'" ;

应该是这样的:

$user = $_SESSION['MM_Username'];
$wage = $_POST['new-wage'];

$query = "UPDATE users ".
       "SET wage = '$wage' ".
       "WHERE username = '$user'";

由于您希望根据用户ID 更新记录,但您已将用户名作为参数传递!

但是,我假设您希望通过user_id进行更新,因为这对每个用户都是唯一的,因此设计更加强大。

为此,您必须在登录时添加另一个存储用户ID $_SESSION变量。将其称为$_SESSION['MM_Id']或其他。这个名字是任意的。

您的代码末尾还有一个未公开的else语句:

else
{
?>

关闭它或将其移除。

正如Mark所说,您的代码容易受到SQL注入攻击,这是一个经常被滥用的错误。我建议您查看PDO(我个人最喜欢的)。如果您是面向对象编程的新手,可能会很困难,但它提供了更强大的功能,灵活性和安全性。另外,面向对象编程是一个重要的概念无论如何

要保护您当前的代码不被注入,请使用mysql_real_escape_string() ...

$user = mysql_real_escape_string($_SESSION['MM_Username']);
$wage = mysql_real_escape_string($_POST['new-wage']);

$query = "UPDATE users ".
       "SET wage = '$wage' ".
       "WHERE username = '$user'";

这可以防止人们使用特殊字符(例如引号)来攻击您的查询。我得跑,但如果你读了SQL注入,你就会理解!