Wątek przeniesiony 2014-07-09 08:50 z PHP przez dzek69.

Pobieranie danych ze skrzynki odbiorczej

0

Witam,
zrobiłem system wysyłania prywatnych wiadomości. Problem jest z ich pobieraniem. Gdy kliknę na link odnoszący do skrzynki odbiorczej pojawia mi się link(<a href...> do którego pobierany jest temat wiadomości:
http://iv.pl/images/03672929896248383672.png

I teraz nie wiem jak zrobić, żeby po kliknięciu na ten link pobrały się z bazy odpowiednie dane dla tego tematu?

Tak wygląda kod mojego pliku:

<?php

session_start();
if (isset($_SESSION['zalogowany']))
{
	
	include 'zmienne.php';
	session_start();
	include ('inc/sql.php');
	
	
	$data = date('Y-m-d H:i:s');
	
	$ip = $_SERVER['REMOTE_ADDR'];
	
	
	$pobierz_pw = $db->prepare("SELECT `wiadomosc_od`, `temat_pw`, `wiadomosc_pw`, `data_pw` FROM `wiadomosci_pw` WHERE `wiadomosc_do` = :nick_odbiorcy");
	
	$pobierz_pw->bindValue(":nick_odbiorcy", $_SESSION['nick'], PDO::PARAM_STR);
	$pobierz_pw->execute();
	foreach($pobierz_pw as $row_pw)
	{
		echo '<a href = "get_pw_message.php"> Temat: '.$row_pw['temat_pw'].'</a> </br>';
	}
	$pobierz_pw -> closeCursor();
	if(!$pobierz_pw->execute()){
		throw new Exception("Wystąpił błąd podczas pobierania prywatnych wiadomości. Skontaktuj się z programistą aplikacji!");
	}
	
	}else {
	echo('<div class = "red">Błąd: Ta strona dostępna jest tylko dla zalogowanych użytkowników!</div>');
	exit();
}
?>

Mógłby mi ktoś podpowiedzieć coś/poprawić kod lub dać jakiś przykład?? Będę wdzięczny, bo próbuję już to ogarnąć od 2 dni.

0

Jest w stanie mi ktoś pomóc?

0

Nie możesz robić tak:

echo '<a href = "get_pw_message.php"> Temat: '.$row_pw['temat_pw'].'</a> </br>';

Bo niby po czym rozpoznasz, która wiadomość została otworzona?
Przekaż np.ID wiadomości GET'em.

0
<?php
 
session_start();
if (isset($_SESSION['zalogowany']))
{
 
    include 'zmienne.php';
    session_start();
    include ('inc/sql.php');
 
 
    $data = date('Y-m-d H:i:s');
 
    $ip = $_SERVER['REMOTE_ADDR'];
 
    $id = $_GET[id];
 
    $pobierz_pw = $db->prepare("SELECT `wiadomosc_od`, `temat_pw`, `wiadomosc_pw`, `data_pw` FROM `wiadomosci_pw` WHERE `id_pw` = :id_pw");
 
    $pobierz_pw->bindValue(":id_pw", $id, PDO::PARAM_INT);
    $pobierz_pw->execute();
    foreach($pobierz_pw as $row_pw)
    {
        echo '<a href = "get_pw_message.php"> Temat: '.$row_pw['temat_pw'].'</a> </br>';
    }
    $pobierz_pw -> closeCursor();
    if(!$pobierz_pw->execute()){
        throw new Exception("Wystąpił błąd podczas pobierania prywatnych wiadomości. Skontaktuj się z programistą aplikacji!");
    }
 
    }else {
    echo('<div class = "red">Błąd: Ta strona dostępna jest tylko dla zalogowanych użytkowników!</div>');
    exit();
}
?>

Próbowałem już ale z marnym skutkiem. Tak jak wyżej próbuję pobrać(nie ma błędów) ale część z pętli:

 foreach($pobierz_pw as $row_pw)

sięnie wykonuje.

0

W którym momencie PRZEKAZUJESZ id do get_pw_message.php?
Bo że odbierasz to widzę, ale gdzie podajesz?

0

A możesz powiedzieć jak mam to przekazać? Jak by trzeba użyć GET w formularzu to OK, ale w linku? Nie wiem jak. Możesz mi powiedzieć?

0

No pomyśl: a co to jest tak właściwie GET? Wiesz, jak to jest przekazywane i czym różni się od metody POST?

0

POST jest wykonywane po stronie serwera, a GET po stronie przeglądarki? Nie wiem jak przekazywać metodą GET, dlatego piszę ;)

