我创建了一个让用户登录的网页,如果他们没有帐户,那么他们可以注册并为他们创建新用户。
这是数据库中的表用户( 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 _ ,因为我不知道如何转换它,你能帮我解决这个问题吗?
答案 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注入,你就会理解!