2012-08-11 278 views
1

我对登录脚本有几个问题。这只是引导我到一个没有错误的空白页面。PHP登录脚本问题

  • 如果我使用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(); 
    ?> 

回答

1

我试图解决您的每一个问题,但是,他们有这么混,我不能只给你每一个答案。所以我冒昧地修改你的发布的脚本,我相信它会使它工作。也许一些额外的调整仍然是必要的。请查看我在线添加的评论。此外,回顾在其面向对象的形式使用mysqli的功能更多信息下面的PHP文档页:

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(); 
?> 
+0

谢谢!我试了一下,但每次修改它都会给我错误页面,即使登录有效。任何想法为什么? – Undermine2k 2012-08-11 08:37:54

+0

你可以显示登录表的模式吗?这可能有助于进一步解决问题。 – Katsuke 2012-08-12 01:40:37

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 

我认为你可以继续这样做。 。 。

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()

0

对不起朋友,我不知道很多关于mysqli的。 但是,如果你愿意,这可以用mysql轻松完成。

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

希望你理解... :))