Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php5] mysqli
Forum PHP.pl > Forum > PHP
marcinek37
Witam,
Staram się napisać mały CMS korzystając z dobrodziejstw PHP5, działając na WebServ. Poniżej przedstawię kilka kwestii, które chciałbym pokrótce omówić,

1. postanowiłem skorzystać z funkcji mysqli - tu były pierwsze schody, bo musiałem uruchomić specjalną bibliotekę na WebServ - czy to częsty problem na serwerach, że nie obsługują mysqli? czy są konkretne przesłanki, aby korzystać z tej funkcji, czy raczej nic to nie daje?

2. mam plik db.php, on includuje się do pliku systemowego, a w nim mam coś takiego:
  1. <?
  2. include('db.php');
  3. $db = new mysqli($dbHost, $dbLogin, $dbPasswd, $dbName);
  4. if(mysqli_connect_errno() > 0) { throw new Exception('Przerwa techniczna');}
  5. else { $db->query('SET NAMES \'utf8\''); }
  6. ?>


a) czy takie połączenie za pomocą mysqli jest poprawne?
B) $db->query('SET NAMES \'utf8\''); // na WebServie jest problem z tabelami MySQL, które mają kodowanie utf8_unicode_ci i tylko za pomocą takiej komendy działa wszystko poprawnie

3. w niektórych momentach w systemie są formularze, które będą uzupełniane przez internautów, zatem napisałem taką małą funkcję:
  1. <?
  2. function check_sql($code, $db){
  3. return $db -> real_escape_string(stripslashes($code));
  4. }
  5. ?>

// czy ona wystarczy, aby zabezpieczyć się przed SQL INJECTION? po prostu każda zmianna, która wejdzie do zapytania SQL, będzie musiała ją przejść

4. mam plik info.php, który ukazuje zwyczajne podstrony, includuje on plik systemowy, w nim jest klasa, a następnie operacja, w której następuje pobranie danych (nie będę przedstawiać całego kodu, bo nikomu nie chciałoby się analizować)

  1. <?
  2. $id = (int)$_GET['id'];
  3. $query = 'SELECT * FROM _mps_info WHERE id='.$id;
  4. $this->data = $db->query($query);
  5. if ($this->data->num_rows == 0){ echo'Błąd'; }
  6. else{ $this->data = $this->data->fetch_assoc(); }
  7. ?>


a) czy taki kod jest poprawny "$this->data->num_rows"? pamiętam, że przy starych funkcjach każdy odradzał używania funkcji mysql_num_rows do liczenia ilości rekordów, gdyż wraz z liczbą rekordów, skrypt pobierał wszystkie pola, co obciążało serwer i sugerowano używania funkcji mysql_result, np.
  1. <?
  2. $how = mysql_result(mysql_query("SELECT COUNT(*) FROM tabela"), 0);
  3. ?>

B) czy konieczne jest użycie takiego kodu: "$this->data = $this->data->fetch_assoc();"
w tym stare funkcje bardziej mi się podobały, bo wystarczył taki kod, aby od razu mieć wszystkie dane w tablicy:
  1. <?
  2. $a = mysql_fetch_array(mysql_query("SELECT * FROM tabela WHERE `id`=1"));
  3. ?>

c) czy w tym kodzie powinienem oprócz tego przeprowadzić jakąś zmianę?
viking
Przerzuć się na uniwersalne PDO. Masz w dokumentacji przykłady jak obsłużyć wyjątki. 3. prepared statements. Kolejne to też następstwo przestawienia się na PDO.
CuteOne
W twoim kodzie nie widzę ani kropli z tego co daje PHP5 - zaczynając od obiektów kończąc na wyjątkach, po drodze zahaczając o wspomniane PDO. Przerzuć się na WampServer 2.2 (webserv od dłuższego czasu nie był uaktualniany) a w nim masz PHP 5.4.3 oraz MySQL 5.5.24

ps. zobacz jak piszą takie rzeczy ludzie z wieloletnim doświadczeniem i wtedy zacznij tworzyć coś swojego
marcinek37
czy możecie podać linki do dobrze skonstruowanych kodów, wyciągających i obsługujących dane z MySQL?
sugerujecie, że mysqli to przeżytek, więc chętnie zobaczyłbym, co jest na "topie"
kiedyś pisałem na forum pytanie, na co zwrócić uwagę przy pisaniu CMSa, aby był jak najbardziej zgodny ze standardami PHP5, jednak nie otrzymałem odpowiedzi
rzymek01
mysqli nie jest żadnym przeżytkiem i obsługuje model obiektowy, prepared statements i wszystko co ma PDO, a na dodatek jest szybsze od PDO,
poza tym PDO i MySQLi korzystają z tego samego sterownika mysqlnd.