Em... no nie do końca:
POST przekazuje dane bezpośrednio w nagłówkach, tak że nie są one widoczne w linku - przykład użycia to formularze logowania.
GET przekazuje dane właśnie poprzez treść linku - przykład: foo.php?key=value.
Odwołując się ponownie do POST - trochę głupio byłoby tworzyć logowanie w stylu login.php?login=Foo&password=Bar ;) (plus inne kwestie związane z bezpieczeństwem, możesz sobie poczytać na własną rękę)


Więc musisz tak zmodyfikować ten kod: ```php echo ' Temat: '.$row_pw['temat_pw'].' </br>'; ``` Aby `GET`em (w ramach przypomnienia: `adres.php?cośtam=cośtaminnego`) przekazać do `get_pw_message.php` ID wiadomości, o którą prosi użytkownik.

PS $id = $_GET[id]; -> $id = $_GET["id"];.
PPS ale jeszcze wypadałoby sprawdzić, czy $_GET["id"] w ogóle istnieje (można przecież otworzyć skrzynkę i chcieć najpierw zobaczyć wszystkie wiadomości, a nie od razu np.na chama zostać przekierowywanym do pierwszej czy kończyć z fatal errorem/warningiem/hintem/na co tam PHP będzie miało chrapkę. Przyda się isset).

0

Czemu to:

echo '<a href = "get_pw_message.php?id = $id_pw"> Temat: '.$row_pw['temat_pw'].'</a> </br>';

wyświetla mi w efekcie taki link:
http://localhost/strona4/get_pw_message.php?id%20=%20$id_pw
?

0

A gdzie masz zadeklarowane $id_pw? (poza tym wywal tę spację przed oraz po znaku równości.)

0

No w ten sposób:

$id_pw = $_GET["id_pw"];
0

A, no więc pozostał tylko jeden problem: w PHP jest zasadnicza różnica między ' a ". To drugie pozwala na stosowanie takich dziwacznych konstrukcji jak "foo $foo bar", a to pierwsze nie.

0

Ustawiłem tak:

echo '<a href = "get_pw_message.php?id = '.$id_pw.'"> Temat: '.$row_pw['temat_pw'].'</a> </br>';

i w efekcie:

http://localhost/strona4/get_pw_message.php?id%20=

Dlaczego?

0
Patryk27 napisał(a):

(poza tym wywal tę spację przed oraz po znaku równości.)

Tego juz nie zrobiles, wiec nie dziw sie ze tak to wyglada

0

dodoanie spacji przed znakiem powoduje ze przegladarka wtworzy ci znak bezpieczny czyli %20 a to ze po znaku rownosci nie ma nic bo pewnie zmienna $id_pw jest pusta

0
var_dump($id_pw);

zwraca NULL czyli jest pusta. Możesz dać jakiś przykład jak coś takiego zrobić? Bo nie mogę tego za nic ogarnąć.

0

ogolnie teraz na czasie jest to powiedzonko ch... dupa i kamieni kupa. idealnie tu pasuje.

po primo skoro ma to byc link do wiadomosci to jakos musisz ja wyciagac z bazy, na podstawie najlepiej ID. w twoim zapytaniu select nie pytasz o ID nie posadzam cie ze go nie masz w tabeli ( a wtedy jestes w czarnej d...). ale zalozmy ze sie myle i masz to id, wiec w poleceniu Select, o tu:

SELECT `wiadomosc_od`, `temat_pw`, `wiadomosc_pw`, `data_pw` FROM `wiadomosci_pw` WHERE `wiadomosc_do` = :nick_odbiorcy");

dodaj to id, zeby moc sie do niego potem odwolac tak $row_pw['id'], bo to co masz teraz pod $id_pw to bedzie id wyslane getem do tej konkretnej strony i bedzie ono jedno i nijak sie ono bedzie miec do id wiadomosci ktora chcesz wyswietlic. jak juz wyciagniesz id tej wiadomosci to tlko zmien link na taki:

echo '<a href = "get_pw_message.php?id = '.$row_pw['id'].'"> Temat: '.$row_pw['temat_pw'].'</a> </br>';

i bedzie dzialac.

Teoretycznie moglbys ta wiadomosc rozpoznac po czyms innym niz id, np. po temacie, ale wtedy nie moglyby wystapic dwie wiadomosci o tym samym temacie co jest bzdurne, stad bazowanie na ID jest jedynym wyjsciem.

0

Mam w bazie pole id_pw. Lecz z tym jest pewien problem.

