[PHP][MYSQL]System dodawania znajomych, problem z warunkiem zapytania


(batmomobil) #1

Witam usiłuje zrobić system dodawania użytkowników,mam problem ze sprawdzeniem czy istnieje dana para użytkowników w bazie,jakie będzie zapytanie i warunek???Ponieważ zle sprawdzam,bo jak inny użytkownik wysłać zaproszenie,a jak już istnieje ten użytkownik w wierszu zaproszony to nie można wysłać do niego zaproszenie.

CREATE TABLE IF NOT EXISTS `muz_znajomosci` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `zaakceptowane` text,
  `zaproszony` text,
  `zapraszajacy` text,
  `data` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  UNIQUE KEY `id` (`id`),
  KEY `id_2` (`id`),
  KEY `id_3` (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=6 ;

--
-- Zrzut danych tabeli `muz_znajomosci`
--

INSERT INTO `muz_znajomosci` (`id`, `zaakceptowane`, `zaproszony`, `zapraszajacy`, `data`) VALUES
(1, 'nie', 'batman', 'admin', '2014-02-23 15:27:34'),
(2, 'nie', 'kamil12', 'admin', '2014-02-23 15:30:20'),
(3, 'nie', 'skkf', 'admin', '2014-02-23 15:32:21'),
(4, 'nie', 'solano', 'admin', '2014-02-23 15:32:46'),
(5, 'nie', 'admin', 'batman', '2014-02-23 15:33:23');

$query1 = "SELECT `zaproszony`, `zapraszajacy` FROM `".prefix."znajomosci` WHERE `zapraszajacy`='".$login."' AND `zaproszony`='".$_SESSION['login']."'"; polacz(); $zapytanie = mysql_query($query1);
	 if(!$zapytanie)
	 {
	 
		 echo 'Nie udało się pobrać wiadomości. Wystąpił problem z bazą danych';
	 
	 }
	 
	 $ile = mysql_num_rows($zapytanie);
	 
	 if($ile == 0)
	 {
	 
		 echo 'już zaprosiłeś';
	 
	 }
else {

(bolivar) #2

Jeżeli $ile==0 to znaczy, że nie masz wierszy z danym warunkiem, czyli nie ma zaproszonych. Zmień na $ile!=0.


(batmomobil) #3

próbowałem ale teraz można wysyłać klika razy do tego samego użytkownika.Jak to zmienić aby można było by wysłać zaproszenie tylko raz do jednego użytkownika.Sprawdzić czy takie zaproszenie istnieje??


(ra-v) #4

A nie powinno być czasem 

if(!$zapytanie)
{
  echo 'Nie udało się pobrać wiadomości. Wystąpił problem z bazą danych';
}
else
{
  $ile = mysql_num_rows($zapytanie);
  if($ile > 0)
  {
    echo 'już zaprosiłeś';
  } 
  else
  {
    // dodaj do listy zaproszonych
  }
}

??


(batmomobil) #5

Zmieniłem tak jak sugerowałeś i nic to nie daje,ponieważ można nadal dodawać tego samego użytkownika kilka razy.Może to wina struktury bazy? ???Nie mam pojęcia,próbuję na różne sposoby i nic.Może ma ktoś jakiś pomysł jak to zrobić aby można było wysyłać tylko raz do jednej osoby? ???

$query1 = "SELECT * FROM `".prefix."znajomosci` WHERE `zapraszajacy`='".$login."' AND `zaproszony`='".$twoj_nick."'"; polacz(); $zapytanie = mysql_query($query1);
if(!$zapytanie)
	 {
	  echo 'Nie udało się pobrać wiadomości. Wystąpił problem z bazą danych';
	 
	 }
	$ile = mysql_num_rows($zapytanie);
	 
if($ile > 0)
	 {
	 
	echo 'już zaprosiłeś';
	 
	 }
else {

$query1 = "SELECT * FROM `".prefix."znajomosci` WHERE `zapraszajacy`='".$login."' AND `zaproszony`='".$twoj_nick."'"; 																																																												
 $row= mysql_query(mysql_fetch_assoc($query1));         
if (($row['zapraszajacy'] && $row['zaproszony'])>0){
     echo 'już zaprosiłeś';
     }
else {

Próbowałem jeszcze taki warunek i nic.


(ra-v) #6

Idea którą opisałem jest ok.  

W pierwszym warunku sprawdzasz czy wynik zapytania jest błedny, w ELSE sprawdza się ilość rekordów… Jeśli jest większa od 0, co by oznaczało że taki wynik jest w bazie danych to wyświetla komunikat. W przeciwnym wypadku dodaje pierwszy rekord o podanych nickach (zapraszającego i zapraszanego)

 

Wg mnie zapytanie jest skaszanione - ale nie wiem czy SELECT czy INSERT.

Zobacz jak ono wygląda w realu - wpisz echo “<pre>$query1</pre>”;

Dodatkowo w miejscu “// dodaj do listy zaproszonych” zobacz, czy wszytko się dodaje jak trzeba (czyli czy tu zapytanie wygląda poprawnie).


(batmomobil) #7

Sprawdziłem var_dump($zapytanie); i wywaliło taki komunikat resource(50) of type (mysql result).Próbowałem zapytaniem w bazie sql

SELECT *
FROM `muz_znajomosci`
WHERE `zapraszajacy` = 'batman'
AND `zaproszony` = 'admin'
LIMIT 1

i wyszukuje wiersz,to co jest nie tak,że na stronie nie działa???INSERT dane do bazy zapisuje.

Oto  cały kod:

function polec_usera()
{
	 $id = $_GET['id'];
	 $login = $_GET['login'];
	 $twoj_nick=$_SESSION['login'];																																													
	 if(empty($id) || empty($login))
	 {
		 echo 'Nie wybrałeś użytkownika do polecenia';
	 }
	 else
	 { 
$zapytanie = "SELECT * FROM `".prefix."znajomosci` WHERE `zapraszajacy`='".$twoj_nick."' AND `zaproszony`='".$login."'LIMIT 1"; polacz(); if(!$zapytanie)
	 {
	  echo 'Nie udało się pobrać wiadomości. Wystąpił problem z bazą danych';
	 
	 }
	$ile = mysql_num_rows($zapytanie);
	 
if($ile > 0)
	 {
	echo 'już zaprosiłeś';
	 
	 }
else { $zapytanie = "SELECT `id`,`login`,`haslo`,`email` FROM `".prefix."uzytkownicy` WHERE `id`='".$id."'";
$zapytanie = mysql_query($zapytanie);
if(!$zapytanie)
	{
	echo 'err';
	}
	while($row=@mysql_fetch_row($zapytanie))
	{
	$id_u = $row[0];
	$do_kogo = $row[1]; $haslo = $row[2]; $email = $row[3]; $tytul = 'Witaj '.$do_kogo.' dodaj::::'.$twoj_nick.'';
$link_wiadomosc = '<p><b>Dodaj użytkownika <a href="index.php?strona=profil&id='.$id.'">'.$twoj_nick.'</a></p>';
$tresc= 'Witaj('.$do_kogo.'),jeżeli znasz użytkownika('.$twoj_nick.')to kliknij link powyżej i dodaj do znajomych!!'; $tytul = base64_encode($tytul);
$tresc = base64_encode($tresc); $akcept="nie"; $imie = $_SESSION['imie']; $nazwisko = $_SESSION['nazwisko']; $emailing = $_SESSION['email']; $id_kogo = $_SESSION['id_usera'];
$zapytanie1 = "INSERT INTO `".prefix."wiadomosci`(`id`,`imie`,`nazwisko`,`obrazek`,`tytul`, `tresc`,`link`, `od_kogo`, `do_kogo`)
VALUES(
			 '', '".$imie."', '".$nazwisko."', '".$avatarek."',
'".$tytul."', 
'".$tresc."', '".$link_wiadomosc."',
'".$twoj_nick."', 
'".$do_kogo."'																																																									
	)
	"; $zapytanie2 = "INSERT INTO `".prefix."znajomosci`(`id`, `zaakceptowane`, `zaproszony`, `zapraszajacy`)
VALUES(
'',
'".$akcept."', 
'".$do_kogo."', 
'".$twoj_nick."'				
)"; polacz();			
 $wynik1 = mysql_query($zapytanie1); 
$wynik2 = mysql_query($zapytanie2); 
if($wynik1 and $wynik2)
	{ 
	 echo 'Wysłałeś zaproszenie do użytkownika:::'.$do_kogo.':::'; }																													
	else
		 {
	echo 'Już wysłałeś zaproszenie do tego użytkownika';
		 }
		
		 rozlacz();
	 }
}	}	}

(ra-v) #8

Baza danych

Zauważyłem, że w bazie niepotrzebnie masz 3 indeksy na ID. Dla ID powinien być indeks PRIMARY KEY, a dla zaproszony i zapraszajacy indeks UNIQUE.

 

Kod:

Na górze masz 

$id = $_GET[‘id’];

$login = $_GET[‘login’];

Z czego $login będzie zawsze pusty, a $id nie. Dlatego przykładowe zapytanie będzie zawsze wyglądało jak niżej.

SELECT * FROM ` ___PREFIX_TABELI____ znajomosci` WHERE `zapraszajacy`=' ___TWOJ_NICK_Z_$_SESSION___' AND `zaproszony`='' LIMIT 1

A takiego rekordu z pustym polem zaproszony nie znajduje, więc dodaje kolejny wpis, i tak w kółko jak opisywałeś.

 

 

Rozwiązanie:

Wg mnie do zmiennej $login musisz przypisać wynik zapytania wg schematu SELECT login FROM …znajomości WHERE id=$id

 

Lepsze rozwiązanie:

Osobiście wolałbym powiązania zaproszonych i zapraszających zrobić na ID a nie na LOGIN - ale to Twój wybór.


(batmomobil) #9

Próbowałem nałożyć na kolumnę UNIQUE KEY,ale nie może być ponieważ jeśli już istnieje w bazie dany użytkownik raz nie można dodać już innych.Zmieniłem więc strukturę tabeli i nałożyłem index KEY na kolumny id_uzytk i id_kogo.Zmieniłem też kod sprawdzający:

$zapytanie1 = "SELECT * FROM `".prefix."znajomosci` WHERE `id_uzytk`='".$id_kogo."' and `id_kogo`='".$id."' LIMIT 1";$zapytanie2 = "SELECT * FROM `".prefix."znajomosci` WHERE `id_kogo`='".$id_kogo."' and `id_uzytk`='".$id."' LIMIT 1"; polacz();
$zapyt1 = mysql_query($zapytanie1); $zapyt2 = mysql_query($zapytanie2);
if ( mysql_num_rows($zapyt1) > 0 || mysql_num_rows($zapyt2) > 0)
{
echo 'Juz zaprosiłeś lub zostałes zaproszony';
} else {

Testuje i chyba działa dobrze,dziękuję za pomoc :slight_smile: