簡體   English   中英

致命錯誤:在非對象錯誤上調用成員函數 query()

[英]Fatal error: Call to a member function query() on a non-object Error

我有一個小問題。 我正在嘗試使用會話制作一個簡單的注冊/登錄系統,但出現此錯誤:

致命錯誤:第 9 行在 C:\\xampp\\htdocs\\members\\includes\\login.inc.php 中的非對象上調用成員函數 query()

這是相關的代碼行:

$result = $conn->query($sql);

我第一次嘗試它是有效的。

其余代碼:

<?php
if ($_SERVER['REQUEST_METHOD'] == 'POST')
{
    $email      = $_POST['email'];
    $password   = md5($_POST['password']);
    $sql = "SELECT email, password FROM member WHERE email = '$email' AND password = '$password'";
    $result = $conn->query($sql);

我還有db.php,用來連接MYSQL,里面的一切都很好。

我不明白為什么,我第一次嘗試它的時候我猜它可以工作,現在出現這種錯誤。

我還有用於連接 MYSQL 的 db.php,里面的一切都很好..有人能解釋一下為什么我一直面臨這個錯誤嗎?

我來推測一下。 我推測您有一個單獨的文件(可能稱為db.php ),它“處理”數據庫連接的設置。 我將進一步推測您有一系列文件,這些文件被require() (或include() )放入您的網絡應用程序中。

我見過的次數比我想記得的要多。 這是在 PHP 中將代碼分成邏輯塊的一種非常老式的方法 - 這需要留在過去。

我推測您之前在此代碼之前包含(或需要)的另一個腳本中定義了$conn 一個全局變量,它在代碼執行的后期具有依賴性。 對聲明它的文件不可見。

這就是問題所在 快速/黑客修復是重命名$conn或恢復它的原始聲明,並確保它是全局的,並確保運行此代碼之前包含它。

正確的解決方法(恕我直言)是查看使用框架(Laravel、Lumen、CodeIgniter、Yii,有很多 - 隨你選擇)並閱讀依賴注入、自動加載和命名空間的主題。 想一想為什么全局變量聲明會導致無法維護的代碼。

如果你真的不願意使用一個完整的框架,至少可以看看一些數據庫抽象庫,比如doctrine (它是子庫dbal ),它們可以很容易地通過composer自動加載到你的項目中。

正如Sascha已經指出的那樣, $conn可能根本沒有定義,或者它不是一個對象(因此是錯誤消息)。

從您提供的代碼示例中,實際上很難判斷您可能使用的是哪種連接對象,但我認為可以說在您的情況下它可能是PDOmysqli

為了簡單起見,讓我們堅持使用 mysqli。 基於 mysqli 的工作代碼示例如下所示(取自上述文檔的縮短示例):

$conn   = new mysqli("localhost", "my_user", "my_password", "world");
$result = $conn->query($sql);

盡管您確實應該使用所謂的准備好的語句,因為正如 wally 已經說過的那樣,您現在的代碼很容易受到 SQL 注入。

我會鏈接沃利的答案,並為您提供與准備好的聲明相關的 PHP 文檔的鏈接,但顯然,我缺乏聲譽點不允許我這樣做,所以只需在 Google 上快速搜索 PHP 和准備好的聲明即可。

必須在文件開頭添加數據庫連接文件。

現在的格式很簡單。

<?php  $mysqli = new mysqli("localhost", "Userid", "password", "database name"); if ($mysqli->connect_errno) {
    echo "Failed to connect to MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error; }
?>

開頭:

需要'db.php'; $conn = 新數據庫();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM