Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [php][mysql] Wiele zapytań sql - jedno po drugim. Ja kto wykonać?
luis2luis
post 11.08.2017, 14:03:25
Post #1





Grupa: Zarejestrowani
Postów: 190
Pomógł: 0
Dołączył: 25.11.2015

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


Witam.

Potrzebuje wykonać kilka operacji SQL, jedna po drugiej. Chodzi o czyszczenie bazy danych i ustawianie nowych użytkowników po czyszczeniu.
Problmeme jest to, że tych zapytyańjest około 80.

Kod wyglada tak:

  1. $sql_czyscimy_baze_delete = '
  2. DELETE FROM `tabela1`;
  3. DELETE FROM `tabela2`;
  4. DELETE FROM `tabela3`;
  5. DELETE FROM `tabela4`;
  6. DELETE FROM `tabela5`;
  7. DELETE FROM `tabela6`;
  8. DELETE FROM `tabela7`;
  9. DELETE FROM `tabela8`;
  10. ';
  11.  
  12. $sql_czyscimy_baze_add = '
  13. INSERT INTO *** () VALUES();
  14. INSERT INTO *** () VALUES();
  15. INSERT INTO *** () VALUES();
  16. ';
  17.  
  18. $sql_czyscimy_baze_update = '
  19. UPDATE tabela2 SET aaa='11' WHERE ***;
  20. UPDATE tabela5 SET aaa='22' WHERE ***;
  21. ....
  22. ';
  23.  
  24.  
  25.  
  26.  
  27. $db2 = new PDO('mysql:host='.$host.';dbname='.$db, $db_user, $db_pass, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'") );
  28. try {
  29. $db2->exec($sql_czyscimy_baze_delete);
  30. $db2->exec($sql_czyscimy_baze_add);
  31. $db2->exec($sql_czyscimy_baze_update);
  32.  
  33.  
  34. #echo "<br>- Dostosowujemy baze! \n"; //Done / Zakończenie
  35. $result_array['status'] = 'OK';
  36. $result_array['msg'] = ' * Dostosowujemy baze!';
  37.  
  38. }
  39. catch (PDOException $e)
  40. {
  41. echo $e->getMessage();
  42. $result_array['status'] = 'ERROR';
  43. $result_array['msg'] = ' * ' . $e->getMessage();
  44.  
  45. //mail();//wysyla infomracje ze blad mysql
  46.  
  47. }


Problemem jest to, że jak się zmieni struktura bazy danych i jakiś zapytanuie w trakcie jest nieporpawne, to dalsze już się nie wykonują :/
Jak można to rozwiązać, żeby mimo niepoprawnego błędnego zapyutania, żeby PDO zwracało mi nomunikat z błędem ale leciało dalej i wykonywało reszte zapytan?

Zauważyłęm też, że mimo, że niektóre zapyutania się nie wykonuja np widziałem że nie wykonało sięczęść insertów, to nie dostalem żadnego komunikatu a mam raportowanie na E_ALL + jest echo echo $e->getMessage();

Go to the top of the page
+Quote Post
nospor
post 11.08.2017, 14:12:43
Post #2





Grupa: Moderatorzy
Postów: 36 457
Pomógł: 6297
Dołączył: 27.12.2004




Ustaw PDO w tryb EXCEPTION to zacznie rzucac wyjatkami. Na chwile obecna nie rzuca


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
luis2luis
post 11.08.2017, 15:16:06
Post #3





Grupa: Zarejestrowani
Postów: 190
Pomógł: 0
Dołączył: 25.11.2015

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


Cytat(nospor @ 11.08.2017, 15:12:43 ) *
Ustaw PDO w tryb EXCEPTION to zacznie rzucac wyjatkami. Na chwile obecna nie rzuca



Dziękuje dobra duszo za pomoc, nie wiedziałem, że trzeba takie raportowanuie właczać, kłania się brak doświadczenia w PDO smile.gif


Generowanie wyjątków włączałe mna dwa sposoby, jednak nie pokazuje mi nic sad.gif

  1. $db2 = new PDO('mysql:host='.$host.';dbname='.$db, $db_user, $db_pass, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'") );
  2. $db2->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);


I drugi sposób

  1. $db2 = new PDO('mysql:host='.$host.';dbname='.$db, $db_user, $db_pass, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'", PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION) );



jednak nie wyświetlajami się wyjątki.

Ten post edytował luis2luis 11.08.2017, 15:20:15
Go to the top of the page
+Quote Post
viking
post 11.08.2017, 15:45:00
Post #4





Grupa: Zarejestrowani
Postów: 6 365
Pomógł: 1114
Dołączył: 30.08.2006

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


Pierwszy sposób jest ja najbardziej poprawny. Skoro się nie wyświetliły to znaczy że nie było wyjątku.


--------------------
Go to the top of the page
+Quote Post
luis2luis
post 11.08.2017, 15:52:03
Post #5





Grupa: Zarejestrowani
Postów: 190
Pomógł: 0
Dołączył: 25.11.2015

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


Cytat(viking @ 11.08.2017, 16:45:00 ) *
Pierwszy sposób jest ja najbardziej poprawny. Skoro się nie wyświetliły to znaczy że nie było wyjątku.



Specjalnie dodałem zapyutabniue DELETE FROM i tabela któej nie ma w bazie, więc powionien się wyświetlic wyjątek.

Zastanawiam się, czy kawałek kodu Jest odpowiedni.:

  1. $db2->exec($sql_czyscimy_baze_delete);
  2. $db2->exec($sql_czyscimy_baze_add);
  3. $db2->exec($sql_czyscimy_baze_update);





Jeszcze jedno Czy zmienną:

  1. $sql_czyscimy_baze = '
  2. DELETE FROM `tabela1`;
  3. DELETE FROM `tabela2`;
  4. DELETE FROM `tabela3`;
  5. DELETE FROM `tabela4`;
  6. DELETE FROM `tabela5`;
  7. DELETE FROM `tabela6`;
  8. DELETE FROM `tabela7`;
  9. DELETE FROM `tabela8`;
  10. INSERT INTO *** () VALUES();
  11. INSERT INTO *** () VALUES();
  12. INSERT INTO *** () VALUES();
  13. UPDATE tabela2 SET aaa='11' WHERE ***;
  14. UPDATE tabela5 SET aaa='22' WHERE ***;
  15. ....
  16. ';


Można jakoś bezpiecznie rozbić, żeby każde zapytanie wykonać oddzielnie i żeby jedne błąd nie wstrzytmywał wszystkiego? myslałem o explode() ale nie wiem jak z wydajnością tego mechanizmu oraz co jeżeli gdzieś w będzie znak ; po którym bym rozbijał.
To jest coś na zasadzie wczytrywania dumpa bazy danych.
Go to the top of the page
+Quote Post
viking
post 11.08.2017, 15:55:22
Post #6





Grupa: Zarejestrowani
Postów: 6 365
Pomógł: 1114
Dołączył: 30.08.2006

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


Aby wykonać wiele zapytań potrzebujesz emulated prepares ale poczytaj o bezpieczeństwie tego.


--------------------
Go to the top of the page
+Quote Post

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: 27.04.2024 - 20:46