PHP mysqli_query错误

时间:2016-03-14 12:02:47

标签: javascript php

<?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中给出的布尔值

     

抱歉,您的电子邮件或密码无效,请重试。

3 个答案:

答案 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();
}

这有助于您找到错误