我花了几个小时的时间试图修复一小段代码,但不管我如何获取值和存储,这些代码似乎都不起作用。
我承认我不是最有经验的,希望这是我的一个小错误,更专业的人很容易发现。
所有其他函数都按预期工作,并获取除一个外的所有必需值,其中s为member_id字段。这是来自另一个表(公司(的链接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的直接查询中,它是有效的,所以感觉这是一个绑定问题。这应当被绑定到CCD_ 1。
另一个答案有点举例说明
由于这个问题无论如何都会结束,我可以自由地评论另一个答案。
将$stmt的第二个实例的名称更改为其他名称-$stmtTwo
- 这样做毫无意义,因为前面的声明已经结束,不能以任何方式进行干预
- 如果我要写PHP 15年,我宁愿建议在一个查询中完成所有mysql工作,而不需要第二条语句
添加var_dump($stmtTwo(;将结果绑定到$company之后。
这是一个很随意的戳。为什么是在绑定后,而不是在其他地方?
请检查MySQL日志中的MySQL错误。
对于99%的php用户来说,这是不可能完成的任务。然而,只需要两个命令就可以在开发服务器的屏幕上显示错误消息。
列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");
}
绑定结果后没有添加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;
此外:
标头后面应紧跟CCD_ 2或CCD_ 3命令。
header("Location:blah.php");
exit;