Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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.
Obrigado, mas tipo como irei representar isso no php eu iria ter de usar uma if com os que tem permissao e nao. mas como faço para juntar todos meu amigos para fazer a checagem?
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;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
;)uma coisa você pode ter certeza... não é tão simples assim!!! rsrs
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
Você leu o que eu disse sobre o array ?
Não vi nada de array alí desculpe :(
Não entendi muito o escrito no quadrado <code>
Vamos a logica..
/applications/core/interface/imageproxy/imageproxy.php?img=http://i56.tinypic.com/fuqf14.jpg&key=9a21835dcd572497501b53c6afcca88f93df5f700e46c0a55adda119d1852508" alt="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!
eu terei de revisar e revisar mas se tiverem uma lógica menos confusa agradeço
O problema, é que não sei como fazer oque disseram porque esta muito confuso.
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..
"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?
Cara, quando você faz o fetch no banco de dados, alias, no resultset, você já vai ter um array com todas as informações retornadas na consulta ;)
Poderia falar com você ao vivo em algum softer de mensagens,?
Ainda tenho duvida mas agora irei por toda minha cabeça em sua lógica mas quero uma mais leve, que eu possa entender.
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.
???? não entendi não tem haver com minha duvida.
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
} 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
<?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í
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 ;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 :(
Amigo, eu alterei , mas continuo recebendo aquele error lá. Desculpe mas fico ansioso pela sua resposta ai encho sua caixa de entrada rsrsrs
>
faz diferença?
Claro que faz, tá errado, então refaça
Bom eu coloquei to jeito que você mostro na logica láa de cima e continua o mesmo error
Essa parte do código:
if( !in_array( $dados[ 'id' ], $_SESSION[ 'id' ] ) ){
header( 'location: privacy?id=13', true );
não deveria estar cehcando se meu id é igual a alguns dos ids que o mysql pegou?
Tá, vamos pela logica .. no SQL eu vou retornar minha lista de amigos, no qual não inclui 'eu mesmo', eu não posso ser amigo de mim mesmo ..
então, você teria que logar com outro usuário, por outro navegador pra testar, então dá pra resolver no SQL mesmo.
mysql> select * from usuarios;
+-----+--------+------------+
| uid | nome | sobrenome |
+-----+--------+------------+
| 1 | Andrey | Knupp |
| 2 | João | Da Silva |
| 3 | Maria | Dos Santos |
+-----+--------+------------+
3 rows in set (0.09 sec)
mysql> select * from amigos;
+-----+-----+
| uid | fid |
+-----+-----+
| 1 | 2 |
| 1 | 3 |
| 3 | 1 |
| 3 | 2 |
+-----+-----+
4 rows in set (0.00 sec)
Veja a lista acima, na tabela amigo, o uid 1 = 'Andrey' ou seja: 'eu', o uid 3 é outro usuário ..
mysql> select count(*) from amigos inner join usuarios on amigos.fid = usuarios.uid where amigos.uid = 1 and amigos.fid = 3;
+----------+
| count(*) |
+----------+
| 1 |
+----------+
1 row in set (0.01 sec)
Então, vou selecionar nos amigos do 'uid' 1 ou seja: eu, o amigo com id 3, ou seja a pessoa,
deixando mais claro pra você
select count(*) from amigos inner join usuarios on amigos.fid = usuarios.uid where amigos.uid = ID_NA_URL and amigos.fid = VOCÊ;
Então agora basta você contar .. se retornar 1 é que você é amigo, se não retornar nada, e porque não é amigo
<?php
ob_start();
session_start();
$_SESSION[ 'id' ] = $_GET[ 'id' ];
$usuario = $_GET[ 'fid' ];
echo '<pre>';
$PDO = new PDO( 'mysql:host=localhost;dbname=exemplo', 'usuario', 'senha' );
$PDO->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
$query = $PDO->prepare( 'SELECT * FROM `amigos` INNER JOIN `usuarios` ON `amigos`.`fid` = `usuarios`.`uid` WHERE `amigos`.`uid` = :uid AND `amigos`.`fid` = :voce ' );
$query->bindParam( ':uid', $_SESSION[ 'id' ], PDO::PARAM_INT );
$query->bindParam( ':voce', $usuario, PDO::PARAM_STR );
$query->execute();
if( $query->rowCount() != false ){
echo 'Eu sou amigo';
}else{
echo 'Eu não sou amigo';
exit();
}
Na url, eu coloquei:
http://localhost/pagina.php?id=1&fid=1
Saída:
Eu não sou amigo
Mais agora:
http://localhost/pagina.php?id=1&fid=3
Saída:
Eu sou amigo
uid = usuário que você vai verificar se 'me' tem como amigo
fid = você, você pega no SESSION ..
Irei tentar com todas as ajudas e logicas vou ficar o dia inteiro, mas v o consegui!
Aparentemente está funcionando agora so falta eu arrumar tudo, e posto resultados!
Resolvido então ?
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!!!