$pobierz_pw = $db->prepare("SELECT `wiadomosc_od`, `temat_pw`, `wiadomosc_pw`, `data_pw` FROM `wiadomosci_pw` WHERE `id_pw` = :id_pw");

Nie wyświetla to nic. Chyba dlatego, że przy logowaniu pobieram nick zamiast id. Chcę to wyświetlić na stronie logowania. Da się jakoś połączyć to, żeby pobrało z tabeli z wiadomościami id tych wiadomości i wyświetliło je dla danego nicku?

0

ojj chlopie ciezko z Toba. nie mowilem zebys wyciagal z bazy wiadomosci po ID, ale zebys to ID takze wyciagnal, czyli daj tak:

SELECT  `id_pw`, `wiadomosc_od` ,`temat_pw`, `wiadomosc_pw`, `data_pw` FROM `wiadomosci_pw` WHERE `wiadomosc_do` = :nick_odbiorcy");

i wtedy bedziesz mogl sie do niego odwolac. a where zostaw w spokoju. nikt ci nie kaze go zmieniac

0

Wybierasz na podstawie id użytkownika.

SELECT `id_wiad` FROM `wiadomosci` WHERE `odbiorca` = :user_id

A user_id, czyli id użytkownika zapisujesz w zmiennej sesyjnej podczas logowania. Nickami nie opłaca się posiłkować, bo co jeśli kiedyś będziesz chciał umożliwić użytkownikom ich zmianę ? Wszystko będzie do wywalenia.

0

Całą resztę pomijam, ale dookoła znaku = NIE MOŻE ABSOLUTNIE BYĆ SPACJI!

echo '<a href = "get_pw_message.php?id='.$row_pw['id'].'"> Temat: '.$row_pw['temat_pw'].'</a> </br>'
0

Zrobiłem jak kazaliście:

$id_pw = $_GET["id_pw"];

$pobierz_pw = $db->prepare("SELECT `id_pw`, `wiadomosc_od`, `temat_pw`, `wiadomosc_pw`, `data_pw` FROM `wiadomosci_pw` WHERE `wiadomosc_do` = :nick_odbiorcy");
$pobierz_pw->bindValue(":nick_odbiorcy", $_SESSION['nick'], PDO::PARAM_STR);
$pobierz_pw->execute();

foreach($pobierz_pw as $row_pw)
{
	echo '<a href="get_pw_message.php?id='.$id_pw.'">Temat: '.$row_pw['temat_pw'].'</a> </br>';
}
$pobierz_pw -> closeCursor();
if(!$pobierz_pw->execute()){
	throw new Exception("Wystąpił błąd podczas pobierania prywatnych wiadomości. Skontaktuj się z programistą aplikacji!");
}

i link wygląda tak:
http://localhost/strona4/get_pw_message.php?id=

var_dum($id_pw);

zwraca NULL czyli zmienna jest pusta. Dlaczego tak się dzieje?

PS. Wiem, że ze mną ciężko...

0

Tutaj:

foreach($pobierz_pw as $row_pw)
{
    echo '<a href="get_pw_message.php?id='.$id_pw.'">Temat: '.$row_pw['temat_pw'].'</a> </br>';
}

Musisz przekazywać ID z bazy danych!
Zacznij myśleć, a nie klepać czy - olaboga - programować przez permutacje.

0

http://localhost/strona4/get_pw_message.php?id=3

No rzeczywiście jest link. A jak zrobić, że jak kliknę w ten link to dopiero wtedy włącza się strona z wiadomością? Bo jak na razie wszystko jest "w kupie":

Temat: fffffffffffffffffffffffffffffff

Nadawca: Kerth
Temat: fffffffffffffffffffffffffffffff
Treść: ffffffffffffffffffffff
Otrzymano: 2014-07-08 1554

0

Już pisałem: isset.
A najlepiej to rozdziel to na dwa osobne pliki - jeden wyświetlający skrzynkę, a drugi konkretną wiadomość.

0

Ok, podzieliłem tona 2 pliki jak radzisz.

Plik get_pw_message.php

<?php

