从CodeIgniter查询数据库时,如何解决此非唯一表错误

时间:2011-08-20 23:35:56

标签: php codeigniter

以下代码发出以下错误消息:

A Database Error Occurred
Error Number: 1066
Not unique table/alias: 'users'

SELECT * FROM (`users`, `users`) JOIN `user_profiles` ON `users`.`id` = `user_profiles`.`user_id`

Filename: /home/xtremer/public_html/kowmanager/models/cpanel/dashboard.php

Line Number: 38

这是我的代码:

class Dashboard extends CI_Model {
  private $table_name = 'users'; // user accounts
  private $profile_table_name = 'user_profiles'; // user profiles

  function __construct() {
    parent::__construct();
    $ci =& get_instance();
    $this->table_name = $ci->config->item('db_table_prefix', 'tank_auth').$this->table_name;
    $this->profile_table_name = $ci->config->item('db_table_prefix', 'tank_auth').$this->profile_table_name;
  }

 /**
  * Get user info by Id
  *
  * @param int
  * @param bool
  * @return object
  */
  function get_user_info($id) {
    $this->db->select('*');
    $this->db->from('users');
    $this->db->join('user_profiles', 'users.id = user_profiles.user_id');

    $query = $this->db->get($this->table_name);
    if ($query->num_rows() == 1) {
      return $data = $query->row();  
    }  else {
     return NULL;  
    }
  }
}
编辑:我知道我的功能有这个并改变它,因为看了之后我不需要额外的表。我有一个数组($ data)的值被发送到我的标题但是我可以将它发送到构建,就像它将数组发送到所有部分一样。

function get_user_info($id)
{
    $this->db->select('*');
    $this->db->from('users');
    $this->db->where('users.id', $id);

    $query = $this->db->get();

    if ($query->num_rows() == 1) 
    {
        return $data = $query->row();    
    }
    else 
    {
        return NULL;    
    }

}   

这是我更新的控制器:

function index()
{
    $id = $this->tank_auth->get_user_id();

    $data = $this->Dashboard->get_user_info($id);
    print_r($data);
    $this->template->set_layout('cpanel')->enable_parser(false);
    $this->template->set_partial('header', 'partials/header', $data);  
    $this->template->set_partial('sidebar', 'partials/sidebar');  
    $this->template->set_partial('content', 'partials/content');      
    $this->template->set_partial('footer', 'partials/footer');
    $this->template->build('/cpanel/index');
}

2 个答案:

答案 0 :(得分:3)

问题在于:

SELECT * FROM (users, users)

我假设您正在尝试将表连接到自身,但是如果不给表添加别名就不能这样做,否则数据库在您引用时不知道您引用的连接的哪一侧来自它的领域。

试试这个:

SELECT * 
FROM users u1, users u2 
JOIN user_profiles ON u1.id = user_profiles.user_id

<强>更新

我的上述答案是根据错误信息编写的,但我没有注意到代码链接(我已经添加了代码以与问题内联)。

我对CI并不过分熟悉,但我觉得你的问题在于以下三个方面:

  1. private $table_name = 'users';
  2. $this->db->from('users');
  3. $query = $this->db->get($this->table_name);
  4. 在第3行中,您明确get ting $this->table_name指向users表,如第1行所示。但是,通过在第2行显式设置from表,也指向users,我认为您不小心在两个表之间设置了连接。由于这两个表都是相同的,并且两者都没有别名,因此导致错误。尝试删除$this->db->from('users');行,看看是否能解决问题。

    更新2:

    我一直在阅读CodeIgniter user guide,当您使用像{{1}这样的方法构建查询时,您似乎不需要将任何内容指定为$this->db->get()的参数}。我建议只改变这一行:

    from()

    到此:

    $query = $this->db->get($this->table_name);
    

    有关详细信息,请参阅this page

答案 1 :(得分:1)

当您编写users,users但未向其中任何一个提供别名时,您正在使用users表的笛卡尔积。我认为你根本不想采用笛卡尔积。尝试:

SELECT * FROM users JOIN user_profiles ON users.id = user_profiles.user_id