简单的PHP SQL登录故障排除

时间:2013-09-24 01:30:23

标签: php mysql sql

我试图通过从数据库中检索注册的用户名/密码来创建一个非常基本的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 任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:2)

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

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

请注意我的查询是如何使用的?这是我们使用bind_param定义的预准备语句,这是为了避免SQL注入,在您当前的代码中,SQL注入仍然可能,因为您没有清理变量。

我认为你正在做的另一个错误是将密码存储为非常错误的纯文本,你应该始终加密密码以保护你的用户和你自己。这就是为什么我没有在我的MySQL查询中包含密码,我首先只使用用户,如果找到用户我然后使用他发布的密码来匹配从数据库中检索到的密码,在这种情况下我使用{{1做一个非常安全的加密库的任务。

See here how to use 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