Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MySQL]PDO transakcja
Forum PHP.pl > Forum > Przedszkole
gawar
Witam, Mam napisaną bazę, która do tej pory opierała się na zapytaiach do bazy mysql za pomocą mysql_query, postanowiłem się przesiąść na PDO. Przerobiłem mój kod z zapytaniami na kod korzystający z PDO. Chciałbym się dowiedzieć czy dobrze wszsytko robie:) Poniżej jest kod, który najpierw sprawdza czy taki rekord nie został już dodany i jeżeli nie to w transakcji są inserty które wstawiają dane z formularzy do kilku tabel (zależnych od siebie) Poniżej kod
  1. $username = 'login';
  2. $password = 'haslo';
  3. try
  4. {
  5. $sth = new PDO("mysql:host=localhost;dbname=pdocmw", $username, $password, array
  6. (PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
  7. $sth->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  8. }
  9. catch (PDOException $e)
  10. {
  11. echo 'Error!:Błąd połączenia z bazą danych ' . $e->getMessage();
  12. die();
  13. }
  14. try
  15. {
  16. $stmt = $sth->prepare('SELECT id_miejsce FROM t_miejsce WHERE id_cm=:cm AND sektor=:sektor AND rzad=:rzad AND miejsce=:miejsce ');
  17. $stmt->bindValue(':cm', $cm, PDO::PARAM_INT);
  18. $stmt->bindValue(':sektor', $sektor, PDO::PARAM_INT);
  19. $stmt->bindValue(':rzad', $rzad, PDO::PARAM_INT);
  20. $stmt->bindValue(':miejsce', $miejsce, PDO::PARAM_INT);
  21.  
  22. $stmt->execute();
  23. }
  24. catch (PDOException $e)
  25. {
  26. echo 'Error!: Wystąpił błąd podczas wykonywania zapytania' . $e->getMessage();
  27. die();
  28. }
  29.  
  30. if ($stmt->rowCount() == 1)
  31. {
  32. $row = $stmt->fetch();
  33. $id_miejsce = $row["id_miejsce"];
  34. echo 'Miejsce o takich parametrach już zostało dodane do bazy, jeżeli chcesz do niego przejść nacisnij <a class="koniec" href="index.php?id=wyswietl_miejsce.php&id_miejsce=' .
  35. $id_miejsce . '">tutaj</a>';
  36. } else
  37. {
  38. try
  39. {
  40. $sth->beginTransaction();
  41. $stmt = $sth->prepare('INSERT INTO t_miejsce SET id_cm=:cm, sektor=:sektor, rzad=:rzad, miejsce=:miejsce, dokument=:dokument, karta=:karta, pojedynczy=:pojedynczy, podwojny=:podwojny, info_d_m=:info_d_m ,data_p_m=NOW()');
  42.  
  43. $stmt->bindValue(':cm', $cm, PDO::PARAM_INT);
  44. $stmt->bindValue(':sektor', $sektor, PDO::PARAM_INT);
  45. $stmt->bindValue(':rzad', $rzad, PDO::PARAM_INT);
  46. $stmt->bindValue(':miejsce', $miejsce, PDO::PARAM_INT);
  47. $stmt->bindValue(':dokument', $dokument, PDO::PARAM_STR);
  48. $stmt->bindValue(':karta', $karta, PDO::PARAM_STR);
  49. $stmt->bindValue(':pojedynczy', $pojedynczy, PDO::PARAM_INT);
  50. $stmt->bindValue(':podwojny', $podwojny, PDO::PARAM_INT);
  51. $stmt->bindValue(':info_d_m', $info_d_m, PDO::PARAM_STR);
  52.  
  53. $stmt->execute();
  54.  
  55. $dodane_miejsce = $sth->lastInsertId();
  56.  
  57. $stmt = $sth->prepare('INSERT INTO t_dane SET imie=:imie, nazwisko=:nazwisko, data_ur=:data_ur , info=:info, id_miejsce=:id_miejsce, data_p_zm=NOW()');
  58.  
  59. $stmt->bindValue(':imie', $imie, PDO::PARAM_STR);
  60. $stmt->bindValue(':nazwisko', $nazwisko, PDO::PARAM_STR);
  61. $stmt->bindValue(':data_ur', $data_ur, PDO::PARAM_STR);
  62. $stmt->bindValue(':info', $info, PDO::PARAM_STR);
  63. $stmt->bindValue(':id_miejsce', $dodane_miejsce, PDO::PARAM_INT);
  64.  
  65.  
  66. $stmt->execute();
  67.  
  68. $dodany_zmarly = $sth->lastInsertId();
  69.  
  70. $stmt = $sth->prepare('INSERT INTO t_dane_dysponenta SET imie_dys=:imie_dys, nazwisko_dys=:nazwisko_dys, adres=:adres, info_d=:info_d, data_p_d=NOW()');
  71.  
  72. $stmt->bindValue(':imie_dys', $imie_dys, PDO::PARAM_STR);
  73. $stmt->bindValue(':nazwisko_dys', $nazwisko_dys, PDO::PARAM_STR);
  74. $stmt->bindValue(':adres', $adres, PDO::PARAM_STR);
  75. $stmt->bindValue(':info_d', $info_d, PDO::PARAM_STR);
  76.  
  77. $stmt->execute();
  78.  
  79. $dodany_dys = $sth->lastInsertId();
  80.  
  81. $stmt = $sth->prepare('INSERT INTO t_odnowienie SET data_odn=:data_odn, info_o=:info_o, data_p_o=NOW()');
  82.  
  83. $stmt->bindValue(':data_odn', $data_odn, PDO::PARAM_STR);
  84. $stmt->bindValue(':info_o', $info_o, PDO::PARAM_STR);
  85.  
  86. $stmt->execute();
  87.  
  88. $dodane_odn = $sth->lastInsertId();
  89.  
  90. $stmt = $sth->prepare('INSERT INTO t_k_odnowienie SET id_dysponenta=:id_dysponenta, id_odnowienie=:id_odnowienie , id_miejsce=:id_miejsce, data_p_odn=NOW()');
  91.  
  92. $stmt->bindValue(':id_dysponenta', $dodany_dys, PDO::PARAM_INT);
  93. $stmt->bindValue(':id_odnowienie', $dodane_odn, PDO::PARAM_INT);
  94. $stmt->bindValue(':id_miejsce', $dodane_miejsce, PDO::PARAM_INT);
  95.  
  96. $stmt->execute();
  97.  
  98. $sth->commit();
  99.  
  100.  
  101. }
  102. catch (PDOException $e)
  103. {
  104. $sth->rollBack();
  105. echo 'Error!: Wystąpił błąd podczas wykonywania zapytania' . $e->getMessage();
  106. die();
  107. }
  108.  
  109. }
  110. $stmt->closeCursor();

zmienne które podpinam pod zapytaniem sprawdzam w innym pliku czy teraz powininiem wywalic z tego sprawdzania addslashes() ? Czy z powyższym kodem da się jeszcze coś zrobić żeby usprawnić jego działanie?
nospor
Cytat
czy teraz powininiem wywalic z tego sprawdzania addslashes()
Powinieneś
gawar
a czy mój sposób zastosowania pdo jest ok?
nospor
Wygląda ok smile.gif
gawar
a można może w jakiś sposób te "bindowanie" usprawnić? żeby nie było aż tyle kodu?
Sephirus
metoda execute przyjmuje w argumencie tablicę bindowań. Możesz zatem dać jej coś na styl:

  1. // zamiast
  2.  
  3. $stmt->bindValue(':cm', $cm, PDO::PARAM_INT);
  4. $stmt->bindValue(':sektor', $sektor, PDO::PARAM_INT);
  5. $stmt->bindValue(':rzad', $rzad, PDO::PARAM_INT);
  6. $stmt->bindValue(':miejsce', $miejsce, PDO::PARAM_INT);
  7.  
  8. $stmt->execute();
  9.  
  10. // dać
  11.  
  12. $stmt->execute(array(
  13. ':cm' => $cm,
  14. ':sektor' => $sektor,
  15. ':rzad' => $rzad,
  16. ':miejsce=> $miejsce
  17. ));


Aczkolwiek twoje podejście jest w tym kontekście wzorowe 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.