Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Gotowa klasa do łączenia się z MYSQL przez PDO, MySQLi oraz MySQL
adrix88
post
Post #1





Grupa: Zarejestrowani
Postów: 45
Pomógł: 1
Dołączył: 16.11.2007

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


Witam. Ostatnio zabrałem się za pisanie klasy do obsługi połączeń MySQL i poszukując inspiracji w sieci znalazłem dosyć ciekawą klasę do obsługi baz w której możemy wybierać typ połączenia PDO, MYSQLi lub MYSQL, tego w sumie potrzebowałem. Napiszcie co myślicie o tej klasie, jest waszym zdaniem dobrze napisana? Czy może znacie jakieś inne gotowe sprawdzone klasy?

LINK DO KLASY

Ten post edytował adrix88 23.06.2011, 23:36:37
Go to the top of the page
+Quote Post
2 Stron V   1 2 >  
Start new topic
Odpowiedzi (1 - 19)
Fifi209
post
Post #2





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

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


Pisanie "nakładek" na mysql_ czy mysqli_ o pdo nie wspominając to kpina. (IMG:style_emoticons/default/wink.gif)

Samo PDO udostępnia całkiem niezłą funkcjonalność, w wielu przypadkach wystarczy, nie miałem jeszcze przyjemności (lub nieprzyjemności) używać ORM.

Powiedz do czego Ci ta klasa? W celach edukacyjnych? Chcesz mogę Ci dać 10 innych tematów, na których możesz poćwiczyć obiektówkę.
Go to the top of the page
+Quote Post
zegarek84
post
Post #3





Grupa: Zarejestrowani
Postów: 1 332
Pomógł: 294
Dołączył: 12.10.2008
Skąd: Olkusz

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


Cytat(Fifi209 @ 23.06.2011, 23:19:23 ) *
Powiedz do czego Ci ta klasa?

choćby do większej uniwersalności kodu??

możesz mi nie wierzyć w to co teraz napiszę - sam byłem zaskoczony - ale jak jedną rzecz pisałem znajomemu okazało się, że nie mogę się połączyć z bazą mysql przez PDO gdzie ono było skompilowane o.O - z kolei jak druga mniejszą rzecz pisałem to już skorzystałem ze sqlite które tam można było utworzyć właśnie tylko przez PDO... wszystko zależy jak PHP na danym serwerze jest skompilowane...

Ten post edytował zegarek84 23.06.2011, 22:45:39
Go to the top of the page
+Quote Post
adrix88
post
Post #4





Grupa: Zarejestrowani
Postów: 45
Pomógł: 1
Dołączył: 16.11.2007

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


Generalnie chodzi mi właśnie o uniwersalność, żeby w każdym projekcie używać tej samej klasy do mysqla, a dodatkowym argumentem jest chęć przetestowania wydajności poszczególnych połączeń mysql na "żywym" organizmie, w różnych projektach. Wiele osób twierdzi że PDO jest wolniejsze od mysqli, natomiast jeszcze inni twierdzą że PDO jest szybkie w dużych aplikacjach, jak z tym jest tak naprawdę to nie wiem, ale chciałbym mieć możliwość przełączenia się pomiędzy tymi interfejsami.
Go to the top of the page
+Quote Post
zegarek84
post
Post #5





Grupa: Zarejestrowani
Postów: 1 332
Pomógł: 294
Dołączył: 12.10.2008
Skąd: Olkusz

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


do pojedynczego zapytania może i PDO wolniej wypadnie ale pomijając kwestię transakcji to w PDO możesz bindować zapytania SQL co jest z jednej strony bezpieczniejsze, z drugiej strony przy większej liczbie zapytań szybsze - oczywiście przy większej liczbie uaktualnień w bazie lepiej włączyć transakcje...

poza tym PDO masz wkompilowane w samo PHP - gdybyś wszystko to samo chciał zrobić to samo w samym PHP to napewno było by to wolniejsze ;]

Ten post edytował zegarek84 23.06.2011, 23:01:55
Go to the top of the page
+Quote Post
Fifi209
post
Post #6





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

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


Cytat(zegarek84 @ 23.06.2011, 23:44:41 ) *
choćby do większej uniwersalności kodu??

Wiesz jak to się mówi: jeżeli coś jest do wszystkiego to jest do niczego

Cytat(zegarek84 @ 24.06.2011, 00:00:16 ) *
z drugiej strony przy większej liczbie zapytań szybsze - oczywiście przy większej liczbie uaktualnień w bazie lepiej włączyć transakcje...

Co mają transakcje do szybkości?


Cytat(adrix88 @ 23.06.2011, 23:54:30 ) *
Generalnie chodzi mi właśnie o uniwersalność, żeby w każdym projekcie używać tej samej klasy do mysqla

