我正在尝试通过从数据库检索注册的用户名/密码来创建一个非常基本的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> </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时出现错误,将不胜感激。
首先,在开发过程中处理错误非常重要,因此我们检查是否存在帖子,检查是否已连接到数据库,检查查询是否通过并且可以运行,检查为数据库提供的参数查询,我们最终执行查询。
之后,可以bind_result像我一样使用命名变量来接收查询中的字段。
bind_result
请注意我在查询中使用的方式如何?那是我们使用bind_paramthis 定义的准备好的语句,以避免SQL注入,在您当前的代码中,由于您没有清理变量,SQL注入仍然是可能的。
bind_param
我相信您正在做的另一个错误是,将密码存储为非常错误的纯文本格式,您应该始终对密码进行加密,以保护用户和您自己。这就是为什么我不包括在我的MySQL查询密码,我第一次只使用用户,如果用户被发现,然后我用他张贴了从数据库匹配检索到的密码口令,在这种情况下,我用bcrypt做任务,这是一个非常安全的加密库。
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,例如:
$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
mysqli_query
if (!mysqli_query($sql_connection))