session_start();
if (isset($_SESSION['zalogowany']))
{
	
	include 'zmienne.php';
	session_start();
	include ('inc/sql.php');
	
	
	$data = date('Y-m-d H:i:s');
	
	$ip = $_SERVER['REMOTE_ADDR'];
	
	$id_pw = $_GET["id_pw"];
	
	$pobierz_pw = $db->prepare("SELECT `id_pw`, `wiadomosc_od`, `temat_pw`, `wiadomosc_pw`, `data_pw` FROM `wiadomosci_pw` WHERE `wiadomosc_do` = :nick_odbiorcy");

	$pobierz_pw->bindValue(":nick_odbiorcy", $_SESSION['nick'], PDO::PARAM_STR);

	$pobierz_pw->execute();
	
	foreach($pobierz_pw as $row_pw)
	{
		
		
		echo '<a href="get_pw_message_read.php?id='.$row_pw['id_pw'].'">Temat: '.$row_pw['temat_pw'].'</a> </br>';
	}
	$pobierz_pw -> closeCursor();
	if(!$pobierz_pw->execute()){
		throw new Exception("Wystąpił błąd podczas pobierania prywatnych wiadomości. Skontaktuj się z programistą aplikacji!");
	}
	
	$pobierz_liczba_pw = $db->prepare("SELECT COUNT(`przeczytane_pw`) AS ilosc FROM `wiadomosci_pw` WHERE `wiadomosc_do` = :nick_odbiorcy");
	$pobierz_liczba_pw->bindValue(":nick_odbiorcy", $_SESSION['nick'], PDO::PARAM_STR);
	
	if(!$pobierz_liczba_pw->execute()){
		throw new Exception("Błąd zapytania");
	}
	foreach($pobierz_liczba_pw as $row_stats)
	{
		echo "Liczba wiadomości: \t";
		echo '<span class = "orange">'.$row_stats['ilosc'].'</span></br>';
		if($powierz_liczba_pw == 0)
		{
			echo '<div class = "gray">Nie masz wiadomości do przeczytania.</div>';
		}
	}
	$pobierz_liczba_pw -> closeCursor();
	
	}else {
	echo('<div class = "red">Błąd: Ta strona dostępna jest tylko dla zalogowanych użytkowników!</div>');
	exit();
}
?>
<?php

session_start();
if (isset($_SESSION['zalogowany']))
{
	
	session_start();
	include ('inc/sql.php');
	$pobierz_pw = $db->prepare("SELECT `id_pw`, `wiadomosc_od`, `temat_pw`, `wiadomosc_pw`, `data_pw` FROM `wiadomosci_pw` WHERE `wiadomosc_do` = :nick_odbiorcy");
	$pobierz_pw->bindValue(":nick_odbiorcy", $_SESSION['nick'], PDO::PARAM_STR);
	$pobierz_pw->execute();
	$pobierz_pw -> closeCursor();
	if(!$pobierz_pw->execute()){
		throw new Exception("Wystąpił błąd podczas pobierania prywatnych wiadomości. Skontaktuj się z programistą aplikacji!");
	}
	foreach($pobierz_pw as $row_pw)
	{
		
		echo "</br>Nadawca: \t";
		echo('<span class = "lightgreen">');
		echo ''.$row_pw['wiadomosc_od'].'</br>' ;
		echo('</span>');
		
		echo "Temat: \t";
		echo('<span class = "lightgreen">');
		echo ''.$row_pw['temat_pw'].'</br>';
		echo('</span>');
		
		echo "Treść: \t";
		echo('<span class = "lightgreen">');
		echo ''.$row_pw['wiadomosc_pw'].'</br>';
		echo('</span>');
		
		echo "Otrzymano: \t";
		echo('<span class = "lightgreen">');
		echo ''.$row_pw['data_pw'].'</br>';
		echo('</span>');
		echo '________________________________</br>';
		
		
	}
	}else {
	echo('<div class = "red">Błąd: Ta strona dostępna jest tylko dla zalogowanych użytkowników!</div>');
	exit();
}
?>

i teraz tak. Takie mam przykładowe wiadomości wysłane z innego konta gracza. Temat pobiera się OK, link też OK. http://iv.pl/images/61714620023785014543.png
Lecz problem jest teraz w wyświetlaniu ich w pliku get_pw_message_read.php.
Gdy kliknę w pierwszy temat ze screena link wygląda tak: http://localhost/strona4/get_pw_message_read.php?id=1 - czyli jest OK
Ale gdy włączy się ten plik to w ten sposób pobiera wiadomości: http://iv.pl/images/93782972772677587197.png.
Tak samo dzieje się gdy kliknę drugi temat.
PS. Próbowałem z LIMIT 1 ale potem wyświetla się tylko 1 i ta sama wiadomość. Co zrobić?

1

Po co Ci tam foreach w tym drugim pliku?
Przecież masz pobrać i wyświetlić jedną wiadomość o konkretnym ID (które masz przekazane w parametrze), a nie wszystkie.

0

Plik get_pw_message.php

<?php