Nic nie jest uniwersalne, nawet jeżeli napiszesz coś w miarę uniwersalnego, to i tak przy którymś projekcie będziesz musiał ją rozszerzać.
Cytat(adrix88 @ 23.06.2011, 23:54:30 ) *
, a dodatkowym argumentem jest chęć przetestowania wydajności poszczególnych połączeń mysql na "żywym" organizmie, w różnych projektach.

Wydajność zależy nie od samego PHP, dobre zaprojektowanie bazy danych, założenie odpowiednich indeksów. Poza tym, przy dzisiejszej mocy obliczeniowej procesorów - różnica rzędu 0.0001 sek nie będzie zauważalna nawet przy dużej liczbie odwiedzin.
Go to the top of the page
+Quote Post
adrix88
post
Post #7





Grupa: Zarejestrowani
Postów: 45
Pomógł: 1
Dołączył: 16.11.2007

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


Widzę że dosyć dobrze ogarniacie PDO, bo ja to przyznam szczerze że dotychczas łączyłem się wyłącznie przez mysql. Mam do ciebie takie pytanie, nie wiem czy przeglądałeś tą klasę co podałem w temacie, ale zakładam że tak. Z tego co widzę to dane które dodawane są w zapytaniach mysql i mysqli są potraktowane funkcją mysql_escape_string, natomiast w przypadku w klasie z PDO brak jest tego filtrowania, hmm, czyli w tej klasie jest jakieś inne zabezpieczenie przed sql injected, czy też może brak w niej jakichkolwiek zabezpieczeń? Bo osobiście nie widzę tam niczego co mogłoby zabezpieczać przed tym atakiem, ale nie znam się na funkcjach PDO, więc mogę się mylić.

Ten post edytował adrix88 23.06.2011, 23:10:04
Go to the top of the page
+Quote Post
Spawnm
post
Post #8





Grupa: Moderatorzy
Postów: 4 069
Pomógł: 497
Dołączył: 11.05.2007
Skąd: Warszawa




Masz bindowanie oraz execute (IMG:style_emoticons/default/wink.gif)
Go to the top of the page
+Quote Post
zegarek84
post
Post #9





Grupa: Zarejestrowani
Postów: 1 332
Pomógł: 294
Dołączył: 12.10.2008
Skąd: Olkusz

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


Cytat(Fifi209 @ 24.06.2011, 00:08:08 ) *
Co mają transakcje do szybkości?

wgrywałeś/aktualizowałeś kiedyś co jakiś czas minimum po 3-5 tys. rekordów? - wiem - to bardziej od strony administracyjnej lub do jakichś tam narzędzi ale różnica nawet na lokalnym komputerze jest ;]
Go to the top of the page
+Quote Post
Fifi209
post
Post #10





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

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


Transakcje

Tyle w temacie transakcji.
Go to the top of the page
+Quote Post
zegarek84
post
Post #11





Grupa: Zarejestrowani
Postów: 1 332
Pomógł: 294
Dołączył: 12.10.2008
Skąd: Olkusz

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


kiedy właśnie te minimum 3-5k rekordów minimum stanowi całość ;p [choć da się w sumie wgrać osobno a potem sprawdzić czy coś poszło nie tak - ale skoro to ma być razem to tylko wydłuży cały proces]

i pojedynczy insert bez włączenia transakcji też jest w obrębie ale własnej transakcji - gdy skożystasz z transakcji rozpoczęcie i zamkniecie jest wykonywane tylko raz ;p
Cytat(Wikipedia)
Transakcja składa się zawsze z 3 etapów:
  1. rozpoczęcia
  2. wykonania
  3. zamknięcia

tyle w temacie transakcji (IMG:style_emoticons/default/wink.gif)

Ten post edytował zegarek84 23.06.2011, 23:30:12
Go to the top of the page
+Quote Post
adrix88
post
Post #12





Grupa: Zarejestrowani
Postów: 45
Pomógł: 1
Dołączył: 16.11.2007

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


Kurcze, porobiłem właśnie kilka zapytań PDO i muszę wam powiedzieć że te bindowanie jest strasznie niewygodne. Mam np. inserty po 60 pól i dla każdego z tych pól tworzyć bindy to jest przecież katorga, a to przecież tylko 1 zapytanie. Już wolę filtrowanie funkcją tak jak to robiłem w mysql, bo to co daje PDO to jakaś tragedia. Czy to filtrowanie od PDO jest naprawdę lepsze od poczciwego real_escape_string + stripslashes dla magic_quotes on?

Ten post edytował adrix88 23.06.2011, 23:43:18
Go to the top of the page
+Quote Post
Fifi209
post
Post #13





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

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


Tak.
magic_quotes - oby zniknęło jak najprędzej, to zło, wystrzegaj się

