Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MYSQL] "Niezwykły" update mysql
Forum PHP.pl > Forum > Przedszkole
mefjiu
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 ?
erix
Ja bym proponował przeprojektowanie bazy tak, aby można było wykorzystać relacje, a nie podawać po przecinku.
mefjiu
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.
erix
Cytat
a dodatkowo jest t wykonywane po stronie użytkownika- ajax.

Skoro DB, to nie jest po stronie użytkownika. 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.
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.