Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP][MYSQL]aktualizacja danych w bazie, jak najbardziej optymalnie to zrobić
Rozpalacz
post 13.08.2008, 15:05:30
Post #1





Grupa: Zarejestrowani
Postów: 80
Pomógł: 0
Dołączył: 31.01.2006

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


Witam,

w jaki sposób najlepiej aktualizować dane w bazie danych?

Zakładając ze użytkownik edytuje swój profil, zmienia tylko imię,
Do tej pory robiłem aktualizacje całego wiersza. Czy warto i w jaki sposob sprawdzić
co sie zmieniło jeśli chodzi o rekordy i dopiero aktualizować tylko konkretne zmiany?
Go to the top of the page
+Quote Post
golaod
post 13.08.2008, 15:10:45
Post #2





Grupa: Zarejestrowani
Postów: 419
Pomógł: 42
Dołączył: 12.08.2008
Skąd: Wrocław

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


Cóż, no możesz niby to zrobić ale MySQL i tak aktualizuje tylko te kolumny które się zmieniły. Więc to w sumie nie ma dla Ciebie większego znaczenia.
Go to the top of the page
+Quote Post
wookieb
post 13.08.2008, 15:20:22
Post #3





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Możesz sobie porównywać jakei dane mial user wczesniej a jakie teraz ale czy jest sens? Nic na tym nie zyskasz bo w php i tak bedziesz musial sprawdzić co zostało zmienione a co nie a to zajmuje wiecej czasu niz update z wszystkimi polami.


--------------------
Go to the top of the page
+Quote Post
barthpl
post 13.08.2008, 15:58:51
Post #4





Grupa: Zarejestrowani
Postów: 142
Pomógł: 35
Dołączył: 5.12.2006
Skąd: Wrocław

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


A jeżeli zrobimy sobie model który będzie miał pola pobrane z bazy zapisane w jednej tablicy ($vals) a wprowadzone zmiany będzie przechowywał w innej ($valsChanged). Do polecenia update będą przekazywane tylko kolumny zapisane w $valsChanged. Po wykonaniu polecenia update nastąpi nadpisanie zmiennych z tablicy $vals przez zmienne z tablicy $valsChanged a sama tablica $valsChanged zostanie wyczyszczona.

W wypadku gdy użytkownik będzie chciał się dostać do obecnej wartości danej kolumny zostanie zwrócona wartość z tablicy $valsChanged jeżeli istnieje w przeciwnym warunku z tablicy $vals.

  1. <?php
  2. class MyObject
  3. {
  4. private $valsChanged = array();
  5. private $vals = array();
  6.  
  7. ...
  8.  
  9. public function getVals( $name )
  10. {
  11. // oczywiście można dożucić sprawdzanie czy dana kolumna faktycznie istnieje
  12. return isset($this->valsChanged [$name]) ? $this->valsChanged [$name] : $this->vals[$name];
  13. }
  14.  
  15. public function update()
  16. {
  17. $querySet = '';
  18. foreach( $this->valsChanged as $key => $val )
  19. $querySet .= "$key = '$val', ';
  20.  
  21. $queryWhere
  22. foreach( $this->vals as $key => $val )
  23. $queryWhere.= "$key = '$val' AND ;
  24.  
  25. $query = sprintf( "UPDATE tabela SET %s WHERE %s", substr($querySet, 0, -2), substr($queryWhere, 0, -4) );
  26. mysql_query( $query );
  27. }
  28. }
  29. ?>


To tylko taki schemat ideologiczny nie sprawdzany. Ale czy to nie będzie bardziej efektywne niż za każdym razem wysyłanie wszystkiego questionmark.gif


--------------------
Jeżeli pomogłem rozwiązać Twój problem, kliknij pomógł.
Go to the top of the page
+Quote Post
wookieb
post 13.08.2008, 19:34:42
Post #5





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Wiec w takim razie zmierz czas wykonywania skryptów i zobacz, która metoda jest szybsza.
Kod
function pobierz_czas(){

list($usec, $sec) = explode(" ", microtime());

return((float)$usec + (float)$sec);

}
$start=pobierz_czas();

// tutaj kod do zmierzenia

printf("Skrypt wykonał się w %.5f sekund.", pobierz_czas()-$start);


--------------------
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: 19.07.2025 - 09:48