session_start();
if (isset($_SESSION['zalogowany']))
{
	
	include 'zmienne.php';
	session_start();
	include ('inc/sql.php');
	
	
	$data = date('Y-m-d H:i:s');
	
	$ip = $_SERVER['REMOTE_ADDR'];
	
	$id_pw = $_GET["id_pw"];
	
	$pobierz_pw = $db->prepare("SELECT `id_pw`, `wiadomosc_od`, `temat_pw`, `wiadomosc_pw`, `data_pw` FROM `wiadomosci_pw` WHERE `wiadomosc_do` = :nick_odbiorcy");

	$pobierz_pw->bindValue(":nick_odbiorcy", $_SESSION['nick'], PDO::PARAM_STR);

	$pobierz_pw->execute();
	
	foreach($pobierz_pw as $row_pw)
	{
		echo '<a href="get_pw_message_read.php?id_pw='.$row_pw['id_pw'].'">Temat: '.$row_pw['temat_pw'].'</a> </br>';
	}
	$pobierz_pw -> closeCursor();
	if(!$pobierz_pw->execute()){
		throw new Exception("Wystąpił błąd podczas pobierania prywatnych wiadomości. Skontaktuj się z programistą aplikacji!");
	}
	
	$pobierz_liczba_pw = $db->prepare("SELECT COUNT(`przeczytane_pw`) AS ilosc FROM `wiadomosci_pw` WHERE `wiadomosc_do` = :nick_odbiorcy");
	$pobierz_liczba_pw->bindValue(":nick_odbiorcy", $_SESSION['nick'], PDO::PARAM_STR);
	
	if(!$pobierz_liczba_pw->execute()){
		throw new Exception("Błąd zapytania");
	}
	foreach($pobierz_liczba_pw as $row_stats)
	{
		echo "Liczba wiadomości: \t";
		echo '<span class = "orange">'.$row_stats['ilosc'].'</span></br>';
		if($powierz_liczba_pw == 0)
		{
			echo '<div class = "gray">Nie masz wiadomości do przeczytania.</div>';
		}
	}
	$pobierz_liczba_pw -> closeCursor();
	
	}else {
	echo('<div class = "red">Błąd: Ta strona dostępna jest tylko dla zalogowanych użytkowników!</div>');
	exit();
}
?>
<?php

session_start();
if (isset($_SESSION['zalogowany']))
{
	
	session_start();
	include ('inc/sql.php');
	$pobierz_pw = $db->prepare("SELECT `id_pw`, `wiadomosc_od`, `temat_pw`, `wiadomosc_pw`, `data_pw` FROM `wiadomosci_pw` WHERE `wiadomosc_do` = :nick_odbiorcy");
	$pobierz_pw->bindValue(":nick_odbiorcy", $_SESSION['nick'], PDO::PARAM_STR);
	$pobierz_pw->execute();
	$pobierz_pw -> closeCursor();
	if(!$pobierz_pw->execute()){
		throw new Exception("Wystąpił błąd podczas pobierania prywatnych wiadomości. Skontaktuj się z programistą aplikacji!");
	}
	foreach($pobierz_pw as $row_pw)
	{
		
		echo "</br>Nadawca: \t";
		echo('<span class = "lightgreen">');
		echo ''.$row_pw['wiadomosc_od'].'</br>' ;
		echo('</span>');
		
		echo "Temat: \t";
		echo('<span class = "lightgreen">');
		echo ''.$row_pw['temat_pw'].'</br>';
		echo('</span>');
		
		echo "Treść: \t";
		echo('<span class = "lightgreen">');
		echo ''.$row_pw['wiadomosc_pw'].'</br>';
		echo('</span>');
		
		echo "Otrzymano: \t";
		echo('<span class = "lightgreen">');
		echo ''.$row_pw['data_pw'].'</br>';
		echo('</span>');
		echo '________________________________</br>';
		
		
	}
	}else {
	echo('<div class = "red">Błąd: Ta strona dostępna jest tylko dla zalogowanych użytkowników!</div>');
	exit();
}
?>
0

Wytłumacz mi, proszę, po co chcesz w pliku get_pw_message.php, który ma wyświetlać wszystkie wiadomości, wczytywać jakiekolwiek ID do zmiennej? ($id_pw = $_GET["id_pw"];)
To powinieneś robić w tym drugim...

Ech, może jednak zabierz się na początek za pisanie czegoś prostszego...

0

Zarówno z tym kodem:

$id_pw = $_GET["id_pw"];

jak i bez niego, problem jest ten sam(również jak dodam go do drugiego pliku)

1 użytkowników online, w tym zalogowanych: 0, gości: 1