2017-10-22 138 views
0

據我所知,得到mysqli的錯誤信息的唯一途徑是:有沒有辦法得到沒有CONNECTION變量的mysqli_error?

$con=mysqli_connect("localhost","my_user","my_password","my_db"); 
///RUN QUERY HERE, and if error: 
$error=mysqli_error($con); 

但是(認爲我很聰明),我的整個軟件編程,該得到CON信息的功能,因爲有多個數據庫和桌子。所以我的查詢看起來更像這樣。

$query=mysqli_query(CON("USER_DATABASE"),"INSERT INTO users (column) VALUES ("VALUE") "); 
run_query($query); ///In this function I either run the query, 

或記錄失敗的查詢。但是不能記錄具體的錯誤。

有什麼辦法都以某種方式仍然捕捉mysqli_error();而mysqli_error()函數中沒有$ con?也許與$查詢變量?

+1

是的,另一個 - 正確的方法是對mysqli應用異常處理。閱讀[this](https://phpdelusions.net/mysqli/error_reporting)和[this](https://phpdelusions.net/pdo#errors)。第二個鏈接介紹有關PDO的理論,但它實際上也適用於mysqli。 – 2017-10-22 04:49:37

+0

順便說一句我不明白這個運行查詢的事情。用mysqli_query,你已經**正在運行一個查詢。再次「運行」它毫無意義。 –

回答

1

as there are multiple databases and tables.

表的數量並不重要。

彷彿數據庫,應用程序應該有每個數據庫(但是,我寧願說,你正在做的事情錯了,如果你需要多個數據庫在一個簡單的應用程序)一個連接變量。

無論哪種方式,有一種方式來獲得mysqli的錯誤沒有連接變量。爲了讓它成爲可能,你應該告訴Mysqli開始拋出異常。只需添加這行

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); 

因此最簡單的解決方案,你會做出CON()函數靜態和每一個被調用的時候返回相同的連接實例。

但是,你應該重新考慮架構,使之更好地組織,只使用一個數據庫,除非絕對必要,還可以使用OOP擺脫靜態函數。

+0

感謝您的反饋。嗯好,所以這是在正確的方向。但是,現在我將錯誤輸出顯示爲「致命錯誤:此處詳細信息」,並且頁面按預期方式死亡。有沒有辦法將這些錯誤的詳細信息放入一個變量中,以便我可以保存它們?原因是因爲即使有些查詢可能會失敗,我不想輸出錯誤代碼並殺死頁面,因爲它們不一定是「關鍵」的。基本上我的run_query($查詢);函數如果(!$ query){發送警告給管理員},所以我們知道發生了什麼。但是,因爲$ con變量不存在,所以我們不能得到錯誤。 –

+0

那麼,實際上你不需要一個變量。您需要的一切已經存在於PHP中,您只需根據您的需求進行配置即可。我寫了一篇文章解釋這些問題,[PHP錯誤報告基礎知識](https://phpdelusions.net/articles/error_reporting),如果您對特定實現有任何疑問,我鼓勵您閱讀並返回。順便說一下,建議網站/服務的流量是多少? –

+0

謝謝你的信息!我知道error_logs,但我希望我可以將所有error_logs轉發到一個日誌而不是每個目錄中的新日誌。我試圖將mysqli_error放在varibale中的原因是我可以通過電子郵件發送給自己。將檢查你的文章。謝謝!我是一名企業家,你可以告訴業餘編碼員。我已經爲特許經營建立了一個成功的「公司門戶」軟件,並由我們擁有的與之集成的一些其他軟件提供支持。所有這些服務器都保存在同一臺服務器上,但大多數應用程序不同,這就是爲什麼有不同的數據庫。 –

2

However (thinking I was smart) my whole software is programmed with a function that gets con info, as there are multiple databases and tables. So my queries look more like this.

不這樣做。這不僅使得檢索錯誤信息變得更加困難,而且 - 更重要的是! - 這意味着您的應用程序將爲每個查詢創建一個全新的數據庫連接。這將使您的應用程序顯着減慢

如果你的應用程序確實需要連接到多個數據庫,考慮在數據庫中傳遞一個符號名作爲參數,並緩存連接且已在一個靜態變量被使用的所有數據庫。

相關問題