2009-05-02 82 views
0

我是PHP新手,試圖編寫一個登錄函數。位卡住並出現錯誤。 這裏我的功能:編寫php函數

<?php 

if(!defined('_VALID_ACCESS')) die('direct access is not allowed.'); 
include('includes/connect.php'); 

function login($username, $password) 
{ 
    $username = trim($username); 
    $password = trim($password); 
    echo $username; 
    echo $password; 
    $login_sql = "SELECT * FROM user WHERE user = '".($username)."' 
    AND pass = '".(md5($password))."'"; 
    $login_result = $mysqli->query($login_sql) or die(mysqli_error()); 
    $row=$login_result->fetch_row(); 
    if($row[0] == 1) 
    { 
     return true; 
    } 
    else 
    { 
     return false; 
    } 
} 
?> 

connect.php

<?php 
$db_name = "coolmates"; 
$db_server = "localhost"; 
$db_user = "justron"; 
$db_pass = "Justron9004"; 

$mysqli = new MySQLi($db_server, $db_user, $db_pass, $db_name) or die(mysqli_error()); 

?> 

注意:未定義的變量:在mysqli的.. \ login.php中上線14

致命錯誤:調用一個成員函數查詢()在第14行上的.. \ login.php中的非對象上

幫助我。

回答

4

您錯過了全局標識符。即:

function login($username, $password) 
{ 
    global $mysqli; 
    $username = trim($username); 
    $password = trim($password); 
    echo $username; 
    echo $password; 
    $login_sql = "SELECT * FROM user WHERE user = '".($username)."' 
    AND pass = '".(md5($password))."'"; 
    $login_result = $mysqli->query($login_sql) or die(mysqli_error()); 
    $row=$login_result->fetch_row(); 
    if($row[0] == 1) 
    { 
     return true; 
    } 
    else 
    { 
     return false; 
    } 
} 

我想補充一件事:不要像這樣構造SQL,特別是在使用mysqli時。使用綁定參數。這樣做:

$login_result = $mysqli->query("SELECT COUNT(1) result FROM user WHERE user = ? AND pass = ?"); 
$login_result->bind_param("ss", $username, md5($password)); 
$login_result->execute(); 
$login_result->bind_result($count); 
$login_result->fetch(); 
if ($count == 1) { 
    // success 
} else { 
    // failure 
} 
+0

更進一步,將登錄功能的末尾更改爲: return($ row [0] == 1); – 2009-05-02 05:32:42

4

問題是「包含」無聲地死了。這是PHP的一個可愛的功能,包括將不會告訴你他們什麼時候不成功。

將您的「include」替換爲「require」,以便在文件未找到時它會死亡。

另外,請閱讀SQL注入和XSS安全NOW。你的SQL是殘酷的不安全,並與用戶名設置爲嘗試登錄(字面意思,報價含稅)

' or true or '' = ' 

會立即做出可能的攻擊者的生活更輕鬆的任務。

select 'hello' = '' or true or '' = '' and 'world' = '1'; 

返回「true」您看到。