2013-06-04 61 views
2

我決定移動到mysqli的,因爲我不斷收到熄火,當人們發現我的MySQL代碼:-)移動到mysqli的

可能有人驗證下面是正確的,它所有的作品,但我只是想確認在我進入網站的其他部分之前,我沒有做一些愚蠢的事情或者存在安全風險。 這是登錄時用於用戶名/密碼檢查的php。

<?php 
//Start session 
session_start(); 

//Include database connection details 
require_once('db_connect.php'); 

//Array to store validation errors 
$errmsg_arr = array(); 

//Validation error flag 
$errflag = false; 


// cleanup POST variables 
$username = mysqli_real_escape_string($mysqli, stripslashes(trim($_POST['username']))); 
$password = mysqli_real_escape_string($mysqli, stripslashes(trim($_POST['password']))); 

//Input Validations 
if($username == '') { 
    $errmsg_arr[] = 'Username required'; 
    $errflag = true; 
} 
if($password == '') { 
    $errmsg_arr[] = 'Password required'; 
    $errflag = true; 
} 

//If there are input validations, redirect back to the login form 
if($errflag) { 
    $_SESSION['ERRMSG_ARR'] = $errmsg_arr; 
    session_write_close(); 
    header("location: logon.php"); 
    exit(); 
} 

//Load and run query 
$result = mysqli_query($mysqli, "SELECT * FROM auth WHERE username='$username' AND password='$password'"); 

if ($result->num_rows) { 
//Login Successful 
     session_regenerate_id(); 
     //Set session variables 
     $member = $result->fetch_assoc(); 
     $_SESSION['SESS_MEMBER_ID'] = $member['ID']; 
     $_SESSION['SESS_USERNAME'] = $member['username']; 
     $_SESSION['SESS_FIRST_NAME'] = $member['fname']; 
     $_SESSION['SESS_PASSWORD'] = $member['password']; 
     $_SESSION['SESS_AUTH_LEVEL'] = $member['auth_level']; 
     session_write_close(); 
     header("location: index"); 
     exit(); 
    }else { 
     //Login failed 
     $errmsg_arr[] = 'user name or password not found'; 
     $errflag = true; 
     if($errflag) { 
      $_SESSION['ERRMSG_ARR'] = $errmsg_arr; 
      session_write_close(); 
      header("location: logon.php"); 
      exit(); 
     } 
    } 
mysqli_close($mysqli); 
?> 

非常感謝!

+2

這個問題會更適合代碼審查。 – Kermit

+5

你真的應該使用準備好的陳述和加密你的密碼 – Fabio

+1

爲什麼不移動到PDO?:http://php.net/manual/en/book.pdo.php –

回答

-1

好了,你會想用準備語句在這裏,因爲你沒有執行靜態 SQL查詢 - 這就是mysqli_query()是用於。

所以,這裏就是你需要做什麼:

  1. 不要與// cleanup POST variables部分打擾。
  2. 更改//Load and run query部分以使用預準備語句。
  3. 首先,我們要準備吧:http://php.net/manual/en/mysqli.prepare.php

    $query = mysqli_prepare($mysqli, "SELECT * FROM auth WHERE username=? AND password=?");

  4. 然後我們想給mysqli的是什麼?標誌是:http://www.php.net/manual/en/mysqli-stmt.bind-param.php

    $query->bind_param('ss', $username, $password);

然後,使用bind_resultfetch(見指數http://www.php.net/manual/en/class.mysqli-stmt.php)來獲得結果,並存儲到會話變量。