2010-12-09 49 views
4

我使用自定義PHP包裝爲mysqli。如果將綁定參數傳遞給fetchResultSet函數,該類就被設計爲使用預處理語句,否則,正如我的理解,它會保存對數據庫的調用並使用查詢函數(也許我錯誤地保存了一個調用,其餘部分這個問題可以通過簡單地使用準備好的語句來回答,即使沒有參數綁定也是如此。當使用PHP的MySQLi,函數查詢和fetch_assoc數據鑄造

一旦查詢已被執行的功能fetchResult傳遞迴兩個對象ResultSetObjectResult或ResultSetObjectStmt之一兩者巫實現ResultSetObject接口。 (ResultSetObjectStmt對象包裝stmt對象,而ResultSetObjectResult包裝結果對象)

當通過調用結果的fetch_assoc或調用stmt對象上的bind_result(基本上)請求行時,這兩個類都會返回關聯數組。

我已經注意到的是,如果執行一個準備好的聲明後返回正確鑄造爲整數,實數,並根據他們的數據庫類型的字符串數據;但是當返回一個結果並且在該結果上調用fetch_assoc時,所有數據都將作爲字符串進行轉換。我意識到這是在fetch_assoc的文檔中提到的。我很好奇,如果有另一個函數或我可以做的事情,讓MySQL正確地投下結果。

[編輯] 我應該提到,這只是一個問題,因爲json_encode根據其類型將數據放在引號中。

[編輯AGAIN] 我想知道是否有反正正確投從結果中返回的數據,而不訴諸想使用類似is_numeric函數工作或通過向數據庫,再調用的表的模式。在獲取數據時專門使用預處理語句,但我真的很想將額外的準備調用保存到數據庫。

+0

你能告訴我你最後做了什麼嗎?謝謝 – 2012-05-22 15:14:34

+0

在抓取將被轉換爲JSON的數據時使用預準備語句或使用PHP settype手動投射結果之外,絕不會找到解決方案。 – AWinter 2012-05-23 05:48:12

回答

2

我不知道你使用的是什麼包裝器,但你可以有一個函數像...

while ($row = $query->fetch_assoc()) { 
    $row = auto_cast($row); 
} 

function auto_cast($row) { 
    foreach ($row as $key => $value) { 
     if (ctype_digit($value)) { 
      $row[$key] = (int) $value; 
     } 
     elseif (is_numeric($value)) { 
      $row[$key] = (float) $value; 
     } 
     else { 
      $row[$key] = (string) $value; 
     } 
    } 
    return $row; 
} 
+0

包裝是自定義的。我想這樣做,但我擔心值應該是字符串,但只包含數字將被轉換爲整數或浮動當字符串是適當的數據類型。有沒有辦法根據數據庫類型進行轉換,而不需要對錶格模式的數據庫進行額外的查詢? – AWinter 2010-12-09 09:49:32

1

我會盡力幫助這裏。當使用預先準備好的語句時,PHP知道列類型是什麼,並根據不同類型存儲數據:string,integer,bool等。使用fetch_assoc時,它不知道這些信息。您可以使用mysqli_fetch_fields創建一個獲取字段/列MySQL數據的函數並使用它們的類型。基於此,您可以對它們進行類型轉換。希望這會有所幫助。關於不同列類型

費耶信息在這裏看到http://www.php.net/manual/en/mysqli.constants.php

MYSQLI_TYPE_LONG - 字段是等定義爲INT的。