SELECT语句不起作用-mysqli


SELECT statement not working - mysqli

我花了几个小时的时间试图修复一小段代码,但不管我如何获取值和存储,这些代码似乎都不起作用。

我承认我不是最有经验的,希望这是我的一个小错误,更专业的人很容易发现。

所有其他函数都按预期工作,并获取除一个外的所有必需值,其中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

  1. 这样做毫无意义,因为前面的声明已经结束,不能以任何方式进行干预
  2. 如果我要写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;