登录脚本连续查询失败


Continuous query fail in login script

我正在制作一个登录脚本,但它一直失败并打印出"连接失败"。为什么查询失败,我如何使它更好?

session_start();
if(isset($_POST['submit'])){
$email = $_POST['email'];
$pass = $_POST['pass'];
$connection=mysqli_connect("localhost","root","","dbname") or die('Connection failed.');
mysqli_select_db($connection, 'dbname') or die ("Connection failed.");
$query = mysqli_query($connection, "SELECT * FROM users WHERE user_email=`$email` AND user_pass=`$pass`") or die ('Connection failed.');
$check_user = mysqli_num_rows($query);
if($check_user == 1){
$row = mysqli_fetch_row($check_user);
$_SESSION[‘user_email’]=$email;
header('Location: yay.php');
}else{
echo"<script>alert('Email or password is incorrect.')</script>";
}
}

失败的行:

$query = mysqli_query($connection, "SELECT * FROM users WHERE user_email=`$email` AND user_pass=`$pass`") or die ('Connection failed.');

首先,您的查询失败。

为什么?因为,你对变量使用了错误类型的引号,即引号。

$sel_user = "select * from users where user_email = `$email` AND user_pass=`$pass`";

应该是单引号。

$sel_user = "select * from users where user_email = '$email' AND user_pass='$pass'";

使用http://php.net/manual/en/mysqli.error.php检查错误会告诉您语法错误。

This doesn't help you:

$query = mysqli_query($connection, "SELECT * FROM users 
                                    WHERE user_email=`$email` 
                                    AND user_pass=`$pass`") 
                                    or die ('Connection failed.');
                                            ^^^^^^^^^^^^^^^^^^^^

这样做:

$query = mysqli_query($connection, "SELECT * FROM users 
                                    WHERE user_email=`$email` 
                                    AND user_pass=`$pass`")
                                    or die(mysqli_error($connection));

另外,您对[‘user_email’]使用了花引号,这也会导致您的代码在更改引号后失败。(请参阅我关于错误报告的脚注)。

$_SESSION['user_email']=$email;

并在标头后添加exit;。你的代码可能想要继续执行。

密码存储,使用CRYPT_BLOWFISH或PHP 5.5的password_hash()函数。PHP <5.5使用password_hash() compatibility pack .

你现在的代码是开放的SQL注入。使用预处理语句,或者使用PDO与预处理语句它们更安全


关于你的另一个问题,现在删除:

  • https://stackoverflow.com/q/30695536/(可由OP和10K+成员查看)
你:

$connection=mysqli_connect("localhost","root","","db-name");
if (mysqli_connect_error()){
echo"Connection failed.";
}

那你现在为什么要用这个?

$connection=mysqli_connect("localhost","root","","dbname") or die('Connection failed.');
mysqli_select_db($connection, 'dbname') or die ("Connection failed.");
  • mysqli_select_db($connection, 'dbname')您已经选择了数据库

你所陈述的错误是(在你的另一个问题中):

但是我在标题中得到上面的错误(mysqli_num_rows()期望参数1是mysqli_result,布尔给定)。

加上这一行:

$row = mysqli_fetch_row($check_user);

你用错了$check_user的变量,应该是$query

  • 阅读手册http://php.net/manual/en/mysqli-result.fetch-row.php

作为手册中的一个例子:

$query = "SELECT Name, CountryCode FROM City ORDER by ID DESC LIMIT 50,5";
    if ($result = mysqli_query($link, $query)) {
        /* fetch associative array */
        while ($row = mysqli_fetch_row($result)) {
            printf ("%s (%s)'n", $row[0], $row[1]);
        }

脚注:

错误报告添加到文件的顶部,这将有助于查找错误。

<?php 
error_reporting(E_ALL);
ini_set('display_errors', 1);
// rest of your code

旁注:错误报告应该只在登台阶段进行,而不应该在生产阶段进行。