[php+MySQL] zapytanie do bazy

Języki, których efekty są wykonywane po stronie serwera. PHP, ASP czy CGI w połączeniu z bazami danych SQL dają niezwykłe możliwości budowy i zarządzania stron WWW. Tu zadajemy pytania oraz demonstrujemy kod, z którym mamy problem.
AO
Posty: 17
Rejestracja: ndz mar 02, 2003 11:17 am

[php+MySQL] zapytanie do bazy

Post autor: AO »

Witajcie!
Powiedzcie, dlaczego ten kod nie działa?

Kod: Zaznacz cały

$zapytanie="SELECT 
 CONCAT(`autorzy.imie`, ' ', `autorzy.nazwisko`) AS `autor`,
 `teksty.tytul`,
 `teksty.tekst_id`, 
 `teksty.typ_publikacji_id`,
 `autorzy.autor_id`,
 `powiazania.tekst_id`, 
 `powiazania.autor_id`,
 `typy_publikacji.typ_publikacji_id`
 FROM `powiazania`, `autorzy`, `teksty`, `typy_publikacji`
WHERE 
 `teksty.tekst_id` = `powiazania.tekst_id`
 && `autorzy.autor_id` = `powiazania.autor_id`
 && `typy_publikacji.typ_publikacji_id` = `teksty.typ_publikacji_id` ";


$wynik=mysql_query($zapytanie);
$rekord=mysql_fetch_array($wynik);

$id_tekstu = $rekord['tekst_id'];
$autor = $rekord['autor'];

 if ($id_tekstu=='3')
	
	echo $autor;
Chcę wyświetlić wszystkich autorów, dla których id tekstu jest równe (przykładowo) 3.
Nic się jednak nie wyświetla. Czemu?

Pozdrawiam niedzielnie.
Ania
Wojciech Jurewicz
Przelotem
Przelotem
Posty: 274
Rejestracja: wt lip 22, 2003 11:29 pm
Lokalizacja: Mazury
Kontakt:

Re: [php+MySQL] zapytanie do bazy

Post autor: Wojciech Jurewicz »

Troche ten kod nie wyraźny. Napisz jaką masz strukturę tabeli i co chcesz z niej wyciągnąć, wtedy postaram sie pomóc. Nie wiem po co aż tak rozbudowane zapytanie, powinno wystarczyć:

Kod: Zaznacz cały

SELECT * FROM tabela WHERE id=3;
Ale jeżeli to nie to, to napisz to o co prosiłem wtedy postaram sie pomóc.
the_foe
Przelotem
Przelotem
Posty: 295
Rejestracja: pt sty 31, 2003 12:53 pm
Lokalizacja: Wałbrzych
Kontakt:

Re: [php+MySQL] zapytanie do bazy

Post autor: the_foe »

pisze od fragmentu w ktorym jest blad:

Kod: Zaznacz cały

 while ($rekord=mysql_fetch_array($wynik)){ 

$id_tekstu = $rekord['tekst_id']; 
$autor = $rekord['autor']; 

if ($id_tekstu=='3') {

echo "$autor<br>"; }
}

wynik bedzie w slupku, oczywiscie jesli bedziesz na tyle madry ;) by wziac po uwage sluszna rade przedmowcy to powyzszy fragment skurczy sie do:

Kod: Zaznacz cały

while ($rekord=mysql_fetch_array($wynik)){ 

$autor = $rekord['autor']; 

echo "$autor<br>"; 
}
AO
Posty: 17
Rejestracja: ndz mar 02, 2003 11:17 am

to wobec tego trochę szerzej :-)

Post autor: AO »

Przede wszystkim dziekuję za odzew!

To zapytanie dlatego takie złozone, bowiem nie jest to jedna tabela, ale cztery tabele powiązane relacyjnie. Inaczej się nie dało wyjść z relacji wiele-do-wielu: jeden autor może mieć kilka tekstów, ale i jeden tekst może mieć kilku współautorów.

Oto struktura tych tabel:

Kod: Zaznacz cały

TABLE autorzy 

autor_id SMALLINT(4) UNSIGNED NOT NULL AUTO_INCREMENT, 
imie CHAR(20) default NULL , 
nazwisko CHAR (30) default NULL , 
adres CHAR (50) default NULL , 
email CHAR (30) default NULL , 
oficjalki_nt_autora TEXT default NULL , 
data_wpisu DATE default NULL , 
PRIMARY KEY (autor_id), 
INDEX autor (nazwisko, imie) 


TABLE teksty 

tekst_id SMALLINT(4) UNSIGNED NOT NULL AUTO_INCREMENT, 
tytul CHAR (100) default NULL, 
typ_publikacji_id SMALLINT(1) default NULL, 
link CHAR (20) default NULL, 
data_tekstu DATE default NULL, 
data_oswiadczenia DATE default NULL, 
data_publikacji DATE default NULL, 
data_zaswiadczenia DATE default NULL, 
oficjalki_nt_tekstu TEXT default NULL, 
wewn_uwagi_publikacyjne TEXT default NULL, 
data_wpisu DATE default NULL, 
PRIMARY KEY (tekst_id), 
INDEX (tytul) 


TABLE powiazania 

powiazania_id SMALLINT(4) UNSIGNED NOT NULL AUTO_INCREMENT, 
autor_id SMALLINT(4) default NULL , 
tekst_id SMALLINT(4) default NULL , 
PRIMARY KEY (powiazania_id) 


TABLE typy_publikacji 

