我正在重寫一個應用程序,以便它可以使用MYSQLI或PDO查詢,可以通過$ connection_type變量進行控制,該變量包含'mysqli'或'pdo'作爲正在使用的標誌。帶fetch_field_direct(),getColumnMeta()的Rowcount解決方案;可移植性到PHP 7?
現有代碼中有很多查詢需要給定查詢的行數。獲取查詢返回的實際行數已經在Stackoverflow的其他地方以不同的方式提出了質疑和回答,但我想我已經選擇了一種可以與MYSQLI或PDO協同工作的熨斗方法,然後在結果對象是從與在任何這些形式的變型的查詢(注意第三個例子;我已經設計成工作是否COUNT()在查詢中使用的函數):
select count(*) from table
select count(distinct column) from table
select column1, column2, column3 from table
對於mysqli的,我解決方案依賴fetch_field_direct(),這顯然是堅實可靠的。但是,對於PDO,我的解決方案依賴於相應的函數getColumnMeta(),它在PHP.NET文檔中以此方式標記:
警告 此函數是實驗性的。在PHP的未來版本 中,此函數的名稱 及其相關文檔的行爲可能會在不另行通知的情況下發生變化。應該使用此功能,風險自負。
所以,我有兩個問題:
1)任何人都可以看到的東西我已經在這個方法忽略了? 2)有誰知道如果getColumnMeta()是(a)出現在即將到來的PHP 7中,然後(b)它是否已經完成,它返回什麼以及由什麼操作符?如果該函數的名稱將相同,並且它將返回如下所示的「名稱」列,那麼我的代碼(在PHP 5.6.12上運行良好)應該在PHP 7上工作釋放。
所以,這裏是我的功能,這是爲上述類型都爲的mysqli和PDO上市查詢做工精細的當前狀態(但我忽略的東西嗎?):
function returnRowcount($result_object, $connection_type){
if ($connection_type == 'mysqli') {
$name_field = strtoupper($result_object->fetch_field_direct(0)->name);
if (substr($name_field, 0, 6) == "COUNT(") {
$row = $result_object->fetch_row();
return $row[0];
} else {
return mysqli_num_rows($result_object);
}
} elseif ($connection_type == 'pdo') {
// WARNING: THE PHP DOCUMENTATION STATES THAT getColumnMeta MAY CHANGE IN FUTURE:
$name_field = strtoupper($result_object->getColumnMeta(0)["name"]);
if (substr($name_field, 0, 6) == "COUNT(") {
return $result_object->fetchColumn();
} else {
return $result_object->rowcount();
}
}
}
在'mysqli_num_rows'之前有'$'。另外,你也許應該解釋'rowCount()'是使用錯誤的方法。 – MichaelRushton