Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP][MYSQL] "Niezwykły" update mysql, niezwykły - tzn nie taki standardowy :-)
mefjiu
post
Post #1





Grupa: Zarejestrowani
Postów: 313
Pomógł: 5
Dołączył: 22.03.2005

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


Witam, mam dwie funkcje, jedna do dodawania lokalizacji druga do kasowania lokalizacji.

Lokalizacja - jest to liczba. a tabela w której jest to umieszczone to "text" i wartość wygląda np tak 1,3,6,12,33,4 - czyli oddzielone przecinkiem.

Aby pokazać jak najepiej problem przedstawię na początku funkcję do dodawania lokalizacji:
  1. <?php
  2. function add_location($array){
  3.        $id_site = $array['site'];
  4.        $location = $array['location'];
  5.  
  6.        $sql ="    UPDATE ".DB_PREFIX."site
  7.                SET id_location=IF(id_location='','$location', CONCAT(id_location,',$location'))
  8.                WHERE id='$id_site'
  9.                AND NOT FIND_IN_SET('$location', id_location)";
  10.        $res =& $this->_db->query($sql);
  11.    }
  12. ?>


Zapytanie sprawdza czy dany rekord istnieje, jeżeli nie istnieje to dodaje po przecinku.

A teraz potrzebuję funkcję która będzie usuwać daną lokalizację z bazy danych.

Aktualnie mam to rozwiązane na zasadzie:

  1. <?php
  2. function remove_location($array){
  3.        $id_site = $array['site'];
  4.        $location = $array['location'];
  5.        
  6.    $sql ="SELECT id_location FROM ".DB_PREFIX."site WHERE id = '$id_site' ";
  7.                $res =& $this->_db->query($sql);
  8.                $row = $res->fetchRow(MDB2_FETCHMODE_ASSOC);
  9.    
  10.        $id_array = explode(',',$row['id_location']);
  11.        $kay_delete = array_search($location,  $id_array);
  12.        unset($id_array[$kay_delete]);
  13.        
  14.        foreach ($id_array as $id){
  15.            $id_sql .= $id.",";
  16.        }
  17.        $id_sql = substr($id_sql,0,-1);
  18.        
  19.        $sql ="    UPDATE ".DB_PREFIX."site
  20.                SET id_location='$id_sql'
  21.                WHERE id='$id_site'";
  22.        $res =& $this->_db->query($sql);
  23.    }
  24. ?>


Czyli najpierw pobieram dane na temat lokalizacji następnie obrabiam dane i dopiero robię update.


Czy jest możliwość jakoś to poprawić tzn na takim samym rozwiązaniu jak przy dodawaniu aby nie używać funkcji php a wszystko zrobić po stronie mysql ?

Ten post edytował mefjiu 21.03.2009, 00:12:01
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 3)
erix
post
Post #2





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Ja bym proponował przeprojektowanie bazy tak, aby można było wykorzystać relacje, a nie podawać po przecinku.
Go to the top of the page
+Quote Post
mefjiu
post
Post #3





Grupa: Zarejestrowani
Postów: 313
Pomógł: 5
Dołączył: 22.03.2005

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


Tak nie pierwsza osoba mi to mówi, ale przy obecnym projekcie jest to nie możliwe. Muszą to rozwiązać na tej zasadzie. Jeżeli się nie da zostanie tak jak jest. Nie jest to strasznie obciążają, a dodatkowo jest t wykonywane po stronie użytkownika- ajax. Ale fajnie by było zoptymalizować do maximum.
Go to the top of the page
+Quote Post
erix
post
Post #4





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Cytat
a dodatkowo jest t wykonywane po stronie użytkownika- ajax.

Skoro DB, to nie jest po stronie użytkownika. (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)

Cytat
Ale fajnie by było zoptymalizować do maximum.

Przeprojektuj bazę, bo o optymalizacji nie ma mowy. Szybciej jest wyciągnąć rekord wg zoptymalizowanego indeksu niż obrabiać przecinki w każdym z osobna.
Go to the top of the page
+Quote Post

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: 6.10.2025 - 21:48