1

然后,我会选择的人将在我的朋友数据库中出现两次。如何防止重复条目进入此处?我尝试使用存在 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 关键字?

4

6 回答 6

4

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

$q =  $this->db->select('username')
      ->from('friends')
      ->where(array('username' => $username, 'friend' => $friendname))->get();
if($q->num_rows() == 0){
    //insert goes here
}
于 2012-12-20T11:54:27.057 回答
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 引擎维护您的数据完整性,并且当您从 users 表中删除某人时 - Friends 表中包含该用户的好友的所有行将被自动删除。

于 2012-12-20T12:09:03.733 回答
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% 正确,因为我不知道您的数据库/模型是如何配置的。但它应该让您大致了解如何执行此操作

于 2012-12-20T11:19:26.847 回答
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循环中使用它一样,循环会产生错误。

于 2012-12-20T11:50:03.343 回答
0

试试这个你想应用查询来阅读的地方,在数据库查询中应用不同

   $this->db->distinct();
于 2013-12-28T17:16:58.813 回答
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");
    }

}
于 2016-11-17T22:32:32.287 回答