Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: jakie dane w bazie i jakie zapytania zeby nie było *
Forum PHP.pl > Forum > PHP
nikosss
cześć smile.gif mam pytanie dotyczące formatu danych w bazie danych oraz zapytań -głównie chodzi mi o to że czytałem sobie na forum artykuły i wychodzi na to że robię źle... a robię tak:

zapytanie do bazy danych A:
  1. <?php
  2. $sql_select = mysql_query( "select * from ".$prefix."config");
  3. while ($row = mysql_fetch_array($sql_select)){
  4. $wyslij_gratis=$row["wyslij_gratis"];
  5. }
  6. ?>


i drugie - z nazwa.pl mnie wywalili kiedyś bo ponoć obciążało serwer - zapytanie do bazy danych B:

  1. <?php
  2. $query_w = "select * from ".$prefix.$lg."_wysylka order by id desc";
  3. $result_w = mysql_query($query_w);
  4. $count_w = mysql_num_rows($result_w);
  5. if(empty($count_w)){ echo"brak"; }
  6. while($row = mysql_fetch_array($result_w))
  7. { 
  8. $akt_id = $row["id"];
  9. $akt_a = $row["a"];
  10. $akt_tresc = $row["tresc"];
  11. $akt_cena = $row["cena"];
  12. echo"<br>$akt_id | $akt_a | $akt_tresc | $akt_cena";
  13. }
  14. ?>


teraz znalazłem sobie coś takiego:
  1. <?php
  2. $wynik = mysql_query("SELECT id,nazwa FROM zwierzaki order by id desc limit 10");
  3. for($i = 1; $i <= mysql_num_rows($wynik); $i++){  
  4.  echo $szukane['nazwa'];  
  5.  if($i%5==0){echo "<br />\n";}else{echo " | ";}
  6. }
  7. ?>


czym to się różni ? które jest lepsze i gdzie mógłbym o tym poczytać ? Czy ktoś mógłby mi napisać jak przerobić przykład A i B - by uzyskać ten sam efekt ale żeby było to prawidłowo napisane ?;

Czy ktoś wie/ zna linka - do listy jakie zmienne stosować w bazie ?
np imie, nazwisko, kod pocztowy, numer banku itd...


teraz mam dla przykładu:

CREATE TABLE `config` (
`mbanka` decimal(1,0) NOT NULL default '0',
`mbankid` varchar(10) NOT NULL default '',
`telefon_serwisu` varchar(50) NOT NULL default '',
`polec_tresc` text NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin2;

CREATE TABLE `uzytkownik` (
`id` bigint(32) NOT NULL auto_increment,
`a` decimal(1,0) NOT NULL default '0',
`no` varchar(100) NOT NULL default '',
`dodano` varchar(30) NOT NULL default '',
`ip` varchar(200) NOT NULL default '',
`imie` varchar(60) NOT NULL default '',
`nazwisko` varchar(60) NOT NULL default '',
`email` varchar(60) NOT NULL default '',
`user_pass` varchar(255) NOT NULL default '',
`wojewodztwo` varchar(60) NOT NULL default '',
`branza` varchar(200) NOT NULL default '',
`nip` varchar(20) NOT NULL default '',
`kraj` varchar(5) NOT NULL default '',
`telefon` varchar(20) NOT NULL default '',
`urodzony` varchar(15) NOT NULL default '',
`firma` varchar(150) NOT NULL default '',
`ulica` varchar(150) NOT NULL default '',
`nrdomu` varchar(10) NOT NULL default '',
`nrmieszkania` varchar(10) NOT NULL default '',
`miasto` varchar(100) NOT NULL default '',
`kod` varchar(10) NOT NULL default '',
`pp` varchar(100) NOT NULL default '',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin2 AUTO_INCREMENT=103 ;

Proszę o pomoc smile.gif gdyż chciałbym sie tego nauczyć smile.gif
dragonsokol
zawsze jakas optymalizacja, to tak jak na rl, po co cos brac jak i tak tego nie uzyjesz?
Kicok
Cytat
Kod
`ip` varchar(200) NOT NULL default '',

Kod
`user_pass` varchar(255) NOT NULL default '',

Kod
`urodzony` varchar(15) NOT NULL default '',


`IP` to int ( ewentualnie może być varchar(15) ), `urodzony` to date, a `user_pass` zakodowane w md5 zawsze się zmieści w varchar(32) (a nawet w binary(16) )



Ogólnie to google -> manual MySQL -> typy danych
nikosss
no poczytałem i chyba już łapie - czy to chodzi np.:

1)
`a` decimal(1,0) NOT NULL default '0',
- można wpisac od 1 do 9 i bez miejsc po przecinku ?

2)
`a` decimal(2,0) NOT NULL default '0',
- można wpisac od 1 do 99 i bez miejsc po przecinku ?

3)
`dodano` varchar(30) NOT NULL default '',
- można wpisac cyfry i znaki o długości 30 ?

4)
`dodano` char(10) NOT NULL default '',
- można wpisac słowo które ma np do 10 liter ?

