小编典典

简单的PHP SQL登录故障排除

mysql

我正在尝试通过从数据库检索注册的用户名/密码来创建一个非常基本的PHP登录名。这从未实现过,我知道输入验证为零。我要做的就是从登录名中的数据库中选择数据。

这是index.html上的登录表单:

    <table width="250" border="0" align="center" cellpadding="0" cellspacing="1"    bgcolor="#CCCCCC">
    <tr>
    <form name="form1" method="post" action="checklogin.php">
    <td>
    <table width="100%" border="0" cellpadding="3" cellspacing="1" bgcolor="#FFFFFF">
    <tr>
    <td colspan="3"><strong>Member Login </strong></td>
    </tr>
    <tr>
    <td width="78">Username</td>
    <td width="6">:</td>
    <td width="294"><input name="Username" type="text" id="Username"></td>
    </tr>
    <tr>
    <td>Password</td>
    <td>:</td>
    <td><input name="Password" type="text" id="Password"></td>
    </tr>
    <tr>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
    <td><input type="submit" name="Submit" value="Login"></td>
    </tr>
    </table>
    </td>
    </form>
    </tr>
    </table>

这是PHP checklogin.php:

   <?php

    $sql_connection = mysqli_connect ("localhost:8889","root","root","derek_website_tmp");

    if (mysqli_connect_errno())
{
 echo "failed to connect" . mysqli_connect_error();
}

    $Username=$_POST['Username'];
    $Password=$_POST['Password'];

    $sql = "SELECT * FROM $Members WHERE Username = '$Username' and Password = '$Password'"
    $result=mysqli_query($sql);

    $count = mysql_num_rows($result);

    if ($count==1) {
    $_SESSION['Username'] = $Username;
    $_SESSION['Password'] = $Password;
    header('location:login_success.php');
    }

    else {
    echo 'Wrong Username or Password';
    }

    if (!mysqli_query($sql_connection))
{
die('Error : ' . mysqli_error($sql_connection));
}

    mysqli_close ($sql_connection);

    ?>

当我尝试此操作时,检索checklogin.php时出现错误,将不胜感激。


阅读 209

收藏
2020-05-17

共1个答案

小编典典

首先,在开发过程中处理错误非常重要,因此我们检查是否存在帖子,检查是否已连接到数据库,检查查询是否通过并且可以运行,检查为数据库提供的参数查询,我们最终执行查询。

之后,可以bind_result像我一样使用命名变量来接收查询中的字段。

请注意我在查询中使用的方式如何?那是我们使用bind_paramthis
定义的准备好的语句,以避免SQL注入,在您当前的代码中,由于您没有清理变量,SQL注入仍然是可能的。

我相信您正在做的另一个错误是,将密码存储为非常错误的纯文本格式,您应该始终对密码进行加密,以保护用户和您自己。这就是为什么我不包括在我的MySQL查询密码,我第一次只使用用户,如果用户被发现,然后我用他张贴了从数据库匹配检索到的密码口令,在这种情况下,我用bcrypt做任务,这是一个非常安全的加密库。

看到这里如何使用bcrypt

只有在看到密码有效后,我才将数据放入会话中并重定向用户。

除了我在答案底部指出的所有错误之外,这是我如何编写您的代码。

<?php
session_start();
include_once('bcrypt.php');
// Your database info
$db_host = '';
$db_user = '';
$db_pass = '';
$db_name = '';

if (!isset($_POST['Username']))
{
    echo 'Fill in the username...';
    exit;
}

if (!isset($_POST['Password']))
{
    echo 'Fill in your password...';
    exit;
}

$con = new mysqli($db_host, $db_user, $db_pass, $db_name);
if ($con->connect_error)
{
    die('Connect Error (' . $con->connect_errno . ') ' . $con->connect_error);
}

$sql = "SELECT Username, Password FROM `Members` WHERE Username = ?";
if (!$result = $con->prepare($sql))
{
    die('Query failed: (' . $con->errno . ') ' . $con->error);
}

if (!$result->bind_param('s', $_POST['Username']))
{
    die('Binding parameters failed: (' . $result->errno . ') ' . $result->error);
}

if (!$result->execute())
{
    die('Execute failed: (' . $result->errno . ') ' . $result->error);
}

$result->store_result();
if ($result->num_rows == 0)
{
    die('No username found...');
}

$result->bind_result($db_username, $db_password);
$result->fetch();
$result->close();
$con->close();

$bcrypt = new Bcrypt(15);
if ($bcrypt->verify($password, $db_password))
{
    $_SESSION['Username'] = $db_username;
    header('location:login_success.php');
    exit;
}
else
{
    echo 'Wrong Username or Password';
}

注意:上面的代码仅是示例,未经测试,如果您发现任何错误,请通知我。

我在您发布的代码中注意到的一些错误:

您错过;了这里的结尾:

$sql = "SELECT * FROM $Members WHERE Username = '$Username' and Password = '$Password'"

同样在查询中,您有$Members但没有$Members在代码的任何地方定义变量,您可能想说的是Members,例如:

$sql = "SELECT * FROM `Members` WHERE Username = '$Username' and Password = '$Password'";

这不应该吗

$count = mysql_num_rows($result);

$count = mysqli_num_rows($result);‌

$result=mysqli_query($sql);

$result=mysqli_query($sql_connection, $sql);

您对以下部分没有查询 mysqli_query

if (!mysqli_query($sql_connection))
2020-05-17