【发布时间】:2019-01-08 20:23:26
【问题描述】:
我正在制作一个 php 注册脚本,注册工作正常,一切都成功输入数据库,激活电子邮件工作正常,但每当我使用 mysqli 查询来选择或更新信息时,它都不起作用。
例如,当我使用我知道在数据库中的帐户登录时,它告诉我用户名不存在,当单击电子邮件中的激活链接时,查询无法更新数据库方式。
我确信这是我在新手中忽略的一个超级简单的错误,但经过几个小时的查找后我找不到合适的答案。我不确定是什么问题。
激活.php
require "/functions.php";
if (isset($_GET['user'])) {
$user = $_GET['user'];
}
if (isset($_GET['key']) && (strlen($_GET['key']) == 32)){
$key = $_GET['key'];
}
if (isset($user) && isset($key)) {
$sql = <<<SQL
UPDATE users
SET validation = NULL
WHERE username='$user'
AND validation='$key',
user_group = 'member'
SQL;
$count = $db->affected_rows;
if ($count == 1)
{
echo '<div>Your account is now active. You may now <a href="login.php">Log in</a></div>';
} else {
echo '<div>Oops! Your account could not be activated. Please recheck the link or contact the system administrator.</div>';
}
ob_end_flush();
} else {
echo '<div>Error Occured .</div>';
}
?>
登录.php
// Globals & error variable
require "/functions.php";
session_start();
$error = "";
if (isset( $_POST['Submit'])) {
if (empty($_POST['username']) || empty($_POST['password'])) {
$error = "Please fill in all fields!";
}
else {
$username=$_POST['username'];
$password=$_POST['password'];
// Injection-protection!
$username = stripslashes($username);
$password = stripslashes($password);
$username = mysqli_real_escape_string($db, $username);
$password = mysqli_real_escape_string($db, $password);
$sql = <<<SQL
SELECT *
FROM `users`
WHERE `username`='$username'
SQL;
$result = $db->query($sql);
$count->num_rows;
if($count==1){
while ($row = mysqli_fetch_array($result)) {
$hash = $row['password'];
$ug = $row['user_group'];
}
salt();
$options=['salt'=>$bcrypt_salt, 'cost'=>12];
$password=$argv[1];
if (crypt($password,$hash) == $hash) {
$_SESSION['login_user']= $username;
$_SESSION['user_group']= $ug;
header("location:index.php");
}
else {
$error = "Username or password is invalid!";
}
}
else {
$error = "That username doesn't exist!";
}
ob_end_flush();
}
}
functions.php
// db connect
$db = new mysqli('HOST', 'USER', 'PASS', 'DB');
if($db->connect_errno > 0){
die('Unable to connect to database [' . $db->connect_error . ']');
}
在旁注中,请随时提出你们看到的任何明显的不良做法。我是新人,但我不想养成坏习惯!
【问题讨论】:
-
$count->num_rows;??试试$count = $result->num_rows; -
在
Activate.php中创建$sql,但从不执行它,只是在执行$count = $db->affected_rows;。你需要一个$db->query($sql);。请注意,在您的$sql中,您直接使用$user和$key而无需先对其进行消毒。不是一个好主意。 -
在 WHERE 子句中使用可能错误的逗号
,检查 UPDATE 查询 -
缺少 AND ---
AND validation='$key' AND user_group = 'member'- 检查错误将表明语法错误 php.net/manual/en/mysqli.error.php -
有趣,从来不知道。让我想起了树枝