如何防止CodeIgniter中的重复记录

时间:2012-12-20 11:13:39

标签: php sql codeigniter phpmyadmin

我选择的人将在朋友数据库中显示两次。如何防止重复输入?我试过使用exists sql命令但没有运气

朋友模特:

   function addFriend($username, $friendname)
 {
$record = array('username'=> $username,
                 'friend' => $friendname);

$this->db->insert('friends', $record);


 }


 function getFollowing($username)
{
$following = array();
$this->db->select('*')->from('friends')->where('username', $username);
$followingSet = $this->db->get();
foreach ($followingSet->result() as $row)
{
    if(isset($username)){

        $following[] = $row->friend;
    }
    else 
    {
        return false;


    }

}

return $following;
}

视图:

 <?php foreach($friends['following'] as $name):?>
        <li>  <?=anchor("profile/view/$name", $name)?>, (<?=anchor("home/drop/$name", 'drop')?>)</li>
      <?php endforeach?>=

我想要做的是停止在我的数据库中重复的条目 - 我如何在我的sql语句中使用exists关键字?

6 个答案:

答案 0 :(得分:4)

在插入之前,只需检查用户名/友好名称是否存在:

$q =  $this->db->select('username')
      ->from('friends')
      ->where(array('username' => $username, 'friend' => $friendname))->get();
if($q->num_rows() == 0){
    //insert goes here
}

答案 1 :(得分:2)

我认为您没有设置表格以获得更好的效果。

CREATE TABLE friends (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
userId INT UNSIGNED NOT NULL,
friendId INT UNSIGNED NOT NULL,
FOREIGN KEY (userId)
    REFERENCES users(userId)
    ON UPDATE CASCADE ON DELETE CASCADE,
FOREIGN KEY (friendId)
    REFERENCES users(userId)
    ON UPDATE CASCADE ON DELETE CASCADE,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
ALTER TABLE friends ADD UNIQUE INDEX (userId, friendId);

这种通过id存储朋友的简单明了的解决方案,可以防止重复。 InnoDB引擎可以维护您的数据完整性,当您从用户表中删除某人时 - 将会自动删除所有与此用户相关的朋友表中的行。

答案 2 :(得分:0)

插入时,您可以调用getFollowing方法,然后按照以下步骤操作:

function add_follower($username, $friend_username)
{
    $current_followers = $this->getFollowing($username);

    if(!in_array($friend_username, $current_followers)
    {
        // Add to followers
    }
 }

为此,您需要将getFollowing更改为此:

function getFollowing($username)
{
    $following = array();

    $this->db->select('*')->from('friends')->where('username', $username);

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

    foreach ($followingSet->result() as $row)
    {
        $following[] = $row->friend;
    }
    return $following;
}

这可能不会100%正确,因为我不知道你的数据库/模型是如何配置的。但它应该给你一个关于如何做到这一点的一般想法

答案 3 :(得分:0)

在插入数据库中已存在任何条目的新记录之前,您必须在数据库中进行检查。以下是代码......

function addFriend($username, $friendname)
{
    $user_name = $this->getFollowing($username);

    if( empty($user_name) )
    {
         $record = array('username'=> $username,
             'friend' => $friendname);

         $this->db->insert('friends', $record);
    }
}

function getFollowing($username)
{
    $following = array();
    $this->db->select('*')->from('friends')->where('username', $username);
    $followingSet = $this->db->get();

    if( !empty($followingSet) )
    {
         foreach ($followingSet->result() as $row)
         {
              $following[] = $row->friend;
         }
    }
    return $following;
 }

另外我想建议,在使用之前一定要检查数组是否为空。就像你在 foreach 循环中使用它一样,循环会产生错误。

答案 4 :(得分:0)

尝试使用此选项来应用查询以读取内容,在数据库查询中应用distinct

   $this->db->distinct();

答案 5 :(得分:0)

在你的模型中尝试这样的事情:

/**
 * Return true if don't find row in DB.
 * @param array $ay_value
 * @param array $ay_column
 * @param string $table
 * @throws Exception
 * @return boolean
 */

public function check_double_content($ay_value, $ay_column, $table) {

    if ((is_array($ay_value)) AND (is_array($ay_column))) {

        if (count($ay_value) == count($ay_column)) {

            foreach ($ay_column AS $key => $column) {
                $this->db->where($column, $ay_value[$key]);
            }

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

            if ($query->num_rows() > 0) {
                return false;
            } else {
                return true;
            }



        } else {
            throw new Exception("\$ay_value and \$ay_coulm must have same rows");
        }

    } else {
        throw new Exception("\$ay_value and \$ay_column must by array");
    }

}