如何使用PDO连接MySQLi数据库?

时间:2016-01-04 00:08:46

标签: php mysql mysqli

我正在创建一个登录表单并且无法成功登录。我的表单看起来像这样

<form method="post" action="phpScripts/loginProcess.php">

    <input type="text" name="uname" value="" placeholder="Username">

    <input type="password" name="pass" value="" placeholder="Password">

    <input id="submit" type="submit" value="submit">

</form>

我已经检查过,我正在连接数据库,我的uname和pass都是正确的。我经过多次双重检查。问题在我的查询中。这是loginProcess.php文件

<?php

    require_once ('dbconn.php');



    if(isset($_POST['login'])){

        $uname  = mysqli_real_escape_string($_POST['uname']);
        $pass   = mysqli_real_escape_string($_POST['pass']);

        $query  = mysql_query ("SELECT * FROM staff WHERE uname='$uname'");
        $numrows = mysql_num_rows($query);

        if ($numrows !=0){
            die("Success!!");
        }
        else{
            die("That user doesnt exist");
        }

    }
    else{
        echo "Username or Password incorrect";
    }
?>

Fred-ii-的帮助下,我能够找出错误并快速修复登录问题!我想提供我用来登录的代码,以防其他人遇到这个问题。

以下是我用来登录的代码。我觉得我可以使用execute和$ userSql / $ pwSql减少冗余。任何建议清理这一点将不胜感激!

<?php
ini_set('display_errors', 1); error_reporting(E_ALL);


require_once ('dbconn.php');


$uname = $_POST['uname'];
$pass  = $_POST['pass'];

$userSql   = "SELECT * FROM staff WHERE uname=:uname";
$getUser = $conn->prepare($userSql);
$getUser->execute(array(
    ':uname' => $uname
));


if($getUser->rowCount()){    
    $pwSql = "SELECT pass FROM staff WHERE uname =:uname";
    $getPw = $conn->prepare($pwSql);
    $getPw->execute(array(
        ':uname' => $uname
    ));
    $pw = implode($getPw->fetch(PDO::FETCH_ASSOC));

    if(password_verify($pass,$pw)){
        header("Location: ../../staffHome.php");
    }else{
        echo "Oops! You have entered in an incorrect password!";
    }

}else{
    echo "Oops! That user doesn't exist!";
}
?>

1 个答案:

答案 0 :(得分:5)

这是独家新闻。

您的条件语句if(isset($_POST['login'])){...}将永远不会发生,因为表单不包含name属性(除非您使用JS / jQuery)。您需要为提交命名。 <input name="submit" id="submit" type="submit" value="submit">,因为PHP不依赖于“id”,它依赖于“name”属性(或者再次,如果你使用的是JS / jQuery,但这不是这里的情况)。然后从name="login" 删除 <form>

然后你没有将连接传递给你的转义函数。

然后你混合了mysql_个函数,以便不与mysql_以外的任何东西混合。

我们也不知道您使用哪个MySQL API进行连接。

因此,在连接到查询时使用相同的一个,使用mysqli_或PDO,最好使用预准备语句。

来自OP的

编辑评论:“我正在使用PDO进行连接。”

  • 您必须使用相同的连接查询。您不能将mysql_mysqli_与PDO混合。

请教:

error reporting添加到文件的顶部,这有助于查找错误。

<?php 
error_reporting(E_ALL);
ini_set('display_errors', 1);

// rest of your code

旁注:只应在暂存时进行显示错误,而不是生产。

<强>密码

我还注意到您可能以纯文本格式存储密码。不建议这样做。

使用以下其中一项:

其他链接:

您目前的代码向SQL injection开放。使用mysqli_* with prepared statementsPDOprepared statements

相关问题