我经过几个小时的努力尝试修复一小部分似乎无法正常工作的代码,无论我如何尝试获取值和存储,我都会伸出援手。
我承认我不是最有经验的人,并且希望这是我的一个小错误,很容易被有更多专业知识的人发现。
所有其他函数按预期工作并获取除一个之外的所有必需值,使用s成员字段。这是来自另一个表(公司)的链接ID,但是在测试查询中,该语句可以正常工作。
整码代码
<?php
//Error reporting - DEV ONLY
error_reporting(E_ALL);
ini_set('display_errors', 'on');
//New Connection
$mysqli = new mysqli('localhost', 'USER', 'PASSWORD', 'DATABASE');
//Connection Verification
if ($mysqli->connect_errno) {
printf("Connection Failure: %s\n", $mysqli->connect_error);
exit();
}
//Start Session and assign POST values
session_start();
$username = $_POST['username'];
$password1 = $_POST['password'];
//Query prepare, execution and bind
$stmt = $mysqli->prepare("SELECT password FROM user WHERE username='$username'");
$stmt -> execute();
$stmt -> bind_result($result);
/* Fetch the value */
$stmt -> fetch();
/* Close statement */
$stmt -> close();
//Verify password match and direct user according to result
if(password_verify($password1, $result))
{
$stmt = $mysqli->prepare("SELECT member_id FROM user WHERE username='$username'");
$stmt -> execute();
$stmt -> bind_result($company);
$_SESSION['loggedin'] = true;
$_SESSION['username'] = $username;
$_SESSION['company'] = $company;
Header("Location: home.php");
}else{
sleep(5);
Header("Location: index.php");
}
$mysqli->close();
?>
疑似问题代码段
if(password_verify($password1, $result))
{
$stmt = $mysqli->prepare("SELECT member_id FROM user WHERE username='$username'");
$stmt -> execute();
$stmt -> bind_result($company);
$_SESSION['loggedin'] = true;
$_SESSION['username'] = $username;
$_SESSION['company'] = $company;
Header("Location: home.php");
}else{
sleep(5);
Header("Location: index.php");
}
提前感谢您的帮助!
编辑:问题是,没有输出:
SELECT member_id FROM user WHERE username='$username
然而,在使用MySQL的直接查询中它起作用,所以感觉它是一个绑定问题。这应该绑定到$_SESSION['company']
。
答案 0 :(得分:1)
另一个答案有点夸张 无论如何,问题将会被解决,我会冒昧地评论另一个答案。
将$ stmt的第二个实例的名称更改为其他内容 - $ stmtTwo
添加一个var_dump($ stmtTwo);将结果绑定到$ company。
这是一个随意的戳。为什么在绑定后但不在其他任何地方?
检查MySQL日志中的MySQL错误。
99%的php用户认为这是不可能完成的任务。然而,在开发服务器上只有两个命令才能出现错误消息right on the screen。
用户表中的列member_id是?
这又是一个随机戳(密码字段怎么样?),无论如何都必须解决上一个主题中讨论的错误消息。向程序员询问是没有意义的。人们应该问一个数据库,作为一种更可靠的来源。
在其中添加打印输出,以显示password_verify函数正在运行并允许执行该代码块。
这是唯一的好处。
使用预准备语句的建议也是正确的,但出于某种原因,它被称为“对象样式”,它远远不够。
是的,他终于设法发现了整个问题的拼写错误 - fetch()声明不存在。
我怀疑你的MySQL没有被触发,因为你正在使用PREPARE语句而没有传递任何值。
我自己会使用mysqli,我会知道这样的查询是可以的。
标题应为小写。 header()并且应该紧跟一个die或exit命令。
两者都不是真的 PHP中的函数不区分大小写,这一点背后没有逻辑 - 因此,不需要手动退出。
Stack Overflow也不是代码审查网站,但实际上没有人关心,因为那些着名的10M问题的答案的三分之一实际上是代码审查答案。所以这就是:
<?php
//Error reporting - ALWAYS PRESENT
error_reporting(E_ALL);
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
//Error displaying - DEV ONLY
ini_set('display_errors', 'on');
//New Connection
$mysqli = new mysqli('localhost', 'USER', 'PASSWORD', 'DATABASE');
//Start Session
session_start();
//Query prepare, bind, execute and fetch
$stmt = $mysqli->prepare("SELECT member_id, password FROM user WHERE username=?");
mysqli->bind_param("s",$_POST['username']);
$stmt->execute();
$stmt->bind_result($member_id, $db_pass);
$stmt->fetch();
if(password_verify($_POST['password'], $db_pass))
{
$_SESSION['username'] = $_POST['username'];
$_SESSION['company'] = $member_id;
Header("Location: home.php");
}else{
Header("Location: index.php");
}
答案 1 :(得分:-1)
绑定结果后,您尚未添加Fetch语句:
if(password_verify($password1, $result))
{
$stmt = $mysqli->prepare("SELECT member_id FROM user WHERE username='$username'");
$stmt -> execute();
$stmt -> bind_result($company);
$stmt -> fetch();
/* Close statement */
$stmt -> close();
$_SESSION['loggedin'] = true;
$_SESSION['username'] = $username;
$_SESSION['company'] = $company;
一些额外的说明:
您正在错误地编写MySQL,它可以妥协。 您正在使用旧的MySQL风格方法,但采用较新的OOP方法的结构,这与原始MySQL的安全风险一样多。
旧 - 程序式:
mysqli_query($link, "SELECT poops FROM bathroom WHERE smell = '$bad' LIMIT 1");
新功能 - 面向对象的风格:
mysqli->prepare("SELECT poops FROM bathroom WHERE smell = ? LIMIT 1")
mysqli->bind_param("s",$bad); //the value is placed by reference rather than directly
mysqli->execute;
同时强>
标头后面应紧跟die
或exit
命令。
header("Location:blah.php");
exit;