2011-11-04 30 views
2

最近我使用CodeIgniter,用查詢數據的數組方法:通常是result_array()row_array() DB方法。我注意到有時會發生錯誤,沒有錯誤通知(舊代碼 - 不是我的 - 我只是錯誤修復程序)。這是在StackOverflow中多次發佈的典型模糊列名稱問題。如何在模棱兩可的列名上產生錯誤消息?

例如: PHP & MYSQL: How to resolve ambiguous column names in JOIN operation?

用CodeIgniter,沒有模棱兩可的領域錯誤消息。數組像往常一樣填充字段名稱;模棱兩可或不模糊。無論如何,通過顯示或記錄錯誤消息來防止在CodeIgnitier中發生這種情況?

有沒有人有任何想法如何記錄一個錯誤信息(使用CI log_message()也許)與PHP時出現歧義字段問題?

回答

2

這是可能的。即CI不扔了不明的列名SQL錯誤的原因是因爲它例如

SELECT `table`.`name`, `table2`.`name` FROM `table`, `table2` ... 

你再沒有機會看到這些列的原因是因爲選擇,所以當追加表的名稱由mysqli_fetch_assoc()或您使用的驅動程序生成的數組密鑰是name,並且顯然會被覆蓋。以下答案適用於使用CI2.x的人。

以我對CodeIgniter: SQL Audit of all $this->db->query() method calls?的回答中使用的類似方式擴展數據庫驅動程序結果類。一旦你擴展了數據庫驅動結果類,你有兩個選擇。按照您的要求,您可以拋出一個錯誤,如下所示:

/** 
* Result - associative array 
* 
* Returns the result set as an array 
* 
* @access private 
* @return array 
*/ 
function _fetch_assoc() 
{ 
    if (!($row = mysql_fetch_array($this->result_id))) 
    { 
     return null; 
    } 

    $return = array(); 
    $row_count = mysql_num_fields($this->result_id); 

    for($i = 0; $i < $row_count; $i++) 
    { 
     $field = mysql_field_name($this->result_id, $i); 

     if(array_key_exists($field, $return)) { 
      log_message('Error message about ambiguous columns here'); 
     } else { 
      $return[$field] = $row[$i]; 
     } 
    } 

    return $return; 

    //Standard CI implementation 
    //return mysql_fetch_assoc($this->result_id); 
} 

或者你也可以進一步控制功能的輸出通過預先tablename_,導致數組一樣

SELECT * FROM `users` LEFT JOIN `companies` ON `users`.`id` = `companies`.`id` 
Array (
    [users_id] => 1 
    [users_name] => User1 
    [companies_id] => 1 
    [companies_name] => basdasd 
    [companies_share_price] => 10.00 
) 
列名來模擬查詢行爲

要做到這一點,你可以簡單地修改for環在上述函數如下:

for($i = 0; $i < $row_count; $i++) 
{ 
    $table = mysql_field_table($this->result_id, $i); 
    $field = mysql_field_name($this->result_id, $i); 
    $return["$table_$field"] = $row[$i]; 
} 
+0

尼斯迴應,謝謝大家對於t他努力解釋所有這些! – jjwdesign

+0

只需閱讀您的評論,並在我的代碼中發現錯誤。 $ result應該是$ this-> result_id。將在計算機上修復。沒問題,不過不客氣 –

+0

修正了所有的$ result變量都被替換爲$ this-> result_id –

相關問題