Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Nakładka mysql_* na PDO
SlimShady
post 25.11.2013, 16:26:49
Post #1





Grupa: Zarejestrowani
Postów: 29
Pomógł: 0
Dołączył: 11.05.2013

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


Pogrążony nudą, napisałem dziś dość ciekawy skrypt, który za zadanie ma wyglądać w 100% jak składnia zapytań mysql_*, jednak jego mechanika opiera się w całości o PDO.

Jak to działa? Skrypt podmienia dużą ilość funkcji oferowanych przez mysql_*, na funkcje, które zostały przepisane samemu, a ich działanie to tak naprawdę biblioteka PHP Data Objects, do której możemy odnosić się "starymi" instrukcjami.

Po co to komu? Zastosowań takiego rozwiązania może być wiele. Najbardziej cieakwe z nich okazują się wtedy, gdy nasz gotowy projekt korzysta z połączenia z bazą danych przy użyciu mysql_connect, jednak chcielibyśmy zacząć używać nowszej i lepszej techniki (mowa o PDO), ale nie mamy zamiaru przepisywać całego skryptu od nowa. W takim wypadku wystarczy dołączyć prezentowaną nakładkę, a problem zniknie. Jeśli mowa o problemach, wyobraźmy sobie, że nasz serwer w ogóle już nie oferuje wsparcia dla mysql_connect, a Twój skrypt to w całości ta metoda. Co robić? Korzystając z nakładki, żaden serwer nie wyrzuci informacji, o braku wsparcia lub przestarzałej funkcji. Jeśli nie masz zamiaru uczyć się PDO, czy mysqli, bo w php nie programujesz za często, ten skrypt może zaoszczędzić Ci dużo czasu.

Zalety nakładki:
+ szybkość tworzenia aplikacji
+ skrypt opiera się o PDO, czyli dużo nowszym interfejsie komunikacji z bazą danych niż mysql_connect
+ wymaga zaledwie 3 linijek zmian
+ kompatybilność z Twoim kodem, dzięki przeportowanej dużej liczbie funkcji, a także zachowanym miejscem na dodatkowe parametry, nie musisz nic więcej edytować w swojej aplikacji
+ funkcja mysql_real_escape_string posiada filtrowanie oparte o filter_var
+ możliwość połączenia się z takimi systemami jak PostgreSQL, czy SQLite, bez żadnych dodatkwoych zmian!

Wady nakładki:
- brak jakiejkolwiek obsługi błędów, w przypadku gdy nasz kod nie działa, problemów musimy doszukiwać się całkowicie indywidualnie
- jakiś procent spadku wydajności, spowodowany oczywiście nadpisywaniem funkcji

Lista funkcji, które zostały zawarte w nakładce:
- mysql_connect
- mysql_select_db
- mysql_set_charset
- mysql_query
- mysql_fetch_array
- mysql_fetch_assoc
- mysql_fetch_row
- mysql_fetch_object
- mysql_real_escape_string
- mysql_num_rows
- mysql_affected_rows
- mysql_create_db
- mysql_drop_db
- mysql_errno
- mysql_error (atrapa)
- mysql_close

