簡體   English   中英

我可以盲目地用 mysqli_ 替換所有 mysql_ 函數嗎?

[英]Can I blindly replace all mysql_ functions with mysqli_?

我在整個項目中都使用了mysql_query() 但我剛剛了解到mysql_在 PHP 5.5 中已被棄用,已在 PHP 7 中刪除。

所以,我想知道是否可以在我的項目中盲目地將所有mysql_函數替換為mysqli_ 例如,只需將mysql_query()替換為mysqli_query() 有什么不良影響嗎?

簡短的回答是否定的,功能不等價。

好消息是有一個轉換器工具可以幫助你,如果你有很多電話/項目需要改變。 這將允許您的腳本立即工作。

https://github.com/philip/MySQLConverterTool

它是 Oracle 原始版本的分叉版本,並且是 kosher 的。

也就是說,更新您的代碼並不太難,無論如何您可能希望遷移到面向對象的方法......

1) 連接

出於所有意圖和目的,您需要一個新的連接函數,將連接保存為 PHP 變量,例如;

$mysqli = new mysqli($host, $username, $password, $database);

請注意,我已將連接保存到$mysqli 您可以保存到$db或任何您喜歡的內容,但您應該在整個代碼中使用它來引用連接。

記得在打開連接之前為mysqli啟用錯誤報告;

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

2)查詢

注意:您應該使用 MySQLi 中提供的預處理語句來防止 SQL 注入。 看看如何在 PHP 中防止 SQL 注入? ,但我將在這里介紹基礎知識。

您現在必須將連接作為參數包含在查詢和其他mysqli_函數中。 在過程代碼中,它是第一個參數,在 OO 中,您可以像類方法一樣編寫它。

程序:

$result = mysqli_query($mysqli, $sql);

面向對象:

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

3) 獲取結果

結果的獲取類似於程序中舊的mysql_函數;

while ($row = mysqli_fetch_assoc($result))

但由於$result現在是 mysqli 中的一個對象,您可以使用對象函數調用;

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

4) 緊密連接

所以和以前一樣,你需要在 close 函數中包含連接; 作為程序上的論據;

mysqli_close($mysqli);

並作為您在 OO 中運行該函數的對象;

$mysqli->close();

如果我經歷了所有這些,我會永遠在這里,但你明白了。 查看文檔以獲取更多信息。 不要忘記轉換您擁有的任何連接關閉、結果發布或錯誤和行計數功能。

基本的經驗法則是對於使用數據庫連接的函數,您現在需要將它包含在函數中(作為過程中的第一個參數,或用於在 OO 中調用函數的對象),或者作為結果集您可以將函數更改為mysqli_或使用結果集作為對象。

如果您無法將所有調用轉換為舊項目上的 mysqli 函數,您可以安裝並包含庫php7-mysql-shim

它將嘗試使用 mysqli 在 PHP 7 上為 mysql 創建一個透明的替代品。 顯然性能較慢,但這是在幾分鍾內解決問題的解決方案。 您可以安全地將庫包含在使用 PHP 5.6 的項目中(它將被忽略)。

if (defined('PHP_VERSION_ID') && (PHP_VERSION_ID >= 50600)) { require_once "mysql-shim.php"; }

你不能。 mysql 和 mysqli 的一些函數需要不同的參數。 所以你應該知道哪些將使用相同的參數。

暫無
暫無

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

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