PHP登录脚本问题

时间:2012-08-11 05:38:05

标签: php mysql

我的登录脚本有几个问题。它只是指向一个没有错误的空白页面。

  • 如果我使用的是mysqli,我是否需要使用?$username$password 我的疑问?
  • 我不明白$stmt -> fetch()发生的任何事情;我用它了吗?
  • $result=mysqli_query($stmt);:这个$result变量是否包含用户名和密码?
  • 如果是这种情况,mysqli_num_rows($result)如何运作?

  <?php 
    function clean($str)
       {
            $str = @trim($str);
            if(get_magic_quotes_gpc()) {
                $str = stripslashes($str);
            }
            return mysql_real_escape_string($str);
        }


        //Sanitize the POST values

    $username = clean($_POST['username']);
    $password = clean($_POST['password']);

    /* Create a new mysqli object with database connection parameters */
    $mysqli = mysqli_connect('localhost', 'root', '', 'draftdb');

    if(mysqli_connect_errno()) 
    {
          echo "Connection Failed: " . mysqli_connect_errno();
          exit();
    }
       /* Create a prepared statement */
    if($stmt = $mysqli -> prepare("SELECT Login_ID, Login_PW,
    FROM login  
    WHERE Login_ID='$username' AND Login_PW ='".md5($_POST['password'])."'"))
     {


          /* Bind parameters
             s - string, b - boolean, i - int, etc */
          $stmt -> bind_param("ss", $username, $password);

          /* Execute it */
          $stmt -> execute();

          /* Bind results */
          $stmt -> bind_result($username, $password);

          /* Fetch the value */

         while ($stmt->fetch()) 
         { 
              $result=mysqli_query($stmt);

        //Check whether the query was successful or not
        if($result)
         {//main if
            if(mysqli_num_rows($result) == 1) 
            {
                //Login Successful
                session_regenerate_id();
                $login = mysqli_fetch_assoc($result);
                $_SESSION['SESS_MEMBER_ID'] = $login['Login_ID'];
                //$_SESSION['SESS_FIRST_NAME'] = $login['firstname'];
                //$_SESSION['SESS_LAST_NAME'] = $login['lastname'];
                session_write_close();
                header("location: member-index.php");
                exit();
            }
            else {
                //Login failed
                header("location: login-failed.php");
                exit();
                 }
            }
            else 
            {
            die("Query failed");
            }


         }//main if close


          /* Close statement */
          $stmt -> close();
       }

       /* Close connection */
       $mysqli -> close();
    ?>

4 个答案:

答案 0 :(得分:1)

  1. 当您使用预准备语句时,通常不应将变量替换为语句。你把 ?占位符,然后使用$stmt->bind_param()将这些占位符与变量相关联。

  2. 使用$stmt->fetch()后,您可以引用与$stmt->bind_result绑定的变量来访问SELECT的结果。

  3. 如果您使用的是准备好的声明,则根本不应该使用mysqli_query。要回答有关其工作原理的问题,$result不包含实际数据。您可以调用$row = mysqli_fetch_assoc($result)之类的内容将用户名和密码输入$ row。

  4. 您应该使用$stmt->num_rows()

答案 1 :(得分:1)

我试图解决你的每一个问题,但是他们混在一起,我不能只给你一个答案。所以我冒昧地修改你发布的脚本,我相信它会使它工作。也许还需要一些额外的调整。请查看我在线添加的评论。另外,请查看以下php文档页面,了解有关以面向对象形式使用mysqli函数的更多信息:

http://www.php.net/manual/en/mysqli-stmt.num-rows.php

http://www.php.net/manual/en/mysqli-stmt.execute.php

http://www.php.net/manual/en/mysqli-stmt.bind-result.php

http://www.php.net/manual/en/mysqli-stmt.bind-param.php

我没有测试它,我可能有一两个错字,但这是我尝试改进你的脚本。让我知道你的想法:

<?php 
function clean($str)
{
    $str = @trim($str);
    if(get_magic_quotes_gpc()) {
        $str = stripslashes($str);
    }
    return mysql_real_escape_string($str);
}

//Sanitize the POST values

$username = clean($_POST['username']);
$password = clean($_POST['password']);

/* Create a new mysqli object with database connection parameters */
$mysqli = mysqli_connect('localhost', 'root', '', 'draftdb');

if(mysqli_connect_errno()) 
{
    echo "Connection Failed: " . mysqli_connect_errno();
    exit();
}

/* Is your username the same as the login_id? If not you need to change this query's where to use the username column not the login_id. */

/* Create a prepared statement */
if($stmt = $mysqli -> prepare("
    SELECT Login_ID, firstname, lastname
    FROM login  
    WHERE Login_ID=? AND Login_PW=?
"))
{
    /* Bind parameters
         s - string, b - boolean, i - int, etc */
    $stmt -> bind_param("ss", $username, md5($password));

    /* Execute it */
    $result = $stmt -> execute();

    //Check whether the query was successful or not
    if ($result === false) {
        die("Query failed");
    }

    /* Bind results to variables that will be used within the fetch() loop. */
    $stmt -> bind_result($login_id, $firstname, $lastname);

    /* Check the number of rows returned. */
    if ($stmt->num_rows !== 1) {
        //Login failed
        header("location: login-failed.php");
        exit();
    }

    /* Iterate over the results of the query. */
    while ($stmt->fetch()) 
    { 
        //Login Successful
        session_regenerate_id();
        /* We can use $login_id, $firstname and $lastname cause we binded the result to those variables above. */
        $_SESSION['SESS_MEMBER_ID'] = $login_id;
        //$_SESSION['SESS_FIRST_NAME'] = $firstname;
        //$_SESSION['SESS_LAST_NAME'] = $lastname;
        session_write_close();
        header("location: member-index.php");
        exit();
     }//main if close

      /* Close statement */
      $stmt -> close();
   }

   /* Close connection */
   $mysqli -> close();
?>

答案 2 :(得分:0)

我认为,问题在于你的代码的这部分

 while ($stmt->fetch()) 
     { 
          $result=mysqli_query($stmt);

你已经执行了该声明,并将其取出;您无需再次查询。 。 。 。我不熟悉mysqli,因为我使用PDO,但我认为既然您将结果绑定到$ username,$ password,您可以使用这些绑定变量访问返回的值。

while ($result = $stmt->fetch()) 
 { 
if($result->num_rows == 1) 
        {
$_SESSION['SESS_MEMBER_ID'] = $result['LOGIN_ID']
//////or $_SESSION['SESS_MEMBER_ID'] = $username  

我想你可以这样继续下去。 。

答案 3 :(得分:0)

对不起朋友我对mysqli了解不多。 但如果你愿意的话,可以用mysql轻松完成。

顺便说一句,对于你的第3个问题, 如果您的搜索条件存在任何匹配记录,则$result=mysqli_query($stmt);仅返回资源ID。并且mysqli_num_rows($result);将返回有多少资源ID可用于该条件。用户名和密码将仅在mysqli_fetch_array($result);之后返回,这将使数据库将记录作为这些资源ID的数组获取。

希望你理解...... :))