Pisałem wcześniej o projektowaniu bazy danych, jesteś idealnym przykładem jak nie projektować bazy, 60 pól w tabeli? Chyba oszalałeś...

@zegarek
Przy 3-5k rekordów raczej skorzystałbym z poczciwego source lub chociaż load data niż bawił się w dodatkowych pośredników jak php.

Ten post edytował Fifi209 24.06.2011, 02:04:27
Go to the top of the page
+Quote Post
adrix88
post
Post #14





Grupa: Zarejestrowani
Postów: 45
Pomógł: 1
Dołączył: 16.11.2007

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


Fifi209, a co w tym złego że jest 60 pól w tabeli? chyba nie będę joinował kilka tabel żeby zmniejszyć liczbę pól w jednej tabeli. Jeżeli specyfikacja skryptu wymaga przechowywania tylu danych w tabeli to nawet żebyś był najlepszym programistą to tego nie przeskoczysz... Widziałeś w ogóle strukturę tabel np. w vBulletin'ie? W tym skrypcie są tabele grubo przekraczające liczbę pól którą podałem. Im większy projekt tym więcej danych i żebyś nie wiem jak chciał to tego nie przeskoczysz...
Go to the top of the page
+Quote Post
nospor
post
Post #15





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Cytat
Im większy projekt tym więcej danych i żebyś nie wiem jak chciał to tego nie przeskoczysz...
Wszystko zależy od projektu. Nie wiemy co tam u Ciebie było i czy te 60 pól było uzasadnione czy nie.

Cytat
Mam np. inserty po 60 pól i dla każdego z tych pól tworzyć bindy to jest przecież katorga, a to przecież tylko 1 zapytanie.
Może coś źle zrozumiałeś, może coś źle robisz, ale ja tam w bindowaniu nie widzę żadnej katorgi.

Cytat
Czy to filtrowanie od PDO jest naprawdę lepsze od poczciwego real_escape_string + stripslashes dla magic_quotes on?
Niby w czym bindowanie jest bardziej katorgą od używania real_escape_string + stripslashes? Chyba, naprawdę coś źle robiłeś (IMG:style_emoticons/default/wink.gif)
Co do magic_quotes to fifi już napisał co należy z tym zrobić.
Go to the top of the page
+Quote Post
zegarek84
post
Post #16





Grupa: Zarejestrowani
Postów: 1 332
Pomógł: 294
Dołączył: 12.10.2008
Skąd: Olkusz

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


Cytat(Fifi209 @ 24.06.2011, 03:04:04 ) *
@zegarek
Przy 3-5k rekordów raczej skorzystałbym z poczciwego source lub chociaż load data niż bawił się w dodatkowych pośredników jak php.

fajnie się pisze - inna sprawa, że te dane pochodzą z innego programu i trzeba te dane z xml'a wyciągnąć ;]
Go to the top of the page
+Quote Post
Fifi209
post
Post #17





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

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


zegarek, wiesz dla chcącego nic trudnego, o czym my tu dyskutujemy? Napisać program w C++ czy C#, który zapisze te dane w postaci CSV i wtedy load data...
Nie ciągnijmy już tego tematu, sposobów tyle co programistów. (IMG:style_emoticons/default/wink.gif)
Go to the top of the page
+Quote Post
adrix88
post
Post #18





Grupa: Zarejestrowani
Postów: 45
Pomógł: 1
Dołączył: 16.11.2007

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


Cytat(nospor @ 24.06.2011, 08:40:22 ) *
Wszystko zależy od projektu. Nie wiemy co tam u Ciebie było i czy te 60 pól było uzasadnione czy nie.


No tak. Tylko że akurat w tym projekcie te 60 pól jest raczej uzasadnione, ponieważ są tam przechowana id, nazwa, parametry danej usługi, data startu, data wygaśnięcia, cena. Więc akurat w tym przypadku nie widzę możliwości ograniczenia tych pól, bo każde z nich jest kluczowe.

Cytat(nospor @ 24.06.2011, 08:40:22 ) *
Może coś źle zrozumiałeś, może coś źle robisz, ale ja tam w bindowaniu nie widzę żadnej katorgi.


hm, robię to tak jak widać poniżej:

Dla zwykłego MySQL:

  1. $query = mysql_query("SELECT * FROM `tabela` WHERE `var1` = '".sql($_GET['var1'])." AND `var2` = '".sql($_GET['var2'])."' AND `var3` = '".sql($_GET['var3'])."'' AND `var4` = '".sql($_GET['var4'])."' ");


  1. while($dane = mysql_fetch_array($query)) {
  2. echo $dane['id'];
  3. echo $dane['nazwa'];
  4. }


