Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MYSQL]aktualizacja danych w bazie
Forum PHP.pl > Forum > Przedszkole
Rozpalacz
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?
golaod
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.
wookieb
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.
barthpl
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
wookieb
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);
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.