![](/img/trans.png)
[英]Fatal error: Call to a member function query() on a non-object in (CodeIgniter)
[英]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
可能根本沒有定義,或者它不是一個對象(因此是錯誤消息)。
從您提供的代碼示例中,實際上很難判斷您可能使用的是哪種連接對象,但我認為可以說在您的情況下它可能是PDO或mysqli 。
為了簡單起見,讓我們堅持使用 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.