Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Sposob na zapytanie SQL zalezne od wielu $
Forum PHP.pl > Forum > PHP
Mr Groch
Witam

Czy da sie w deklaracji zmiennej umiescic warunek?
np takie cos:

$cos = if($bla='bla'){echo('bla to bla');};

Wiem ze teraz zapis ten jest bez sensu, ale czy da sie
takie cos poprawnie zapisac?

Jezlei nie to prosilbym o pomoc w jaki sposob rozwiazac problem:

Zapytanie do sql:

select * from tabela /*jezeli jakas zmienna ma okreslona wartosc to: */ where cos = '$zmienna' /*jezlei inna zmienna ma okreslona wartosc to: */ and cos2 = '$zmienna2' /*i tak dalej*/;

Wyjasnienie:

Chcialbym by zapytanie do MySQL bylo rozne w zaleznosci od wartosci
paru zmiennych. Wiem, ze mozna to zrobic w paru(nastu) warunkach if i
tyle samo roznych wersji zapytan, ale tym sposobem kod rozroslby sie
naprawde za bardzo, gdyz tych zmiennych od ktorych zapytanie bedzie zalezne
jest bardzo duzo..

Z gory dziekuje...
NuLL
  1. <?php
  2.  
  3. $cos = ($bla=='bla')'bla to bla' : '';
  4.  
  5. ?>


Co do drugiego pytanie - w manualu MySQL-a poszukaj o słowie IF smile.gif
Manual do ściągnięcia na stronie MySQL-a smile.gif (wreszcie nawet w .chm)
Mr Groch
Dzieki ale jest maly problem:

  1. SELECT *
  2. FROM $tabela WHERE IF($_typ!='','typ='$_typ'','')


MySQL sie pluje, ze niby za duzo apostrof w wyrazeniu ale gdy zostawie
'typ=$_typ' to otatecznie zapytanie bedzie wygladalo WHERE typ = CB i tutaj
bedzie sie plul, ze nie ma takiej kolumny CB (musi byc w apostrofach)...

A tak wogole to sytuacja wyglada tak:

Mam pobrane z tabeli dane i sa ladnie wyswietlone na stronce.
Jednakze na stronce znajduje sie formularz z 3 polami <select> i chce by dane
z tabeli byly odpowiednio "filtrowane" w zaleznosci od tego co zostalo
wybrane w polach <select>

Tymczasowo zrobilem to metoda duzej ilosci sprawdzan co zostalo wybrane
z pol <select> i w zaleznosci od tego, przygotowalem mnostwo roznych wersji zapytan
SQL - dziala ale skrypt obslugujacy ten formularz zajmuje naprawde duzo smile.gif

