Autor Wątek: Szukanie rekordu jednocześnie z dwóch kolumn w MySQL  (Przeczytany 1078 razy)

0 użytkowników i 1 Gość przegląda ten wątek.

Offline falcon

  • Młody
  • **
  • Wiadomości: 177
  • Karma: +0/-0
    • Zobacz profil
Szukanie rekordu jednocześnie z dwóch kolumn w MySQL
« dnia: Maj 08, 2017, 09:14:50 »
Cześć,

Mam taki kod, który szuka rekordów z bazy danych

$uzytkownicy = Uzytkownicy::find(array(
'conditions' => 'email LIKE :haslo: OR imie LIKE :haslo: OR nazwisko LIKE :haslo: OR miasto LIKE :haslo: OR nazwa_firmy LIKE :haslo: OR rabat LIKE :haslo: OR telefon LIKE :haslo:',
'bind' => array('haslo' => '%' . $szukana_fraza . '%'),
                ));

Jak podam imię albo nazwisko to działa dobrze. Jednak gdy podam jednocześnie imię i nazwisko np 'Adam Nowak' skrypt nie znajdzie takiego użytkownika, bo w w bazie danych nie ma kolumny, która by posiadała zapisane jednocześnie imię i nazwisko.

Czy jest fajny sposób, aby znajdować użytkownika po wpisaniu jego imienia razem z nazwiskiem poza dzieleniem szukanej frazy po spacji jako separatorze?
// Pisz wiadomości zawsze tak, abyś po kilku latach, zapominając, że to Twój nick, czytając je, stwierdził: 'kurde, spoko koleś'

Offline Riu

  • Świeży
  • *
  • Wiadomości: 42
  • Karma: +0/-0
  • Płeć: Mężczyzna
    • Zobacz profil
    • Riupress
Odp: Szukanie rekordu jednocześnie z dwóch kolumn w MySQL
« Odpowiedź #1 dnia: Maj 09, 2017, 10:27:42 »
Nie definiuj na sztywno zapytania tylko je komponuj na podstawie danych wejściowych. Innymi słowy:
$conditions = 'email LIKE parametr';
if(jest jakiś parametr){ $conditions .= 'OR parametr';}
Masz złożyć zapytanie i dopiero je wstawić.

Tak przy okazji. Takie używanie 'or' w połączeniu z 'like' i zamykaniem frazy w %... toż to jakaś masakra.
Projektuję i tworzę dedykowane systemy zarządzania treścią, interfejsy użytkownika i aplikacje mobilne. Tworzę i buduję startupy. Riupress

Offline falcon

  • Młody
  • **
  • Wiadomości: 177
  • Karma: +0/-0
    • Zobacz profil
Odp: Szukanie rekordu jednocześnie z dwóch kolumn w MySQL
« Odpowiedź #2 dnia: Maj 10, 2017, 12:36:42 »
dziękuję za Twoją opinię,

ten kod działa i jest bezpieczny,

"Nie definiuj na sztywno zapytania tylko je komponuj na podstawie danych wejściowych. Innymi słowy:"

mam jedno pole wejściowe $szukana_fraza, którą trzeba wyszukać w wielu kolumnach

rozwiązałem problem:

  $szukana_fraza = $this->request->get("szukaj");
              $tablica_frazy = explode(' ', $szukana_fraza);
              if(isset($tablica_frazy[1]))
              {
                //szukaj gdy wprowadzono imie nazwisko (rodziela frazę po spacji)
                 $uzytkownicy = Uzytkownicy::find(array(
                    'conditions' => '(miasto LIKE :haslo_1: AND miasto LIKE :haslo_2:) OR nazwa_firmy LIKE :haslo_1: OR rabat LIKE :haslo_1: OR telefon LIKE :haslo_1: OR (imie LIKE :haslo_1: AND nazwisko LIKE :haslo_2:)',
                    'bind' => array('haslo_1' => '%' . $tablica_frazy[0] . '%','haslo_2' => '%' . $tablica_frazy[1] . '%')
                   
                ));
              }
              else
              {
                 $uzytkownicy = Uzytkownicy::find(array(
                    'conditions' => 'email LIKE :haslo: OR imie LIKE :haslo: OR nazwisko LIKE :haslo: OR miasto LIKE :haslo: OR nazwa_firmy LIKE :haslo: OR rabat LIKE :haslo: OR telefon LIKE :haslo:',
                    'bind' => array('haslo' => '%' . $szukana_fraza . '%'),
                 
                ));
              }
// Pisz wiadomości zawsze tak, abyś po kilku latach, zapominając, że to Twój nick, czytając je, stwierdził: 'kurde, spoko koleś'

Offline Riu

  • Świeży
  • *
  • Wiadomości: 42
  • Karma: +0/-0
  • Płeć: Mężczyzna
    • Zobacz profil
    • Riupress
Odp: Szukanie rekordu jednocześnie z dwóch kolumn w MySQL
« Odpowiedź #3 dnia: Maj 12, 2017, 13:38:11 »
To że działa, to nie znaczy, że tak się powinno robić. Pomijając jak brzydko to wygląda - to jest bardzo niewydajne. Mechanizm składania zapytań zamiast definiowania ich na sztywno przydaje się w wielu miejscach więc warto go stosować (np sklepy internetowe, katalogi. etc).
Projektuję i tworzę dedykowane systemy zarządzania treścią, interfejsy użytkownika i aplikacje mobilne. Tworzę i buduję startupy. Riupress