我最近使用CodeIgniter,使用数组方法查询数据:通常是result_array()
或row_array()
数据库方法。我注意到有时会发生错误而没有错误通知(旧代码 - 不是我的 - 我只是错误修复程序)。这是典型的模糊列名称问题,已在StackOverflow中多次发布。
例如: PHP & MYSQL: How to resolve ambiguous column names in JOIN operation?
使用CodeIgniter,没有不明确的字段错误消息。像往常一样使用字段名称填充数组;暧昧与否。无论如何通过显示或记录错误消息来阻止CodeIgnitier中的这个?
当出现模糊字段问题时,有没有人对如何使用PHP记录错误消息(或许使用CI log_message()
)有任何想法?
答案 0 :(得分: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];
}