Pozostaje kwestia, żeby to poprawnie napisać.

Manual, manual i jeszcze raz manual smile.gif
marcinek37
możesz dać przykład, gdzie kod został źle napisany?
zajmie Ci to minutkę, a przynajmniej będę wiedzieć, o co chodzi

piszę ten kod wraz z książką, którą kiedyś polecaliście na forum
viking
Jest tyle kursów: http://wwwgo.pl/article/10/php_data_object...luge_baz_danych
Ostatnio pisałem jak postawić cały serwer: http://wwwgo.pl/article/13/konfiguracja_sr...%3A_serwer_http

W skrócie chodzi o to że całość która napisałeś miesza mocno stare podejście czyli zwykłe funkcje mysqli_ z obiektowością. Czyli dla przykładu rozszerzenie mysqli http://www.php.net/manual/en/mysqli.quicks...-statements.php. Przyda ci się też http://us.php.net/manual/en/language.exceptions.php
marcinek37
z tego PDO nie skorzystam, skoro mysqli jest szybsze
w moim poście dałem tylko 4 kody, może mi ktoś tylko naświetlić, co dokładnie jest nie tak? no i przy okazji odpowiedzieć na konkretne pytania, bo nadal nie mam odpowiedzi
rzymek01
Jeśli do tej pory nie zauwazyłeś co jest nie tak w Twoim kodzie, to lepiej skorzystaj PDO, gdzie obiektowość jest wymuszona (nie masz innego api smile.gif ),
poza tym do PDO jest więcej tutoriali, a szybkością nie masz co się przejmować, bo chyba nie tworzysz serwisu dla miliona użytkowników tongue.gif

przede wszystkim zacznij od nauki OOP, bo PDO czy MySQLi to po prostu obiektowe API do sterownika bazy danych, nie rózni się niczym od użycia innych obiektowych bibliotek.
viking
Pierwsze z brzegu porównania szybkości : http://jnrbsn.com/2010/06/mysqli-vs-pdo-benchmarks

NIe zauważysz różnicy. Szybciej zapomnisz indeksu jakiegoś który spowoduje 10x więcej strat. Natomiast kiedy już nauczysz się korzystać z PDO będzie łatwiej przestawić się np na Doctrine. Zauważ że wszystkie projekty ORMów korzystają z PDO a nie rozszerzeń mysql i mysqli. Poza tym co jeśli stwierdzisz w jakimś momencie że badziewie MySQL to już za mało?
rzymek01
@up takie porównania nie są miarodajne,
oba api korzystają z tego samego sterownika, wiec trzeba by zobaczyć na poziomie opcodów co się dzieje po drodze do sterownika i tylko w tym imo może być róznica wydajności na korzyść mysqli, pytanie czy inaczej jest zorganizowana komunikacja ze sterownikiem, tego nie wiem, ale różnice w wydajności w każdym razie są niezauważalne dla standardowych aplikacji, a dla tych wymagających samo użycie PHP jest już powodem złej wydajności ;-)
marcinek37
czyli sugerujecie, że PDO jest lepszym rozwiązaniem?

a odpowiecie na moje powyższe pytania mimo wszystko? zajmie Wam to minutkę, a dzięki temu wszystko sobie w głowie poukładam
CuteOne
1. Jeżeli już postanowiłeś skorzystać z PDO to na serwerze stwórz sobie plik phpinfo.php a w nim
  1. <?php phpinfo(); ?>

Dzięki niemu będziesz wiedział co serwer oferuje

2. Poczytaj o łączeniu się przez PDO
a) poprawne, może i tak ale czy dobre.. kwestia gustu :)
B) podczas połączenia z PDO, możesz ustalić z jakiego kodowania będziesz korzystał

3. Poczytaj o bindowaniu zmiennych w PDO

4.
a) goły PDO (czyli tak jak teraz Twój kod pod mysql) jest niewiele wart. Dopiero z dodatkowymi warstwami modelu, które "zaopiekują" się danymi zobaczysz, że pytania "czy używać mysql_num_rows" nie będą miał sensu (wszystkie dane będą obiektami na których operujesz a nie "tablicą z danymi"). Zobacz sobie do frameworków jak ta zorganizowano modele

B) pytanie bez sensu jak i argumentacja

c) co znaczy "przeprowadzić zmienna"
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.