Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

RaroPixelado Raro

Página apenas para amigos - PHP

Recommended Posts

Olá caro amigos, estou criando uma rede social, e quero manter a privacidade de meus usuários, para isso eu precisei optar em certas páginas a opção "Privacidade">"Todos">"Amigos">"Amigos de amigos" e com isso eu tenho essas seguintes dúvidas:

 

Se o membro selecionar "Amigos", como irei restringir o acesso daquela página apenas para amigos dele?

 

E se o usuário selecionar "Amigos de amigos" como irei restringir o acesso da página apenas para os amigos dele e os amigos dos amigos dele?

 

Essa é uma dúvida gigantesca mas quero apenas a questão lógica mas se for possível me enviar um pequeno código php explicando séria ótimo também.

 

Obrigado pela atenção, Atenciosamente RaroPixelado Raro.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Acredito que o raciocino seria + ou - assim...

 

EU, tenho 3 amigos (joao, maria e jose)

O joao tem 1 amigo chamado LUIZ.

o luiz quando entrar no meu album de fotos ele nao vai visualizar pq na minha TABELA DO BANCO DE DADOS ele nao esta adicinado como amigo..

 

é so o que eu pude pensar, rsrsrs mas eu acho que é nesse caminho!!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

RaroPixelado Raro,

Pelo que entendi, você quer criar um sistema de amigos, no qual o amigo de outra pessoa tem restrição pra ver seus dados, logico porque ele não é seu amigo, certo ? então da pra resolver isso no SQL mesmo, na hora que esse usuário for visualizar você vai verificar se o id dele consta na lista de amigos, se não tiver .. nem exibe a página, fala que os dados de 'tal usuário' tem restrições.

 

então vejamos:

C:\dev\mysql\bin>mysql -u root -p
Enter password: ******
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.1.41 Source distribution

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> create database exemplo;
Query OK, 1 row affected (0.05 sec)

mysql> use exemplo;
Database changed
mysql> create table usuarios(
   ->    uid int( 11 ) not null auto_increment,
   ->    nome varchar( 19 ) not null,
   ->    sobrenome varchar( 26 ) null,
   ->  primary key( uid )
   -> )Engine = MyIsam Row_format = redundant;
Query OK, 0 rows affected (0.07 sec)

mysql> create table amigos(
   ->    uid int( 11 ) not null,
   ->    fid int( 11 ) not null
   -> )Engine = MyIsam Row_format = dynamic;
Query OK, 0 rows affected (0.06 sec)

mysql> insert into usuarios ( nome, sobrenome ) values( 'Andrey', 'Knupp' ), ( 'João', 'Da Silva' ), ( 'Maria', 'Dos Santos' );
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> select * from usuarios;
+-----+--------+------------+
| uid | nome   | sobrenome  |
+-----+--------+------------+
|   1 | Andrey | Knupp      |
|   2 | João   | Da Silva   |
|   3 | Maria  | Dos Santos |
+-----+--------+------------+
3 rows in set (0.00 sec)

 

Criei as duas tabelas e guardei alguns usuários, porem ninguém é amigo de ninguém. entao:

mysql> insert into amigos( uid, fid ) values( 1, 2 ), ( 1, 3 ), ( 3, 1 ), ( 3, 2 );
Query OK, 4 rows affected (0.00 sec)
Records: 4  Duplicates: 0  Warnings: 0

mysql> select * from amigos;
+-----+-----+
| uid | fid |
+-----+-----+
|   1 |   2 |
|   1 |   3 |
|   3 |   1 |
|   3 |   2 |
+-----+-----+
4 rows in set (0.00 sec)

 

Perceba os uids que guardei na tabela, o uid corresponde a 'mim' o 'fid' corresponde ao id do amigo ..

então, relacionando esses dados, vou selecionar meus amigos, nos quais são os usuários de uid 2 e 3:

mysql> select usuarios.nome from amigos inner join usuarios on amigos.fid = usuarios.uid where amigos.uid = 1;
+-------+
| nome  |
+-------+
| João  |
| Maria |
+-------+
2 rows in set (0.00 sec)

 

Agora vou relacionar os dados do usuário com id 3 ..

mysql> select usuarios.nome from amigos inner join usuarios on amigos.fid = usuarios.uid where amigos.uid = 3;
+--------+
| nome   |
+--------+
| Andrey |
| João   |
+--------+
2 rows in set (0.00 sec)

 

Assim por diante, só que você não vai relacionar um por um, na hora que o usuário faz o login no sistema, ou seja ele faz uma

identificação, você vai guardar um cookie ou session com o id do usuário, aí só fazer o select .. então fazer a verificação que falei

 

;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Muito bom deu para tirar uma lógica, mas são 2 dúvidas nó tópico, aacho que não as expliquei direito olhem:

 

Se o usuario selecionar que o álbum dele so pode se visto por amigo, só amigos dele poderam ver o álbum, entao quem nao é amigo não verá nunca. a nao se se ele selecionar que pode ser visto por todos.

 

E se o usuario selecionar que o álbum dele so pode ser visto por amigos, e os amigos deles, só poderam ver os amigos dele e os amigos do amigo dele.

 

 

