2009-05-02 4 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()); 

?> 

注意:未定義の変数:.. \ login.phpライン上の14

致命的なエラーでmysqliの:メンバ関数の呼び出し.. 14の行で.. \ login.phpの非オブジェクトのquery()

私を助けてください。

答えて

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; 
    } 
} 

私が追加したいことは、特にmysqliを使用するときにSQLを作成しないことです。バインドパラメータを使用します。これを実行してください:

$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); –

4

問題は "インクルード"が黙って死んだことです。これは、PHPの素敵な機能です。含まれているのはあなたが失敗したときにあなたに伝えません。

"include"を "require"に置き換えて、ファイルが見つからないときに致命的に死ぬようにします。

また、SQLインジェクションとXSSセキュリティNOWについてもお読みください。あなたのSQLは残酷に安全ではない、とに設定したユーザー名でログインを試みた(文字通り、引用符が含まれています)

' or true or '' = ' 

は瞬時に簡単にタスクになり、攻撃者の生活を行います。

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

は「true」を返します。