php
  • mysql
  • 2010-10-14 7 views 1 likes 
    1

    Comment puis-je rejoindre users avec users_friends.user_id quand user_id = '" . $user_id . "'problème de codage MySQL

    Et rejoindre users avec users_friends.friend_id quand friend_id = '" . $user_id . "'

    si user_id = '" . $user_id . "'

    INNER JOIN users ON users_friends.user_id = users.user_id 
    

    si friend_id = '" . $user_id . "'

    INNER JOIN users ON users_friends.friend_id = users.user_id 
    

    Code MySQL actuel.

    SELECT COUNT(user_id) as friends 
    FROM users_friends 
    WHERE (user_id = '" . $user_id . "' 
    OR friend_id = '" . $user_id . "') 
    AND friendship_status = '1' 
    
    +0

    utiliser PHP 'mysql_real_escape_string' fonction s'il vous plaît. Votre code semble vulnérable à l'injection SQL! – Benoit

    Répondre

    0
    (SELECT * FROM users_friends JOIN users ON users.user_id = users_friends.friend_id 
        WHERE users_friends.friend_id = '" . $user_id . "') 
    UNION 
    (SELECT * FROM users_friends JOIN users ON users.user_id = users_friends.user_id 
        WHERE users_friends.user_id = '" . $user_id . "') 
    

    Quelque chose comme cela peut faire le travail.

    Comme vous regardez dans la table user_friends vous devriez l'utiliser pour rejoindre la table des utilisateurs.

    0

    si je vous ai bien compris alors essayez quelque chose comme ceci:

    call list_user_friends(1); 
    
    call list_all_friends_of_user(1); 
    

    script complet:

    -- TABLES 
    
    drop table if exists users; 
    create table users 
    (
    user_id int unsigned not null auto_increment primary key, 
    username varbinary(32) unique not null 
    ) 
    engine=innodb; 
    
    drop table if exists user_friends; 
    create table user_friends 
    (
    user_id int unsigned not null, 
    friend_user_id int unsigned not null, 
    primary key (user_id, friend_user_id) -- note clustered composite PK (innodb only) 
    ) 
    engine=innodb; 
    
    -- STORED PROCEDURES 
    
    drop procedure if exists insert_user_friend; 
    
    delimiter # 
    create procedure insert_user_friend 
    (
    in p_user_id int unsigned, 
    in p_friend_user_id int unsigned 
    ) 
    proc_main:begin 
    
        if p_user_id = p_friend_user_id then 
        leave proc_main; 
        end if; 
    
        insert into user_friends (user_id, friend_user_id) values (p_user_id, p_friend_user_id); 
    
    end proc_main # 
    
    delimiter ; 
    
    drop procedure if exists list_user_friends; 
    
    delimiter # 
    create procedure list_user_friends 
    (
    in p_user_id int unsigned 
    ) 
    proc_main:begin 
    
        select 
        u.* 
        from 
        user_friends uf 
        inner join users u on uf.friend_user_id = u.user_id 
        where 
        uf.user_id = p_user_id 
        order by 
        u.username; 
    
    end proc_main # 
    
    delimiter ; 
    
    drop procedure if exists list_all_friends_of_user; 
    
    delimiter # 
    create procedure list_all_friends_of_user 
    (
    in p_user_id int unsigned 
    ) 
    proc_main:begin 
    
        select 
        u.* 
        from 
        users u 
        inner join 
        (
        select friend_user_id as user_id from user_friends where user_id = p_user_id 
        union 
        select user_id from user_friends where friend_user_id = p_user_id 
    ) all_friends 
        on u.user_id = all_friends.user_id 
        order by 
        u.username; 
    
    end proc_main # 
    
    delimiter ; 
    
    -- TEST DATA 
    
    insert into users (username) values ('f00'),('bar'),('alpha'),('delta'),('omega'),('theta'); 
    
    call insert_user_friend(1,2); 
    call insert_user_friend(1,3); 
    call insert_user_friend(1,4); 
    call insert_user_friend(1,1); -- oops 
    
    call insert_user_friend(2,1); 
    call insert_user_friend(2,5); 
    
    call insert_user_friend(4,1); 
    
    call insert_user_friend(6,1); 
    
    -- TESTING (call these sproc from your php !) 
    
    call list_user_friends(1); 
    
    call list_all_friends_of_user(1); 
    
    Questions connexes