我正在尝试通过从数据库检索注册的用户名/密码来创建一个非常基本的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_param
this
定义的准备好的语句,以避免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))
初始设置 在创建并启动新的 Serene 应用程序之后,不能显示登录页,而当你打开浏览器控制台,却得到一条错误消息:找不到 Template.LoginPanel: 你可能使用了无效的解决方案名称,如 MyProject.Something (包含点’.’)。 当项目以这种方式命名时,模板系统将不能定位模板。 请不要在解决方案名称中使用点符号(’.’),如果必须使用点符号,可在创建解决方案之后再重
当使用 Gradle 时, 你肯定会碰到许多问题. 解决遇到的问题 如果你碰到了问题, 首先要确定你使用的是最新版本的 Gradle. 我们会经常发布新版本, 解决一些 bug 并加入新的功能. 所以你遇到的问题可能就在新版本里解决了. 如果你正在使用 Gradle Daemon, 先暂时关闭 daemon (你可以使用 switch —no-daemon 命令). 在第19章我们可以了解到更多关
在Debian和Ubuntu上,当您安装标准的FreeRADIUS软件包时,FreeRADIUS服务器二进制文件称为freeradius而不是radiusd。 您可以创建将使用较慢服务器的ldap模块的命名实例。 然后,您可以使用冗余部分替换authorize部分中的ldap条目,该冗余部分首先使用快速LDAP服务器列出模块,然后使用较慢的部分使用ldap模块实例。 #ldap redundant
Mount 5 Error mount 5 错误通常是 MDS 服务器滞后或崩溃导致的。要确保至少有一个 MDS 是启动且运行的,集群也要处于 active+healthy 状态。 Mount 12 Error mount 12 错误显示 cannot allocate memory ,常见于 Ceph 客户端和 Ceph 存储集群版本不匹配。用以下命令检查版本: ceph -v 如果 Ceph
从 Vert.x 3.4.0 开始,Vert.x 已经弃用 JGoups 实现,已经由 [infinispan]|(/clustering/Infinispan.md) 。不建议在生产或测试环境中使用 JGroups Cluster Manager 在构建工具中添加依赖即可: Maven(pom.xml) <dependency> <groupId>io.vertx</groupId> <
如果 Flarum 没有按照预期那样安装或工作,您 首先应该检查 服务器环境是否符合 系统要求。如果您缺少一些 Flarum 运行所需的东西,请先补全内容。 然后,请花几分钟时间搜索 支持论坛和 问题跟踪器,有可能该问题已被报告,并且有了解决办法。如果您彻底搜索后,仍然没有找到任何有用的信息,那么就可以开始排查故障了。 在继续前,您应当启用 Flarum 的调试模式。用文本编辑器打开 config