1

私が選択したはずの人が、私の友達データベースに 2 回表示されます。ここに重複エントリが入らないようにするにはどうすればよいですか? 私は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キーワードをどのように使用しますか?

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

あなたのモデルで次のようなことを試してください:

/**
 * 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 に答える
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

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 に答える