Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php][mysql] dwa pytania
Forum PHP.pl > Forum > Przedszkole
SeBa_
To mój pierwszy kod na tym forum. Witam wszystkich.



Mam kilka pytań.

Mam kod php, w którym łącze się z bazą MsSQL, następnie wynik potrzebuję wyświetlić.
I teraz, chciałbym aby cała część związana z połączeniem z serwerem bazy, z wyborem bazy umieścić w osobnym pliku i tylko dołączać go do głównego (include)

Powodem oddzielenia jest iż chcę aby projekt był uniwersalny i w razie potrzeby zmiany typu serwera (np. na MySQL itp..) zmienić tylko kod w pliku zawierającym dane nt. połączenia.



Wszystko by było fajnie, tylko co zrobić z funkcją mssql_fetch_array questionmark.gif jeśli ją zostawię w pliku głównym, to jeśli będzie trzeba zmienić typ serwera baz, to nie obejdzie się jedynie na modyfikacji connection. Trzeba będzie również edytować główny plik.

Czy da się to jakoś zmienić questionmark.gif np. jak poniżej questionmark.gif

Tak wygląda to teraz:

  1. <?php
  2. // plik connection
  3.  
  4. $linkMssql =mssql_connect('DELLSQLEXPRESS','login',&#8217;pass'); 
  5.  
  6. mssql_select_db('SEBA', $linkMssql); 
  7.  
  8. $zapytanie = "SELECT id,txt FROM Tytul"; 
  9.  
  10. $wynik = mssql_query($zapytanie,$linkMssql); 
  11.  
  12. $wiersz = mssql_fetch_array($wynik, MSSQL_ASSOC); 
  13.  
  14. // koniec connection
  15.  
  16.  
  17.  
  18. // główny kod
  19.  
  20. print "<TABLE CELLPADDING=5 BORDER=1>";
  21.  
  22. print "<TR><TD><B>Lp.</B></TD><TD><B>Tytuł</B></TD></TR>\n";
  23.  
  24. while ($wiersz = mssql_fetch_array($wynik, MSSQL_ASSOC))
  25.  
  26. {
  27.  
  28. $id = $wiersz['id'];
  29.  
  30. $tytul = $wiersz['txt'];
  31.  
  32. echo "<TR><TD>$id</TD><TD><ul><li><ahref='index.php?Index=$id'>$tytul</a></li></ul> </TD></TR>\n";
  33.  
  34. } 
  35. print "</TABLE>";
  36.  
  37. // koniec
  38. ?>




Moja propozycja, która jednak nie działa.



  1. <?php
  2. // to wszystko co było w poprzednim pliku connection, oraz te dwie linie:
  3.  
  4. $iloscWierszy =mssql_num_rows( $wynik );
  5.  
  6. while ($wiersz = mssql_fetch_array($wynik, MSSQL_ASSOC));
  7.  
  8. // koniec connection
  9.  
  10.  
  11.  
  12. //główny kod
  13.  
  14. print "<TABLE CELLPADDING=5 BORDER=1>";
  15.  
  16. print "<TR><TD><B>Lp.</B></TD><TD><B>Tytuł</B></TD></TR>\n";
  17.  
  18. for ($i = 0; $i < $iloscWierszy; ++$i) 
  19.  
  20. {
  21.  
  22. $id = $wiersz[$i]['id'];
  23.  
  24. $tytul = $wiersz[$i]['txt'];
  25.  
  26. echo "<TR><TD>$id</TD><TD> <ul><li><a href='index.php?Index=$id'>$tytul</a></li></ul> </TD></TR>\n";
  27.  
  28. } 
  29. print "</TABLE>";
  30. ?>



Drugie moje pytanie.

  1. <?php
  2. <a href='index.php?Index=$id'>$tytul</a>
  3. ?>


z danych uzyskanych z bazy, tworze linki. Czy jest jakiś sposób, aby używać metody POST, zamiast jak tutaj GET questionmark.gif
Pozdrawiam
PawelC
Ad.1 Wrzuć cały kod odpowiedzialny za połączenie z bazą, i tą mssql_fetch_array też, i includuje plik. W przyszłości tylko zmienisz w jednym pliku wszystko. Albo poprostu tą linie z mssql_fetch_array wrzuć do osobnego pliku i includuj.

Ad.2 Niema takie możliwości, a dlaczego niechcesz używać metody GET?
Metodą post możesz jedynie odbierać dane od użytkownika.

Wstaw kod w odpowiedni tag, bo tak jak jest ledwo widać.
MMPrime
Proponuję użyć PDO do łączenia się z bazą danych, tam każda baza danych jest dostępna spod jednych metod. Zawsze jest to query i exec, w zależności od rodzaju zapytania.

Co do przesyłania danych POSTem zamiast GET'em to owszem jest taka możliwość, zamiast linku musisz użyć po prostu małego formularza z jednym ukrytym polem(id) i jednym przyciskiem(submit)
SeBa_
Cytat
dlaczego niechcesz używać metody GET?


Ze względu na estetykę, uważam iż tak wykonana strona, wygląda lepiej. Na drugim miejcu jest chcęć utrudnienia analizy, jak działa strona którą piszę, oraz po części ochrona przed SQL Injection.

Cytat
Albo poprostu tą linie z mssql_fetch_array wrzuć do osobnego pliku i includuj.


Nie mogę wrzucić mssql_fetch_array, do pliku connection, ponieważ ta funkcja jest wykorzystywana do wyświetlenia danych na stronie, a ja wszystkie funkcje związane z wyglądam, wyświetlaniem chcę mieć w jednym pliku, a funkcję związane z połączeniem w drugim.

Hmmm mógłbym tak zrobić, że zostawiam samo

while ($wiersz = mssql_fetch_array($wynik, MSSQL_ASSOC)) , a resztę pętli ( czyli to wszystko co jest między "{}" ) dać w głównym pliku, później plik connection odpowiedno includować, tak żeby kod zlewał się w jedną całość. Jednak uważam to za mało estetyczne rozwiązanie, tu część pętli, tu część... nie brzmi to dobrze. Również trzeba by było uważać w którym miejscu daje się include

Cytat
Proponuję użyć PDO


Nie ma takiej możliwości, nie chcę używać tej metody, ponieważ musiał bym dodatkowo konfigurować serwer na którym ma to działać, a jednym z założenia projektu jest aby ograniczyć do minimum modyfikacje na serwerze na którym będzie to wdrożone.
PawelC
Cytat
Ze względu na estetykę, uważam iż tak wykonana strona, wygląda lepiej. Na drugim miejcu jest chcęć utrudnienia analizy, jak działa strona którą piszę, oraz po części ochrona przed SQL Injection.

Ale po co ktoś miałby analizować Twoją stronę, kodu php nie zobaczy, jedynie wynik jego wykonania. A co do sql injection wystarczy przefiltrować to co dodajesz/pobierasz z bazy i po kłopocie.
Cytat
Ze względu na estetykę, uważam iż tak wykonana strona, wygląda lepiej.

A słyszałeś o mod_rewrite? Użyj to i będziesz miał ładne i przyjazne linki. Przykładowo masz link np artykul.php?id=1 to w mod_rewrite możesz sobie zrobić aby link wyglądał tak: artykul/1/ lub po prostu tytuł artykułu w linku czyli index.php/jakis-artykul/. Tą metodą POST tylko sobie wszystko utrudniasz.
SeBa_
Okey, a wracająć do najgłówniejszej sprawy, ktoś ma pojęcie dlaczego coś takiego nie działa:

  1. for ($i = 0; $i < $iloscWierszy; ++$i)
  2.  
  3. {
  4.  
  5. $id = $wiersz[$i]['id'];
  6.  
  7. $tytul = $wiersz[$i]['txt'];
  8.  
  9. echo "<TR><TD>$id</TD><TD> <ul><li><a href='index.php?Index=$id'>$tytul</a></li></ul> </TD></TR>\n";
  10.  
  11. }
PawelC
Zobacz tak,poza tym ma być $i++ a nie ++$i:
  1. <?php
  2. for ($i = 0; $i < $iloscWierszy; $i++)
  3.  
  4. {
  5.  
  6. $id = $wiersz[$i]['id'];
  7.  
  8. $tytul = $wiersz[$i]['txt'];
  9.  
  10. echo '<TR><TD>'.$id.'</TD><TD> <ul><li><a href="index.php?Index='.$id.'">'.$tytul.'</a></li></ul> </TD></TR>\n';
  11.  
  12. }
  13. ?>

A to txt skąd pobierasz? Daj tag php dla kodu a nie html winksmiley.jpg
Crozin
Odnośnie bazy danych: napisz sobie zestaw funkcji/klasę do obsługi baz.
Odnośnie tego "niedziałającego" kodu - a skąd się bierze $wiersz?
SeBa_
Już po problemie, ma być tak:
  1. // plik connection
  2. <?php
  3. $linkMssql =mssql_connect('DELLSQLEXPRESS','Sebastian','pass');
  4. mssql_select_db('SEBA', $linkMssql);
  5. $zapytanie = "SELECT id,txt FROM Tytul"; 
  6. $wynik = mssql_query($zapytanie,$linkMssql); 
  7. $iloscWierszy = mssql_num_rows( $wynik ); 
  8.  
  9. $i =0;
  10. while ($wiersz[$i++] = mssql_fetch_array($wynik, MSSQL_ASSOC));
  11. ?>


  1. // zawartość pliku głównego
  2. <?php
  3. print "<TABLE CELLPADDING=5 BORDER=1>"; 
  4. print "<TR><TD><B>Lp.</B></TD><TD><B>Tytuł</B></TD></TR>\n";
  5. $lp=0;
  6. for ($i = 0; $i < $iloscWierszy; $i++)
  7. {
  8. $id = $wiersz[$i]['id'];
  9. $tytul = $wiersz[$i]['txt'];
  10. $lp++;
  11. echo "<TR><TD>$lp</TD><TD> <ul><li><a href='index.php?Typ=$id'>$tytul</a></li></ul> </TD></TR>\n";
  12. }
  13. print "</TABLE>";
  14. ?>


a różnica jest w



  1. <?php
  2. while ($wiersz[$i++] = mssql_fetch_array($wynik, MSSQL_ASSOC));
  3. ?>


gdzie wcześniej brakowało znaków inkrementacji. Teraz już wszystko działa. Mam uniwersalną funkcję, która przesyła ilość zwróconych wierszy, oraz tablicę z tymi wierszami. Po prostu super. guitar.gif

Cytat
poza tym ma być $i++ a nie ++$i:

a właśnie miałem szukać czemu funkcja gubi mi pierwszy rekord... winksmiley.jpg
winosek questionmark.gif
rzeczy robione po 10:00 w nocy trzeba ponownie wykonywać następnego dnia.. hehe, widocznie gdzieś w ferworze walki omsknął mi się palec.

Okey, dziękuję za pomoc i poświęcony czas smile.gif
Crozin
Cytat
winosek?
  1. <?
  2.  
  3. $i = 0;
  4. $j = 0;
  5.  
  6. echo $i++; //wyswietli zero, a zmienna przyjmie wartosc 1
  7. echo ++$j; //wyswietli jeden, a zmienna bedzie miala wlasnie ta wartosc
  8.  
  9. ?>
Wniosek? Preinkrementacja (++X) najpierw zwiększa wartość, a dopiero potem ją zwraca (zmienna $j) - posinkrementacja (X++) zwraca wartość, a dopiero potem ją zwiększa (zmienna $i)
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.