typ_publikacji_id SMALLINT(1) UNSIGNED NOT NULL AUTO_INCREMENT, 
nazwa CHAR (25), 
PRIMARY KEY (typ_publikacji_id) 

Ja chciałabym, podając wartość pola teksty.tekst_id , wyświetlić wszystkich autorów, którzy przypisani są (w tabeli POWIAZANIA) do tej wartości tekst_id (powiazania.tekst_id).

Na przykład tak:

W jednej komórce wyświetlanej tabeli:
Anna Ostrowska,
Jan Nowak,
Adam Kowalski

A w sąsiedniej komórce tytuł ich wspólnej pracy: O obrotach sfer niebieskich :-)

Pozdrawiam serdecznie

Anna Ostrowska
Wojciech Jurewicz
Przelotem
Przelotem
Posty: 274
Rejestracja: wt lip 22, 2003 11:29 pm
Lokalizacja: Mazury
Kontakt:

Re: [php+MySQL] zapytanie do bazy

Post autor: Wojciech Jurewicz »

W kodzie który mi pani podesłała znalazłem błąd który był przyczyną tych ukośników. W linii 127 jest kod:

Kod: Zaznacz cały

echo '<a href=chron.php?s=' . (($display_number * ($i - 1))) . '&np=' . $num_pages . '">' . $i . '</a> ' ;
Brakuje cudzysłowu na początku. Powinno być tak:

Kod: Zaznacz cały

echo '<a href=[b]"[/b]chron.php?s=' . (($display_number * ($i - 1))) . '&np=' . $num_pages . '">' . $i . '</a> ' ;
Jeżeli chodzi o drugi problem, to jest troche gorzej. Trzeba by zmienic skrypt lub strukturę bazy danych. Skrypt jest napisany w taki sposób że selekcja rekordów odbywa sie z poziomu bazy danych a nie skryptu, w takim wypadku nie da się w żaden sposób segregować danych.
AO
Posty: 17
Rejestracja: ndz mar 02, 2003 11:17 am

o!

Post autor: AO »

Rzeczywiście teraz działa, cu-dow-nie :-)

A nad przerobieniem skryptu pracuję. Znalazłam pewne wskazówki w biblii.
Pewnie się tu znowu zjawię z nowymi wątpliwościami :-)))

A co do pani, to w necie jestem Ania. Tak prościej :-)

Pozdrawiam i serdecznie dziękuję!
Krzysztof Aszkiełowicz
Zaczyna działać
Zaczyna działać
Posty: 458
Rejestracja: pn maja 26, 2003 9:29 pm
Lokalizacja: Warszawa
Kontakt:

Re: [php+MySQL] zapytanie do bazy

Post autor: Krzysztof Aszkiełowicz »

Jak zauważyłem to Wojtek prawie do wszytskich zwraca sie per Pan/Pani.
Poprostu wychowany człowiek, ale net to net :)
AO
Posty: 17
Rejestracja: ndz mar 02, 2003 11:17 am

resultat

Post autor: AO »

Oboje jestecie mili :-)

A ja zrobiłam ten skrypt i w zasadzie działa.

Kod: Zaznacz cały

FROM  autorzy, powiazania, teksty, typy_publikacji
WHERE autorzy.autor_id = powiazania.autor_id AND
teksty.tekst_id = powiazania.tekst_id AND
typy_publikacji.typ_publikacji_id = teksty.typ_publikacji_id
ORDER BY nazwisko, tytul";

$result_id = mysql_query($query, $link) OR die(mysql_error($query));
  
print("<TABLE BORDER=1><TR>\n");
print("<TH>Autor</TH><TH>Tytuł</TH></TR>");
print("<TR><TD>\n");

$old_autor_id = 0; 
 
while ($row_array = mysql_fetch_array($result_id))
{
	$autor_id = $row_array[autor_id];
      
	if ($autor_id != $old_autor_id)
	{          
        $autor = $row_array[autor];
          
        	if ($old_autor_id != 0)
            		print("</TD></TR>\n");          
          		print("<TR ALIGN=LEFT VALIGN=TOP>");         
          		print("<TD>$autor</TD><TD>");         
        $old_autor_id = $autor_id;
        }
       
	$tytul = $row_array[tytul];
	print("$tytul<BR>");
}  
print("</TD></TR></TABLE>");
Jeśli mówię, że "w zasadzie" to dlatego, że wyświetlają mi sie ślicznie autorzy a przy nich wszystkie ich prace(tytuły).

Ale czy jestem zmęczona, czy miałam więcej szczęścia niż... ale nie potrafię skryptu przeredagować tak, aby otrzymać jeden tytuł a do niego wszystkich autorów.
chociaż mi wstyd :oops: , bo wiem, że naduzywam może waszej uprzejmości to jednak proszę, pokażcie mi jak , dobra?

Ania
Wojciech Jurewicz
Przelotem
Przelotem
Posty: 274
Rejestracja: wt lip 22, 2003 11:29 pm
Lokalizacja: Mazury
Kontakt:

Re: [php+MySQL] zapytanie do bazy

Post autor: Wojciech Jurewicz »

... ale nie ma potrzeby, widzę że się znasz, więc dasz sobie radę, tylko cię naprowadzę... :-D

Myślę że powinnaś w tabeli z artykułami dodać jedno pole, w którym będziesz przechowywała id wszystkich autorów tego działa czy jak tam. Przy wykonaniu skryptu ładujesz wszystkich autorów do tablicy kolejno tak jak ich id (w kluczah). A przy odpowiednim artykule odpowiedni autor.
ODPOWIEDZ