如何在模糊列名称上生成错误消息?

时间:2011-11-04 20:10:36

标签: php mysql codeigniter

我最近使用CodeIgniter,使用数组方法查询数据:通常是result_array()row_array()数据库方法。我注意到有时会发生错误而没有错误通知(旧代码 - 不是我的 - 我只是错误修复程序)。这是典型的模糊列名称问题,已在StackOverflow中多次发布。

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

使用CodeIgniter,没有不明确的字段错误消息。像往常一样使用字段名称填充数组;暧昧与否。无论如何通过显示或记录错误消息来阻止CodeIgnitier中的这个?

当出现模糊字段问题时,有没有人对如何使用PHP记录错误消息(或许使用CI log_message())有任何想法?

1 个答案:

答案 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];
}