簡體   English   中英

查找/替換mysql_到mysqli_使代碼無效

[英]Find/replace mysql_ to mysqli_ makes code nonfunctional

因此,我確信任何曾經是SO的常規人員已經注意到, mysql_函數將被棄用,並建議使用mysqli_PDO代替。 因此,我決定通過在我的代碼中進行簡單的查找/替換來轉換到mysqli,用mysql_替換每個mysqli_ 這似乎在Dreamweaver中工作正常,我沒有語法錯誤或任何東西。 所有新的mysqli_函數都是藍色的,這意味着它們被識別為有效函數。

但是,當我保存所有內容並運行代碼時,我注意到任何與mysql有關的代碼都無法運行。 撤消替換解決了問題。

我的服務器可能不支持mysqli功能嗎? 我知道它正在運行php 5和mysql 5.是否還有其他東西需要添加到代碼中? 我錯過了什么?

這是現在切換的好時機,因為PHP 7.0從核心刪除了ext/mysql函數。

請考慮以下遺留代碼

$res = mysql_query($sql);

mysql_函數是懶惰的,因為它會使用任何打開的連接。 mysqli_不僅不是懶惰,它是一個對象 ,而不是連接資源(這是mysql_connect()將返回的)。 在這里查看這些行以連接到數據庫

$mysqli = new mysqli('host', 'username', 'password', 'db');
$mysqli = mysqli_connect('host', 'username', 'password', 'db');

他們倆都給你同樣的東西......

返回表示與MySQL服務器的連接的對象

恩,那就對了。 甚至程序連接函數也返回一個對象。 最簡單的使用方法是直接使用對象形式

$mysqli->query($sql);

程序功能只是包裝器。 但他們並不懶惰。 看看差異

mysqli_query($mysqli, $sql);

這個中最大的問題(為什么mysql_的簡單查找和替換與mysqli_失敗)是大多數mysqli_函數都要求你將連接對象作為第一個參數傳遞 同樣重要的是要注意結果也是對象( mysqli_result類),盡管它們的過程對應物只需要結果集,因此您可以簡單地查找/替換它們。

只是為了完成,還有一個不常見的問題(這是非常古老的代碼): mysql_result 這個函數在mysqli_沒有等價物。 你應該切換到整行返回函數,如mysqli_fetch_assoc($result)

你可能想看看http://wiki.hashphp.org/PDO_Tutorial_for_MySQL_Developers ,它應該告訴你關於遷移mysql_代碼的所有知識,但是要告訴你PDO,而不是MySQLi ..

您必須知道在更換代碼時可能會遇到許多問題。

  1. 這里檢查mysqli的安裝。
  2. 這里查看mysqli的配置。
  3. 以兩種方式檢查數據庫連接:

    ** natimysql之類的簡單連接:

    $con = mysqli_connect("localhost","my_user","my_password","my_db");

    但是現在你必須這樣使用它

    mysqli_query($con,"SELECT * FROM Table"); // $con is the connection which is must for executing the sql query

    **我最好的方法是將它作為新的mysqli對象處理:

    $con = new mysqli('localhost', 'user', 'pass', 'demo');

    現在你會這樣做:

     $sql = "SELECT * FROM Table"; $con->query($sql); 

    如果你每次檢查之前,你必須找到這些錯誤專門的錯誤在第三點,你可以采取參觀,在教程的一個,你做了詢問這里這里這里

很驚訝沒人提到mysql_和mysqli_函數不是完全相似的,因此搜索和替換必然會失敗。 此外,mysqli_通常會堅持使用數據庫連接參數(當在程序模式中使用時,這是你的目標),其中mysql_只會抓取代碼中先前打開的任何連接。

如果啟用了調試,則應該能夠解決錯誤。

最常見的“問題”是沒有mysqli等效的mysql_result(),人們在獲得單個結果時經常會使用它。 我願意打賭你的代碼散布着“mysqli_result()”調用,這些都會失敗。

這是基本的解決方案。 “好”修復可能是為所有SQL調用使用專用類,因此在整個代碼庫中只有少數使用mysqli函數,並且所有函數都在一個文件中。 這樣,當你重構時,你不需要搜索大量文件,所有文件都具有各種mysqli函數的各種不同用法。

如果您“需要MySQL的一些權威來源 - > MySQLi遷移”我可以推薦一個名為Google的網站;-)輸入“MySQL - > MySQLi遷移”。

例如,這個“for Dummies”頁面顯示了您需要解決的各種功能之間的差異,以使您的代碼正常工作。

http://www.dummies.com/how-to/content/how-to-convert-mysqli-functions-to-mysql-functions.html

mysql_函數現已棄用

不,他們還沒有

我決定通過在我的代碼中進行簡單的查找/替換來轉換到mysqli

問題很可能在於mysqli函數具有反向參數順序並且需要顯式地連接資源。

盡管如此,即使你成功進行大量替換,它對你的代碼也沒有絲毫的好處 ,所以,你最好保持原樣,盡管在這個網站上有一些錯誤的......過於激烈的競選。

  1. 沒有理由趕時間。 你有至少5年的時間,直到你開始注意到一些不便。
  2. 關於mysql函數的所有這些噪音的目標不是將一些API更改為另一個API,而是為了使通常的PHP代碼更加明智和安全。 只搜索和替換你不會達到這兩個目標 - 所以,根本沒有理由這樣做。

你真正需要的是一種處理查詢的智能方法,封裝在一些庫類中,這不僅可以提高運行SQL查詢的體驗,還可以將所有API函數移動到一個可以輕松替換為任何API的地方。有些人會決定強迫你使用。

暫無
暫無

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

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