Dla PDO:

  1. $query = $pdo->prepare('SELECT * FROM `tabela` WHERE
  2. `var1` = :var1 AND
  3. `var2` = :var2 AND
  4. `var3` = :var3 AND
  5. `var4` = :var4 ');
  6. $query->bindValue('var1', $_POST['var1'], PDO::PARAM_STR);
  7. $query->bindValue('var2', $_POST['var1'], PDO::PARAM_STR);
  8. $query->bindValue('var3', $_POST['var1'], PDO::PARAM_STR);
  9. $query->bindValue('var4', $_POST['var1'], PDO::PARAM_STR);
  10. $query->execute();
  11. $array = $query->fetchAll();


  1. foreach($arraye as $dane){
  2. echo $dane['id'];
  3. echo $dane['nazwa'];
  4. }


//////
Nie wiem czy robię wszystko poprawnie, ale na powyższych przykładach widać że tworzenie zapytań w mysql jest znacznie prostsze i szybsze oraz jest mniej kodu, a w PDO jednak trzeba się napisać ...

Cytat(nospor @ 24.06.2011, 08:40:22 ) *
Niby w czym bindowanie jest bardziej katorgą od używania real_escape_string + stripslashes? Chyba, naprawdę coś źle robiłeś (IMG:style_emoticons/default/wink.gif)
Co do magic_quotes to fifi już napisał co należy z tym zrobić.

Robiłem to tak jak widać na przykładach powyżej, przecież nikt o zdrowych zmysłach nie używa samego real_escape_string na wartościach dodawanych w zapytaniu, do tego celu tworzy się funkcję czyszczącą która w przypadku gdy magic_quotes jest na on kasuje ukośniki przez stripslashes i następnie przemiela wartości przez real_escape_string. Wtedy tylko wywołuje się taką funkcję przy każdej zmiennej w zapytaniu np. sql($_GET['var']) i jest wszystko pięknie i przyjemnie. A jeżeli chodzi magic_quotes to wiem co z nim zrobić, chyba źle zrozumieliście mój post w którym o tym wspomniałem.

===============
Mam jeszcze do was takie pytanie, czy stosujecie jakieś nakładki na PDO, własne klasy obsługujące itd. czy korzystacie z tego standardowo bez żadnych nakładek? Bo z tego co czytałem kilka wypowiedzi z forum to nie ma sensu stosowanie własnych nakładek na PDO, chociaż osobiście nie do końca rozumiem dlaczego, co prawda nie znam jeszcze za dobrze tego typu połączenia z bazą, ale bo krótkiej zabawie, wydaje mi się że napisanie dodatkowej klasy obsługującej PDO ma sens i może przyśpieszyć pisanie kodu, ułatwić w przyszłości przejście na inny interfejs połączenia z bazą, a także daje możliwość dopisania funkcji liczących liczbę zapytań, ich czas, czy też zapisywanie wykonywanych zapytań itd. Chciałbym wiedzieć jaki jest wasz stosunek do tego. Korzystacie z własnych nakładek, czy to nie ma sensu i dlaczego?

Ten post edytował adrix88 24.06.2011, 16:00:54
Go to the top of the page
+Quote Post
zegarek84
post
Post #19





Grupa: Zarejestrowani
Postów: 1 332
Pomógł: 294
Dołączył: 12.10.2008
Skąd: Olkusz

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


Cytat(adrix88 @ 24.06.2011, 16:52:08 ) *
Nie wiem czy robię wszystko poprawnie, ale na powyższych przykładach widać że tworzenie zapytań w mysql jest znacznie prostsze i szybsze oraz jest mniej kodu, a w PDO jednak trzeba się napisać ...

na upartego przygotowane zapytanie nie musisz wcale bindować ;p - poczytaj w manualu PDOStatement->execute
a przede wszystkim zwróć uwagę na przykład drugi i trzeci:
http://pl2.php.net/manual/en/pdostatement....php#example-955

EDIT
Widzę, że źle bindujesz!!! Binduje się nazwy z dwukropkiem (poprzedzone nim) czyli np. :var1 lub jeśli masz znaki zapytania to kolejno przy bindowaniu numerujesz od 1 zaś dając tablicę do execute od 0 (co zresztą samo się ponumeruje nie ustawiając kluczy w tablicy)

Ten post edytował zegarek84 24.06.2011, 16:11:08
Go to the top of the page
+Quote Post
thek
post
Post #20





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




Znasz strukturę zapytania? Znasz. To w czym jest trudność zastosować:
  1. foreach( $_POST AS $key => $value) {
  2. $query->bindValue( $key, $value, PDO::PARAM_STR);
  3. }
lub czegoś w tym stylu po drobnych przeróbkach?
Go to the top of the page
+Quote Post

2 Stron V   1 2 >
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: 22.08.2025 - 20:29