[英]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 ..
您必須知道在更換代碼時可能會遇到許多問題。
以兩種方式檢查數據庫連接:
** 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函數具有反向參數順序並且需要顯式地連接資源。
盡管如此,即使你成功進行大量替換,它對你的代碼也沒有絲毫的好處 ,所以,你最好保持原樣,盡管在這個網站上有一些錯誤的......過於激烈的競選。
你真正需要的是一種處理查詢的智能方法,封裝在一些庫類中,這不僅可以提高運行SQL查詢的體驗,還可以將所有API函數移動到一個可以輕松替換為任何API的地方。有些人會決定強迫你使用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.