2014-01-14 37 views
-1

我是新手,遇到一些困難。我看過幾個代碼,使用MySQL創建登錄頁面,但不是MySQLi。我試圖通過更換值做我自己,但它顯示了這個錯誤:登錄腳本無法使用

Notice: Trying to get property of non-object in C:\wamp\www\CTE\login.php on line 18 

我真的不知道如何解決它。

<?php 
session_start(); 

require "conexiondb.php"; 

$username =($_POST['username']); 
$password = ($_POST['password']); 
$enc_password = md5($password); 

if($username&&$password) 
{ 
    //$query=$numrows=$con->query("SELECT * FROM producto"); 
    $query=$con->query("administrador WHERE nombre='$username'"); 
    { 
     $numrows = $query->num_rows; 
    } 
    if($numrows !=0) { 
     while ($row=$query->fetch_assoc($numrows)) 
     { 
      $dbusername = $row ['username']; 
      $dbpassword = $row ['password']; 
     } 
     if ($username == $dbusername && $password==$dbpasswrod) 
     { 
      echo "Login Successful. < href='members.php'>Enter member area></a>"; 
      $_SESSION['username']=$dbusername; 
     } 
     else 
      echo"incorrect pass"; 
    } 
    else 
     echo die ("that username doesnt exist"); 
} 
else 
    die ("enter username"); 
+2

您的查詢失敗,因爲它是不完整的 - >'administrador WHERE nombre ='$ username'' | '$ query = $ con> query(「administrador WHERE nombre ='$ username'」);'。嘗試改爲 - '選擇用戶名,密碼從administrador WHERE用戶名='$用戶名'? (因爲你有$ dbusername = $ row ['username'];'),所以把nombre改成了username。另外,請注意sql注入。 – Sean

+3

你應該閱讀sql注入。 – jeroen

+4

我也想看看PHP的CRYPT函數來進行密碼加密。 MD5不安全。 –

回答

-1
while ($row=$query->fetch_assoc($numrows)) 

你爲什麼要傳遞$numrows參數?它應該是:

while ($row=$query->fetch(PDO::FETCH_ASSOC)) 

在另一個說明,爲什麼你有這個聲明的大括號。他們看起來真的不必要

{ 
     $numrows = $query->num_rows; 
} 

此外,請注意,肖恩是正確的關於不完整的查詢。

+0

他使用'mysqli',而不是'PDO'。 – miyasudokoro

1
Notice: Trying to get property of non-object 

意味着你在你的代碼中有一些你認爲已經被設置爲對象的東西。但是,實際上,這個對象並不存在。

in C:\wamp\www\CTE\login.php on line 18 

告訴你究竟在哪裏找到不存在的對象:該文件的第18行。在這種情況下,根據您發佈內容,18行是:

while ($row=$query->fetch_assoc($numrows)) 

雖然它應該工作的很好,因爲PHP忽略了不必要的爭議,fetch_assoc是一個無效的方法,所以它應該是

while ($row=$query->fetch_assoc()) 

無論如何,這裏的問題是$query實際上不是一個對象。這意味着,當您調用$con->query時,它不返回mysqli_result對象,而是返回false。爲什麼?因爲當MYSQL語法出現錯誤時,它會自動失敗並返回false。你不應該指望「false」本身或num_rows來檢查。以下是你需要做什麼,而不是:

$query=$con->query("administrador WHERE nombre='$username'"); 
if($con->errno) { 
    //die($con->error); 
    throw new Exception($con->error, $con->errno); 
} 
//continue with what you were doing 
$numrows = $query->num_rows; 

爲什麼我建議拋出異常而不是使用模具()像所有的手動實例,或像我註釋掉?你應該只使用die()作爲臨時快速瀏覽某個東西。拋出一個異常就像die()一樣暫停代碼,但是你可以用write an exception handler來處理這個錯誤。您可以記錄錯誤,通過電子郵件發送給自己,向用戶顯示錯誤消息或以上所有內容。

至於MYSQL語法出了什麼問題,看一下MYSQL錯誤信息的內容,並考慮你從其他人那裏得到的評論。

編輯:

我才意識到你是不是叫$query->free()$con->close()。不要忘記打這些電話。你應該在整個事情上使用一個try-catch statement來做到這一點,這樣即使在例外的情況下也會發生。

try { 
    //all of your code 
} catch (Exception $e) { 
    // you can handle your exceptions here or with an exception handler 
    // some examples: 
    mail('[email protected]', 'Website Error', $e->getMessage()); 
    error_log($e->getMessage()); 
    //note: don't echo the MYSQL error message to users other than yourself 
    echo 'An error has occurred'; 
} finally { 
    if(isset($query) && is_resource($query)) { 
     $query->free(); 
    } 
    if(isset($con) && is_resource($con)) { 
     $con->close(); 
    } 
} 
+0

我只想說謝謝你的幫助。我已根據您的建議解決了我的問題。 – user3187412