SELECT语句不起作用 - mysqli

时间:2015-08-21 10:51:13

标签: php mysqli

我经过几个小时的努力尝试修复一小部分似乎无法正常工作的代码,无论我如何尝试获取值和存储,我都会伸出援手。

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

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

2 个答案:

答案 0 :(得分:1)

另一个答案有点夸张 无论如何,问题将会被解决,我会冒昧地评论另一个答案。

  

将$ stmt的第二个实例的名称更改为其他内容 - $ stmtTwo

  1. 没有必要这样做,因为先前的陈述已经关闭,不能以任何方式干涉。
  2. 我是否会编写PHP 15年,我宁愿建议在一个查询中完成所有mysql工作,而根本不需要第二个语句。
  3.   

    添加一个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;

同时

标头后面应紧跟dieexit命令。

header("Location:blah.php");
exit;