Przejdźmy do rzeczy, kod nakładki prezentuje się tak:
  1. <?php
  2. /**
  3.  * @author Szymon Shady Szychulski <kontakt@bmmo.pl>
  4.  * @version: 1.0
  5.  */
  6.  
  7. namespace mysql2pdo;
  8. use PDO;
  9.  
  10. $dbs = 'mysql'; // system bazy danych
  11. $pdo = false;
  12.  
  13. function mysql_connect($host=NULL, $user=NULL, $pass=NULL) {
  14. global $dbs, $pdo;
  15. $pdo = new PDO($dbs.':host='.$host, $user, $pass);
  16. }
  17.  
  18. function mysql_select_db($base, $connect=NULL) {
  19. global $pdo;
  20. $pdo->query('USE '.$base);
  21. }
  22.  
  23. function mysql_set_charset($charset='utf8', $connect=NULL) {
  24. global $pdo;
  25. $pdo->exec('SET NAMES '.$charset);
  26. }
  27.  
  28. function mysql_query($query, $connect=NULL) {
  29. global $pdo;
  30. $method = $query[0];
  31.  
  32. if ($method == 's' || $method == 'S') {
  33. return $pdo->query($query);
  34. } else {
  35. return $pdo->exec($query);
  36. }
  37. }
  38.  
  39. function mysql_fetch_array($result, $connect=NULL) {
  40. return $result->fetch(PDO::FETCH_BOTH);
  41. }
  42.  
  43. function mysql_fetch_assoc($result, $connect=NULL) {
  44. return $result->fetch(PDO::FETCH_ASSOC);
  45. }
  46.  
  47. function mysql_fetch_row($result, $connect=NULL) {
  48. return $result->fetch(PDO::FETCH_NUM);
  49. }
  50.  
  51. function mysql_fetch_object($result, $connect=NULL) {
  52. return $result->fetch(PDO::FETCH_OBJECT);
  53. }
  54.  
  55. function mysql_real_escape_string($data) {
  56. switch (gettype($data)) {
  57. default:
  58. case 'string':
  59. return filter_var(trim($data), FILTER_SANITIZE_STRING);
  60. break;
  61.  
  62. case 'integer':
  63. return intval($data);
  64. break;
  65. }
  66. }
  67.  
  68. function mysql_num_rows($result) {
  69. return $result->rowCount();
  70. }
  71.  
  72. function mysql_affected_rows() {
  73. global $pdo;
  74. return $pdo->lastInsertId();
  75. }
  76.  
  77. function mysql_create_db($dbname) {
  78. global $pdo;
  79. return $pdo->exec('CREATE DATABASE '.$dbname);
  80. }
  81.  
  82. function mysql_drop_db($dbname) {
  83. global $pdo;
  84. return $pdo->exec('DROP DATABASE '.$dbname);
  85. }
  86.  
  87. function mysql_errno($connect=NULL) {
  88. global $pdo;
  89. return $pdo;
  90. }
  91.  
  92. function mysql_error($connect=NULL) {
  93. return true; // atrapa
  94. }
  95.  
  96. function mysql_close($connect=NULL) {
  97. global $pdo;
  98. unset($pdo);
  99. }
  100. ?>


A oto przykład jego użycia:
  1. <?php
  2. namespace mysql2pdo;
  3. use PDO;
  4. require 'mysql2pdo.php';
  5.  
  6. /** PLIK DEMONSTRACYJNY **/
  7.  
  8. // ustanowienie nowego połączenia
  9. $polaczenie = mysql_connect('localhost', 'root', 'haslo');
  10.  
  11. // wybranie bazy danych
  12. mysql_select_db('testowe');
  13.  
  14. // ustalenie kodowania unciode
  15. mysql_set_charset('utf8');
  16.  
  17. $pobierz = mysql_query('SELECT * FROM gracze WHERE id = 1 LIMIT 1');
  18.  
  19. $gracz = mysql_fetch_assoc($pobierz);
  20.  
  21. echo $gracz['nazwa'];
  22. ?>


Jedyne o czym trzeba pamiętać, to tych 2 linijkach w każdym z plików zawierającym instrukcje mysql:
  1. namespace mysql2pdo;
  2. use PDO;

Oraz oczywiście dołączeniu samej nakładki wink.gif
Co Wy na to? Bzdet, czy raczej komuś może się przyda?

Ten post edytował SlimShady 25.11.2013, 16:31:01


--------------------
wszystkie drogi prowadzą do manuala :3
Go to the top of the page
+Quote Post

Posty w temacie


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

 



RSS Wersja Lo-Fi Aktualny czas: 26.04.2024 - 20:40