2015-08-27 56 views
0

我正在重寫一個應用程序,以便它可以使用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(); 
     } 
    } 
} 

回答

1

有在現有代碼中有很多查詢需要給定查詢的行數。

這是什麼實際上錯誤在您的應用程序,而不得不被修復。

在每一個使用了返回行數的地方,它都被用作而不是目的地,來告訴行可能已經完全返回,但只是爲了判斷是否已經找到任何行。這使得這種調用非常多餘,因爲你有數據本身來告訴是否有任何數據已被返回。

關於OP中的特定函數,從count(*)查詢返回除1之外的任何內容的函數絕對沒有意義。這種模棱兩可的功能非常危險,並且總是會導致令人遺憾的後果。不要混淆你自己的代碼。

function returnRowcount($result_object, $connection_type){ 
    if ($connection_type == 'mysqli') { 
     return mysqli_num_rows($result_object); 
    } elseif ($connection_type == 'pdo') { 
     return $result_object->rowcount(); 
    } 
} 

是它應該被允許存在的唯一形式。

請注意,rowCount()方法沒有任何問題。不要成爲老迷信的簡單獵物。

儘管如此,正如我之前提到的,在web開發中這樣的功能幾乎沒有用處。您可以選擇數據(您可以用PHP計數)或計數(您只需提取),但不能同時選擇兩者。

+0

在'mysqli_num_rows'之前有'$'。另外,你也許應該解釋'rowCount()'是使用錯誤的方法。 – MichaelRushton