Tendeu :) ^^ na sua lógica so explicou 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vamos a logica..

fuqf14.jpg

 

Ou seja...

So conseguem visualizar o album o grupo que esta em azul...O grupo verde so consegue visualizar o album do joão..

 

Voce pode fazer isso como o nosso amigo Andrey passou... Se bem que a forma que ele passou ficou um pouco confuso... Mas realmente um projeto dessa magnitude é confuso mesmo.

 

Qualquer coisa estamos ai!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Raro... É so você colocar o ID dos amigos na tabela..

 

Assim...

 

você coloca o ID de cada um do grupo de azul na tabela do EU..

você coloca o ID de cada um do grupo verde na tabela do JOAO...

E assim por diante. No caso você teria que criar uma rotina p/ isso..

Compartilhar este post


Link para o post
Compartilhar em outros sites

"confuso", olha se minha lógica é possivel entrar em prática: junto todos os amigos do usuario logado em uma Array(""); e faço uma if verificando se meu id esta no meio daqueles, mas tem uma duvida como colocarei todos os ids dos meus amigos na Array?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Teoria dos Grafos

 

A base matemática para uma Rede Social é a Teoria dos Grafos, a SQL Magazine publicou um artigo tem atrás que discutia uma implementação de uma Rede Social.

 

Tinha um tópico aqui em que se discutia justamente este assunto de Redes Sociais.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Gente eu consegui, olhem

 

$Friend_alloweds = mysql_query("SELECT users.id FROM users_friends INNER JOIN users ON users_friends.b_id = users.id WHERE users_friends.a_id =".$_SESSION['id'].""); // Gera os amigos do user logado
while($Friend_allowed = mysql_fetch_array($Friend_alloweds)) { // whila els

$Allowed = Array($Friend_allowed['id']); // coloca os ids numa raay
foreach($Allowed as $key => $Allowed);
echo $Allowed;
if($Allowed == $_SESSION['id']) { // se você for amigo você vê a página, se não mostra mensagem de privacidade

## COD A PÀGINA ##
} else { header("location: privacy?id=13");
}

 

mas tem um problema!!! ele fica repetindo a página de acordo com os amigos que tenho!

#Edit, e por causa que está dentro do while, mas se eu tiro ele nã gera os amigos(só o primeiro) e consequentemente não funciona

Compartilhar este post


Link para o post
Compartilhar em outros sites

<?php    ob_start();
 $PDO = new PDO( 'mysql:host=localhost;dbname=db', 'usuario', 'senha' );
 $PDO->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
 $query = $PDO->prepare( 'SELECT users.id FROM users_friends INNER JOIN users ON users_friends.b_id = users.id WHERE users_friends.a_id = :id' );
 $query->bindParam( ':id', $_SESSION[ 'id' ], PDO::PARAM_INT );
 $query->execute();
 $dados = $query->fetchAll( PDO::FETCH_ASSOC );
 if( !in_array( $dados[ 'id' ], $_SESSION[ 'id' ] ) ){
	 header( 'location: privacy?id=13', true )
 }else{
	 foreach( $dados as $data ){
		 echo $data[ 'id' ], '<br />';
	 }
 }
 flush();

 

Se der erro, posta o SQL da sua tabela aí

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá amigo, tenho dúvidas em questão ao seu código, poderia me explicar?

 

O seu código:

     ob_start();
        $PDO = new PDO( 'mysql:host=localhost;dbname=faky_teen', 'root', 'vertrigo' );
        $PDO->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
        $query = $PDO->prepare( 'SELECT users.id FROM users_friends INNER JOIN users ON users_friends.b_id = users.id WHERE users_friends.a_id = '.$_SESSION['id'].'' );
        $query->bindParam( ':id', $_SESSION[ 'id' ], PDO::PARAM_INT );
        $query->execute();
        $dados = $query->fetchAll( PDO::FETCH_ASSOC );
        if( !in_array( $dados[ 'id' ], $_SESSION[ 'id' ] ) ){
                header( 'location: privacy?id=13', true );
        }else{
                foreach( $dados as $data ){
                        echo $data[ 'id' ], '<br />';
                }
        }
        flush();

 

Bom o código SQL:

        $query = $PDO->prepare( 'SELECT users.id FROM users_friends INNER JOIN users ON users_friends.b_id = users.id WHERE users_friends.a_id = '.$_SESSION['id'].'' );

 

Dá o seguinte resultado:

+-------+
| ID    |
+-------+
|   2   |
|   3   |
|   1   |
+-------+

E o meu ID na database é igual a: 1 e mesmo assim sou redirencionado para a página de privacidade,

 

Quer meu sql aqui olha:

CREATE TABLE IF NOT EXISTS `users_friends` (
 `id` int(255) NOT NULL auto_increment,
 `a_id` varchar(700) NOT NULL,
 `b_id` varchar(700) NOT NULL,
 PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=6 ;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Amigo, tá errado, você mudou o SQL ..

Além do mais, sua modelagem tá ruim .. pra que isso ?

varchar( 700 )

Você não vai ter número maior que 2147483647, então você não precisa disso:

`id` int(255) NOT NULL auto_increment,

 

E por favor, para de me mandar mensagem privada :(

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.