Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP][MySQL]Dodanie pierwszej oceny ucznia do bazy danych
Userr
post
Post #1





Grupa: Zarejestrowani
Postów: 56
Pomógł: 0
Dołączył: 27.10.2015

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


Będę miał panel, w którym będą podawał takie dane o uczniu:

Cytat
id ucznia
imię
nazwisko
ocena


Będą dwie tabele:

Cytat
uczniowie - pola:
id
imię
nazwisko


Cytat
oceny - pola:
id
ocena
id_ucznia

Skrypt będzie wykrywał (po id ucznia, czyli po polu id z tabeli uczniowie) czy taki uczeń jest już w tabeli. Jeżeli jest - to po prostu skrypt doda ocenę do tabeli oceny. Jeżeli nie ma, to najpierw doda imię i nazwisko do tabeli uczniowie, a następnie doda ocenę do tabeli oceny.

I właśnie o ten drugi przypadek chciałem zapytać - czy jeżeli napiszę w skrypcie PHP po sobie dwa zapytania MySQL:

  1. $sql = "INSERT INTO uczniowie (imie, nazwisko) VALUES ('Jan', 'Kowalski')";
  2.  
  3. $sql = "INSERT INTO oceny (ocena, id_ucznia) VALUES ('4', '437');
"

to czy jest gwarancja, że jako pierwsze doda się zawsze zapytanie, które jest pierwsze w kodzie (wpis do tabeli uczniowie)? Czy też może się coś zdarzyć (bardzo rzadko, ale jednak), że czasami jako pierwsze doda się zapytanie, które jest niżej w kodzie (wpis do tabeli oceny)? Jeżeli tak, to czy można się przed tym jakoś zabezpieczyć? Czy transakcje mogłyby tutaj pomóc?

Ten post edytował Userr 12.03.2017, 16:16:00
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
Userr
post
Post #2





Grupa: Zarejestrowani
Postów: 56
Pomógł: 0
Dołączył: 27.10.2015

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


Przykładowo te dwie powiązane transakcje:

  1. try{
  2.  
  3. //Query 1: Attempt to insert the payment record into our database.
  4. $sql = "INSERT INTO payments (user_id, amount) VALUES (?, ?)";
  5. $stmt = $pdo->prepare($sql);
  6. $stmt->execute(array(
  7. $userId,
  8. $paymentAmount,
  9. )
  10. );
  11.  
  12. //Query 2: Attempt to update the user's profile.
  13. $sql = "UPDATE users SET credit = credit + ? WHERE id = ?";
  14. $stmt = $pdo->prepare($sql);
  15. $stmt->execute(array(
  16. $paymentAmount,
  17. $userId
  18. )
  19. );
  20.  
  21. //We've got this far without an exception, so commit the changes.
  22. $pdo->commit();
  23.  
  24. }
  25. //Our catch block will handle any exceptions that are thrown.
  26. catch(PDOException $e){
  27. //An exception has occured, which means that one of our database queries
  28. //failed.
  29. //Print out the error message.
  30. echo $e->getMessage();
  31. //Rollback the transaction.
  32. $pdo->rollBack();
  33. }


http://thisinterestsme.com/php-pdo-transaction-example/

Jak dobrze rozumiem transakcje zapewniają, że jeżeli chociaż jedno z tych dwóch zapytań się nie wykona, to nie wykona się żadna z nich, ale czy jest pewność, że jeżeli wykonają się w odwrotnej kolejności (czyli najpierw aktualizacja profilu, a dopiero później dodanie pieniędzy), to też żadna z nich nie zostanie wykonana?
Go to the top of the page
+Quote Post

Posty w temacie


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: 29.12.2025 - 12:18