- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我必须使用 PHP 和 MYSQL 创建一个登录系统。如果数据库中存在用户名和密码,则必须授予用户访问权限。我有以下代码,但在我输入字段后,它返回到同一页面。我是 php 和 stackoverflow 编程的新手。请帮忙。
<?php
ini_set('display_errors',1);
error_reporting(E_ALL);
//Start session
session_start();
//Include database connection details
require_once('config.php');
//Array to store validation errors
$errmsg_arr = array();
//Validation error flag
$errflag = false;
//Connect to mysql server
$link = new mysqli(DB_HOST, DB_USER, DB_PASSWORD, DB_DATABASE);
if(!$link) {
die('Failed to connect to server: ' . mysql_error());
}
//Select database
$db = mysqli_select_db($link, DB_DATABASE);
if(!$db) {
die("Unable to select database");
}
//Function to sanitize values received from the form. Prevents SQL injection
function clean($str) {
$str = @trim($str);
if(get_magic_quotes_gpc()) {
$str = stripslashes($str);
}
return mysqli_real_escape_string($str);
}
//Sanitize the POST values
$login = clean($_POST['login']);
$password = clean($_POST['password']);
//Input Validations
if($login == '') {
$errmsg_arr[] = 'Login ID missing';
$errflag = true;
}
if($password == '') {
$errmsg_arr[] = 'Password missing';
$errflag = true;
}
//If there are input validations, redirect back to the login form
if($errflag) {
$_SESSION['ERRMSG_ARR'] = $errmsg_arr;
session_write_close();
header("location: index.php");
exit();
}
//Create query
$result=mysqli_query("SELECT * FROM login-teachers WHERE login=$login AND password=".md5($_POST['password'])."");
//Check whether the query was successful or not
if($result) {
if(mysqli_num_rows($result) == 1) {
//Login Successful
session_regenerate_id();
$member = mysqli_fetch_assoc($result);
$_SESSION['SESS_USERNAME'] = $member['member_id'];
$_SESSION['SESS_FIRST_NAME'] = $member['firstname'];
$_SESSION['SESS_LAST_NAME'] = $member['lastname'];
session_write_close();
header("location: member-index.php");
exit();
}else {
//Login failed
header("location: login-failed.php");
exit();
}
}else {
die("Query failed");
}
?>
最佳答案
正如我在评论中所说:
mysql_error()
不与 mysqli_
API 混合。使用 mysqli_error($link)
mysqli_real_escape_string()
需要将数据库连接作为第一个参数传递。
你也没有在这里连接 $result=mysqli_query("SELECT...
然后我们有这个 SELECT * FROM login-teachers
你正在使用连字符。 必须打勾
SELECT * FROM `login-teachers`
检查错误后,仅此一项就会引发语法错误。
旁注:为避免打勾,请使用下划线作为分隔符重命名您的表格,选择权在您login_teachers
。
这个AND password=".md5($_POST['password'])."
就是一个字符串。
它需要读作 AND password='".md5($_POST['password'])."'
旁注:如果 $login
是一个字符串,那么它也需要被引用。
然而,我会完全摆脱用于密码散列的 MD5。
您使用的 MD5 被认为不能安全地用作密码哈希函数。如果它是供您个人使用或教育目的,并且不会在 Web 上出现,那很好。
使用以下之一:
crypt()
bcrypt()
scrypt()
password_hash()
功能。其他链接:
另请查看 ircmaxell 的答案之一 https://stackoverflow.com/a/29778421/1415724 - 它使用带有 password_hash()
和/或 password-compat(兼容包)的准备好的语句。
另外,不确定您是否首先保存了该散列,以及该列的类型是否正确以及它的长度是否足以容纳散列。
也不确定您的 POST 数组是否包含值以及您的表单是否具有 POST 方法。对这些使用条件 !empty()
。
检查错误。
添加error reporting到您的文件的顶部,这将有助于查找错误。
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
// rest of your code
旁注:显示错误只应在试运行中进行,绝不能在生产中进行。
同时将 or die(mysqli_error($link))
添加到 mysqli_query()
。
然后这个 die("Unable to select database");
得到真正的错误 mysqli_error($link)
如果有的话。
mysqli_*
with prepared statements ,他们好多了。添加注释:
我不知道你在下面使用它,你已经在它上面声明了所有 4 个参数并且可以安全地删除它:
$db = mysqli_select_db($link, DB_DATABASE);
if(!$db) {
die("Unable to select database");
}
并确保正确定义了这些常量。
关于PHP MySQL 登录失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33883687/
我在使用以下代码时遇到问题: function http_file_exists($url){ $f=fopen($url,"r"); if($f){ fclose($f); retu
我已经通过 Git 部署到 Azure 几个月了,没有出现重大问题,但现在我似乎遇到了一个无法克服的错误。 我创建了一个新的 Azure 网站,为正在开发的项目创建单独的预览链接。我在新站点上设置了
我已经通过flutter创建了一个App并完成了它,我想在flutter文档中阅读时进行部署。 我收到此错误: FAILURE: Build failed with an exception. * W
我在Windows 10中使用一些简单的Powershell代码遇到了这个奇怪的问题,我认为这可能是我做错了,但我不是Powershell的天才。 我有这个: $ix = [System.Net.Dn
我正在尝试使用 RapidJSON 解析从服务器接收到的数据。以下是收到的确切字符串: [ { "Node": "9478149a08f9", "Address": "172.17
我尝试为 ios 编译 OpenCV。我总是收到这些错误。我用不同版本的opencv试了一下,结果都是一样的。 我运行这个:python 平台/ios/build_framework.py ios_o
我在一台机器上做基本的发布/订阅,我的客户端是 StackExchange-Redis 的 C# 客户端,我在同一台机器上运行基于 Windows 的 Redis 服务器(服务器版本 2.8.4) 当
我有这段代码,但无法执行,请帮我解决这个问题 连接 connect_error) { die ("connection failed: " . $terhubung->connect_erro
我在 tomcat 上运行并由 maven 编译的 Web 应用程序给出了以下警告和错误。我可以在本地存储库中看到所有 JAR,但有人可以帮忙吗。 WARNING: Failed to scan JA
我正在 Windows 8 上使用 Android Studio 开发一个 android 应用程序,我正在使用一些 native 代码。突然间我无法编译我的 C 文件。当我运行 ndk-build
下面的代码对类和结构的成员进行序列化和反序列化。序列化工作正常,但我在尝试使用 oarch >> BOOST_SERIALIZATION_NVP(outObj); 反序列化时遇到了以下错误; 代码中是
如果我运行此命令“rspec ./spec/requests/api/v1/password_reset_request_spec.rb”,此文件中的所有测试都会通过。 但是,当我运行“rspec”时
我在尝试执行测试以使用 Protractor 上传文件时出错,我的代码是这个 it('it should be possible to upload a file', function() {
System.loadLibrary("nativefaceswap"); 当我运行我的应用程序时,我在 Android Studio 中发现了此类错误。在logcat中显示: java.lang.U
我希望有人能帮助我!使用任何方法或命令行的任何 SSL/HTTPS 调用均无效。 我在 Windows 10 中使用 Ubuntu Server 18.04 作为子系统。我的问题是昨天才开始出现的,因
通过删除这两个值将日期字段从 null=True 和 Blank=True 更改为 required 时,使用 db.alter 命令时遇到问题。 当以下行被注释掉时,迁移运行不会出现问题。
我第一次使用 Heroku 尝试创建应用程序(使用 SendGrid 的 Inbound Parse Webhook"和 Twilio SMS 通过电子邮件发送和接收 SMS 消息)。通过 Virtu
我正在将我的 swift 项目更新到 Xcode 7 上的 Swift 2.0。xcode 在构建项目时报告了以下错误: 命令/Applications/Xcode.app/Contents/Deve
在我的代码中,SSL 库函数 SSL_library_init() 没有按预期返回 1。我如何才能看到它返回了什么错误? 我在 SSL_library_init() 之后调用了 SSL_load_er
我正在尝试运行在以下链接中找到的答案: Asynchronously Load the Contents of a Div 但是当我这样做时,我会遇到我不太理解的错误。 我的代码: $(documen
我是一名优秀的程序员,十分优秀!