這是可能的。即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];
}
尼斯迴應,謝謝大家對於t他努力解釋所有這些! – jjwdesign
只需閱讀您的評論,並在我的代碼中發現錯誤。 $ result應該是$ this-> result_id。將在計算機上修復。沒問題,不過不客氣 –
修正了所有的$ result變量都被替換爲$ this-> result_id –