简单的PHP SQLlogin故障排除
我试图通过从数据库中检索一个已注册的用户名/密码来创build一个非常基本的PHPlogin。 这是不是一直活着,我知道有零inputvalidation。 我想要做的就是在login中从数据库中select数据。
以下是index.html上的login表单:
<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> </td> <td> </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任何帮助将不胜感激。
首先,在开发过程中处理错误非常重要,所以我们检查我们的post是否存在,我们检查是否连接到数据库,检查我们的查询是否通过,是否可以运行,我们检查参数给我们查询并最终执行查询。
之后,您可以使用bind_result
命名variables来接收查询中的字段,就像我所做的一样。
注意我的查询如何使用? 这是我们使用bind_param
定义的一个准备好的语句,这是为了避免SQL注入,在您当前的代码中,SQL注入仍然是可能的,因为您没有清理variables。
我相信你所做的另一个错误是将密码存储为非常非常错误的纯文本,你应该总是encryption密码来保护你的用户和你自己。 这就是为什么我不在MySQL查询中包含密码的原因,我首先只使用用户,如果find用户,我使用他发布的密码来匹配从数据库中检索的密码,在这种情况下,我正在使用bcrypt
这是一个非常安全的encryption库的任务。
看这里如何使用bcrypt
。
只有当我看到密码是有效的,然后将数据放入会话并redirect用户。
除了我在答案底部指出的所有错误外,下面是我将如何编写代码。
<?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'; }
注意:上面的代码仅仅是一个例子,没有经过testing,如果你发现任何错误,让我知道。
我已经注意到您发布的代码中的一些错误:
你错过了closures;
在这里:
$sql = "SELECT * FROM $Members WHERE Username = '$Username' and Password = '$Password'"
同样在你的查询中,你有$Members
但是你没有在你的代码中定义的$Members
variables,你可能是想说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))