<?php
//Start session
session_start();
//Include database connection details
require_once('connection.php');
$email = $_POST["email"];
$pass = $_POST["password"];
// Select the database to use
$query = "SELECT * FROM users WHERE email=$email and password=$password";
$result = mysqli_query($connection, $query);
$row = mysqli_fetch_array($result);
if($row["email"]==$email && $row["password"]==$pass)
echo"You are successful login.";
else
echo"Sorry, your email or password is not valid, Please try again.";
?>
我尝试在$ result之后编写错误返回行,但登录后显示相同的错误。请帮忙!!!
此错误显示
警告:mysqli_fetch_array()期望参数1为mysqli_result, 第18行的D:\ XAMPP \ htdocs \ codeinventor \ login.php中给出的布尔值
抱歉,您的电子邮件或密码无效,请重试。
答案 0 :(得分:2)
mysqli_query
返回false,因为您的查询出现问题。您可以使用mysqli_error($connection)
从MySQL服务器检索错误消息以进行调试。
最有可能的问题是,$email
和$password
是字符串,但您在查询中既未引用也未对其进行转义。此外,您在查询中使用了变量$password
,但实际上将其命名为$pass
。
您构建查询的方式特别危险,因为它容易SQL injection。更好的方法是:
$query = "SELECT * FROM users WHERE email='" . mysqli_real_escape_string($connection, $email) . "' and password='" . mysqli_real_escape_string($connection, $pass) . "'";
此外,由于SQL注入的危险,我不建议检查登录行是否存在。从数据库中获取用户的密码并将其与PHP代码中的给定密码进行比较可能更安全。例如,通过您的未转义(但正确引用)查询,攻击者可以指定"' OR TRUE"
或类似密码的内容,以便查询无法实际检查密码是否正确。
修改:正如Jordy在评论中所说,prepared statements不仅安全,而且比手动转出参数更优雅:
$stmt = mysqli_prepare($connection, 'SELECT `password` FROM `users` WHERE `email` = ?');
mysqli_stmt_bind_param($stmt, 's', $email);
mysqli_stmt_execute($stmt);
mysqli_stmt_bind_result($stmt, $real_pass);
if (mysqli_stmt_fetch($stmt) && $real_pass == $pass)
echo "Login successful";
else
echo "Sorry, your email or password is not valid, Please try again.";
mysqli_stmt_close($stmt);
答案 1 :(得分:0)
而不是获取行,为什么不计算行数。它会更好,所以代码将是。
$row_cnt = mysqli_num_rows($result);
if($row_cnt > 0)
echo"You are successful login.";
else
echo"Sorry, your email or password is not valid, Please try again.";
答案 2 :(得分:0)
您的查询失败并返回错误值。
将这个放在你的mysqli_query()之后,看看是怎么回事。
if (!$check1_res) {
printf("Error: %s\n", mysqli_error($con));
exit();
}
这有助于您找到错误