更新:我自己解决了这个问题,答案如下。继续...
我有一个使用 PHP 和 mySQL 更新您帐户的表格。提交时,它将所有 $_POST 变量分配给新的 user() 对象,然后对用户对象执行 update() 方法,该方法在 SQL 中运行 UPDATE 查询。
该表单显然默认为所有用户信息,除了密码,我没有预先填写密码。除非他们想更改密码,否则它是空白的。
如果我没有采取任何措施来解决此问题,则每次帐户更新都会将该人的密码重置为“”,因为提交时该字段为空。那会很糟糕。因此,为了解决这个问题,我添加了以下代码:
if(empty($_POST['password']) || is_null($_POST['password']) || !isset($_POST['password']) || $_POST['password'] == "") {
$user->hashed_password = $edituser->hashed_password;
} else {
$password = $database->escape_value($_POST['password']);
$user->hashed_password = md5($password);
}
基本上,如果 $_POST 密码值为空,请将密码设置为当前用户的密码($edituser 是预先创建的对象,用于在需要时保存当前用户的信息)。相信我,我首先尝试使用 if(empty()) 因为empty应该可以工作,但它没有,所以我添加了 null,isset,甚至 !== "" 只是为了安全起见。
无论我做什么,密码都会重置为空。为什么?
即使该字段为空,它仍然会出现在 $_POST 中。
$Password = trim(isset($_POST['Password']) ? $_POST['Password'] : '');
if($Password)
{
//validate password
//update password
}
您是否打开了警告?您可能需要先在 if 语句中使用 !isset($_POST['password'])
这对我调试这样的东西很有帮助:
error_reporting(E_ALL | E_STRICT);
ini_set('display_errors','On');
太好了,原来我只是个白痴!
我的 User 类有一个属性函数,要求数据库字段名称与对象属性名称相同才能工作。我的类属性是 $password,我的数据库字段名称是“hashed_password”——所以无论如何它都会更新为空白。
那是有趣的几个小时!
解决这个问题的简单方法试试:
$vEmployeeName = mysqli_real_escape_string($db->link,$_POST['vEmployeeName']);
$vPassword = mysqli_real_escape_string($db->link, $_POST['vPassword']);
if($vPassword=="")
{
$query = "update tblogin
set vEmployeeName='$vEmployeeName'
where iAutoId='$editid' ";
}
else
{
$query = "update tblogin
set vEmployeeName='$vEmployeeName',
vPassword=MD5('$vPassword')
where iAutoId='$editid' ";
}