Tak to wyglada teraz:

  1. <?php
  2.  $_typ = $_POST[styp];
  3.  $_system = $_POST[ssystem];
  4.  $_mapa = $_POST[smapa];
  5.  
  6.  
  7.  if (($_typ=='') && ($_system=='') && ($_mapa=='')) {
  8. $query = &#092;"select * from \".$this->prefix.\"clanwars\";
  9.  
  10. $query .= &#092;" order by time desc limit $start,{$this->show}\";
  11. } // end if
  12.  
  13.  if (!($_typ=='') && ($_system=='') && ($_mapa=='')) {
  14. $query = &#092;"select * from \".$this->prefix.\"clanwars where (typ = '$_typ')\";
  15.  
  16. $query .= &#092;" order by time desc limit $start,{$this->show}\";
  17.  } // end if
  18.  
  19.  if (!($_typ=='') && !($_system=='') && ($_mapa=='')) {
  20. $query = &#092;"select * from \".$this->prefix.\"clanwars where (typ = '$_typ' and system = '$_system')\";
  21.  
  22. $query .= &#092;" order by time desc limit $start,{$this->show}\";
  23.  } // end if
  24.  
  25.  if (!($_typ=='') && !($_system=='') && !($_mapa=='')) {
  26. $query = &#092;"select * from \".$this->prefix.\"clanwars where (typ = '$_typ' and system = '$_system' and mapa = '$_mapa')\";
  27.  
  28. $query .= &#092;" order by time desc limit $start,{$this->show}\";
  29.  } // end if
  30.  
  31.  if (!($_typ=='') && ($_system=='') && !($_mapa=='')) {
  32. $query = &#092;"select * from \".$this->prefix.\"clanwars where (typ = '$_typ' and mapa = '$_mapa')\";
  33.  
  34. $query .= &#092;" order by time desc limit $start,{$this->show}\";
  35.  } // end if
  36.  
  37.  if (($_typ=='') && !($_system=='') && ($_mapa=='')) {
  38. $query = &#092;"select * from \".$this->prefix.\"clanwars where (system = '$_system')\";
  39.  
  40. $query .= &#092;" order by time desc limit $start,{$this->show}\";
  41.  } // end if
  42.  
  43.  if (($_typ=='') && !($_system=='') && !($_mapa=='')) {
  44. $query = &#092;"select * from \".$this->prefix.\"clanwars where (system = '$_system' and mapa = '$_mapa')\";
  45.  
  46. $query .= &#092;" order by time desc limit $start,{$this->show}\";
  47.  } // end if
  48.  
  49.  if (($_typ=='') && ($_system=='') && !($_mapa=='')) {
  50. $query = &#092;"select * from \".$this->prefix.\"clanwars where (mapa = '$_mapa')\";
  51.  
  52. $query .= &#092;" order by time desc limit $start,{$this->show}\";
  53.  } // end if
  54.  
  55. ?>


http://www.hordasquad.com/web/clanwars.php

PS. Co do warunku w zmiennej - nie wiem czemu ale korszystajac z podanego
przykladu zawsze zmienna otrzymywala wartosc taka jak przy warunku=true
luinnar
A nie lepiej to zrobić w stylu:
  1. <?php
  2. $query = 'SELECT pole1, pole2, pole3 FROM tabela WHERE ';
  3. switch($zmienna)
  4. {
  5.  case 'wartość1':
  6. $query .= 'id = 15'; // <-- przykładowy warunek, pamiętaj o kropce pomiędzy $query a =
  7. break;
  8.  case 'wartość2':
  9. $query .= 'dzial = 'cos''; // <-- przykładowy warunek2
  10. break;
  11. }
  12.  
  13. ?>
nospor
a ja to zawsze robię tak:
  1. <?php
  2. $query = 'SELECT pole1, pole2, pole3 FROM tabela WHERE '.($zmienna==$cos?'id=15':'dzial='cos'').' ';
  3. ?>
SongoQ
Stosowanie warunkow w samym sqlu zpowalnia wykonywanie zapytan. Lepiej wygenerowac zapytanie w php tak aby bylo optymalne i przetwazanie bylo bardzo szybkie.

No chyba ze piszesz wlasne funkcje baz danych.
Mr Groch
Dzieki Wam za pomoc ale niestety przyklady, ktore podaliscie
sprawdzilyby sie tylko gdy zapytanie byloby zalezne od 1 zmiennej,
a w moim przypadku ma byc zalezne od wartosci 3 niezaleznych od siebie
zmiennych (planuje nawet wiecej)

Jezeli nie da sie tego zrobic w inny sposob, niz taki jaki przytoczylem wczesniej
to trudno - pogodze sie z tym smile.gif
nospor
No to zrób se tablicę z warunkami, do niej wkladasz kolejne warunki w zaleznosci od zmiennych a potem ilmplode:
  1. <?php
  2.  
  3. $wh=array();
  4. if ($cos1 && $cos2)
  5. {
  6.  $wh[]='war=wart';
  7.  $wh[]='war2=wart2';
  8. } 
  9. else
  10. //....
  11. $sql='.... where '.implode(' and ',$wh);
  12.  
  13. ?>
Mr Groch
O dzieki - implode() - nie wiedzialem ze takie cos istnieje a wlasnie tego szukalem smile.gif
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.