5)
`id` int(3) NOT NULL auto_increment,
- można wpisać cyfry np od 1 do 999 ?

Czy dobrze rozumuję ? smile.gif ktoś może mi potwierdzić ? czy ew napisać w którym przykładzie mam błąd smile.gif
jml
Dobrze rozumujesz. winksmiley.jpg

Jeszcze tylko różnica między char i varchar, przykładowo:
CHAR(10) - jak zapiszesz słowo krótsze niż 10 znaków, zostanie dopełnione zerami chyba, tzn nieważne ile znaków ma słowo, zawsze będzie zajmowało 10 znaków (choć przy odczycie i tak dostaniesz bez zer, chodzi o składowanie danych w pamięci)
VARCHAR(10) - jak zapiszesz słowo krótsze niż 10 znaków, zajmie ono dokładnie tyle miejsca w bazie ile ma (słowo 4znakowe - 4 bajty itd)

VARCHAR - oszczędność w rozmiarze bazy
CHAR - bodajże większa szybkość przy przeszukiwaniu

Do hasła - stosuj MD5, wtedy każde hasło ma 32 znaki, a pole idealne do tego to CHAR(32)
Do innych danych, których długośc nie jest stała, stosuj VARCHAR, na początek powinno wystarczyć.
nikosss
ok. dzięki serdeczne, teraz jak patrze na tą moją bazkę to mase wolnego miejsca pozadeklarowywane jest i nigdy raczej nie bedzie użyte smile.gif a wracając jeszcze do przeszukiwania tabel - to też troche poczytalem i koncepcje mam taką: /pewnie nic odkrywczego winksmiley.jpg/
  1. <?php
  2. $limit = 5;
  3. $like="where id='$id' order by date desc";
  4. $query_count = "select * from ".$prefix.$lg."_aktualnosci $like"; 
  5.  
  6. // tu już wiem ze powinno się dawać tak:
  7. // $id=intval($_GET['id']);
  8. // $query_count = "select * from ".$prefix.$lg."_aktualnosci where id=".$id." $like"; 
  9. //
  10. // a jaka jest różnica pomiędzy powyższym przykładem a tym:
  11. //
  12. // $query_count = 'select * from '.$prefix.$lg.'_aktualnosci where `id`=\"'.$id.'\" $like'; 
  13. //
  14.  
  15. $result_count = mysql_query($query_count); 
  16. $totalrows = mysql_num_rows($result_count);
  17. if(empty($totalrows)){
  18. info_box('ico_i.png',"$txt_0092");
  19. }else{
  20. while($row = mysql_fetch_array($result))
  21. { 
  22. $akt_id = $row["id"];
  23. $akt_a = $row["a"];
  24. $akt_tresc = $row["tresc"];
  25. $akt_data = $row["data"];
  26. $akt_date = $row["date"];
  27. $akt_term = $row["term"];
  28. $ile_dni=iledni($akt_date,$akt_term);
  29. $ile_pozostalo=iledni($today,$akt_term);
  30. echo"<br> $akt_id | $akt_a | $akt_tresc | $akt_data | $akt_date | $akt_term | $ile_dni
     | $ile_pozostalo"
    ;
  31. }
  32. ?>

jak widać w przykładzie mieli mi całą tabelke - czy można powyższe przerobić by efekt był taki sam ale zeby było dobrze i żeby mniej obciążało - zeby było bardziej wydajne ?
nexis
Cytat(nikosss @ 23.06.2008, 20:54:20 ) *
z nazwa.pl mnie wywalili kiedyś bo ponoć obciążało serwer


Raczej nie opłaciłeś abonamentu, bo nawet jeśli przekroczyłeś maksymalny limit zapytań na godzinę, który wynosi obecnie 200 000, to najwyżej mogłeś utracić dostęp do bazy danych do najbliższej pełnej godziny. Nie krytykuj dobrych firm hostingowych wymyślonymi argumentami!
nikosss
raczej nie zawsze miałem opłacony abonament - ale jak ma mi wisieć pod serwisami wiecznie info o przekroczeniu.... może i to dobra firma - ale ten wątek nie jest o tym tylko o optymalizacji - obsługa na nazwie jest beznadziejna - jedyne lekarstwo to rozwiązanie umowy i info o niezoptymalizowanych zapytaniach do bazy - no i mieli racje - jak wisiało mi na wirtualce 50 serwisów to im sie przycinało wszystko - teraz mam dedykowaną jednostkę w innej firmie i śmiga fakt ze dalej pochłania zasoby maszyny ale wisi tylko jedna moja firma na fizycznej jednosce a nie 100 na wirtualkach - tak więc nie chce tam nikogo w nazwie obrazac - może i dobra firma - ja mam inne zdanie i mam prawo je wyrazic smile.gif a ten watek jest zapytaniem moim o to jak sie nauczyć tych zapytan i nie obciążać zbędnie serwrera smile.gif - tak więc proszę Szanowne grono o pomoc w moim problemie lub o jakieś info smile.gif
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.