Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [php5] mysqli
marcinek37
post
Post #1





Grupa: Zarejestrowani
Postów: 239
Pomógł: 0
Dołączył: 2.06.2011

Ostrzeżenie: (0%)
-----


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ę?

Ten post edytował marcinek37 28.08.2012, 09:28:02
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 12)
viking
post
Post #2





Grupa: Zarejestrowani
Postów: 6 380
Pomógł: 1116
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
CuteOne
post
Post #3





Grupa: Zarejestrowani
Postów: 2 958
Pomógł: 574
Dołączył: 23.09.2008
Skąd: wiesz, że tu jestem?

Ostrzeżenie: (0%)
-----


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

Ten post edytował CuteOne 28.08.2012, 10:06:49
Go to the top of the page
+Quote Post
marcinek37
post
Post #4





Grupa: Zarejestrowani
Postów: 239
Pomógł: 0
Dołączył: 2.06.2011

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
rzymek01
post
Post #5





Grupa: Zarejestrowani
Postów: 592
Pomógł: 62
Dołączył: 3.08.2006

Ostrzeżenie: (0%)
-----


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 (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
marcinek37
post
Post #6





Grupa: Zarejestrowani
Postów: 239
Pomógł: 0
Dołączył: 2.06.2011

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
viking
post
Post #7





Grupa: Zarejestrowani
Postów: 6 380
Pomógł: 1116
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
marcinek37
post
Post #8





Grupa: Zarejestrowani
Postów: 239
Pomógł: 0
Dołączył: 2.06.2011

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
rzymek01
post
Post #9





Grupa: Zarejestrowani
Postów: 592
Pomógł: 62
Dołączył: 3.08.2006

Ostrzeżenie: (0%)
-----


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 (IMG:style_emoticons/default/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 (IMG:style_emoticons/default/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.
Go to the top of the page
+Quote Post
viking
post
Post #10





Grupa: Zarejestrowani
Postów: 6 380
Pomógł: 1116
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
rzymek01
post
Post #11





Grupa: Zarejestrowani
Postów: 592
Pomógł: 62
Dołączył: 3.08.2006

Ostrzeżenie: (0%)
-----


@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 ;-)
Go to the top of the page
+Quote Post
marcinek37
post
Post #12





Grupa: Zarejestrowani
Postów: 239
Pomógł: 0
Dołączył: 2.06.2011

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
CuteOne
post
Post #13





Grupa: Zarejestrowani
Postów: 2 958
Pomógł: 574
Dołączył: 23.09.2008
Skąd: wiesz, że tu jestem?

Ostrzeżenie: (0%)
-----


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"

Ten post edytował CuteOne 1.09.2012, 14:23:25
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 23.08.2025 - 19:39