Autor Zpráva
Jcas
Profil *
Prosím nekamenujte mě, za mou hloupost a za to že máte pocit, že se rovnou ptám a nestuduji. Databázi jsem věnoval už min. 20 hod.

Min. 5 vstupních polí a každé může být vylněno, ale nemusí.
Jak zpracovat to velké množství možností? (velké množství podmínek?)

SELECT vrátí tabulku. správně?
Následný SELECT zpracovává vrácenou tabulku, nebo původní v databázi?

Lze něco takového, jako WHERE sloupec=*? příkl.
if(isset $_POST['neco']) {
$data=$_POST['neco']}
else {$data='*'}

SELEC * from tabulka WHERE sloupec=$data


A nebo lze kombinovat sql dotaz s php?
SELECT * from tabulka if(...) {echo WHERE...};
Jcas
Profil *
Lze si nějak napřed poskládat sql dotaz ateprve až je poskládaný, tak ho teprve položit (provést)?
panther
Profil
Jcas:
Lze si nějak napřed poskládat sql dotaz ateprve až je poskládaný, tak ho teprve položit (provést)?
ano. To sis ostatně mohl zkusit, že?
Jcas
Profil *
To sis ostatně mohl zkusit, že? Nemohl zatím nemám na čem. Zatím se jen snažím vymeslet, jaká bude struktura. Chcu se vyvarovat předchozím svým zkušenostem, kdy jsem tvořil stylem"ještě potřebuji tohle - plác to tam, aha tady ještě jedna neošetrená možnost-plác to tam, a tohle přeplácnem a tamto zaplácnem.
Chcu si napřed promyslet strukturu a pak to napsat.


Mám jedno řešení, jak zpracovat více vstupních polí.

1. Pokud nebude form odeslán (input hidden name="odeslan") - rovnou zobrazím celou tabulku

2.form byl odeslán, takže uděláme tu (pro mě složitou) selekci.
Všech 7 vstupních polí projdu a pokud bude vyplněno, jeho hodnotu vložím do $prikl1-$prikl7
Načtu opět celou tabulku
$vylsedek=SELECT * from tabulka


Budu číst tabulku po řádcích, tvořit pole a volat funkci kontrola()
mysql_fetch_array($vysledek) {kontrola(slopec['1'], sloupec['2']...)}


A další selekci provedu a na takovém poli
Řádek se zobrazí pokud:
if((!isset($prikl1)||$prikl1==sloupec['1']) || (!isset($prikl2)||$prikl2==sloupec['2']) ||........) {zobraz(slopec['1'], sloupec['2']...))}


Není to sice to co jsem chtěl, ale takhle by to snad šlo.
Takhle tahám z databáze celou tabulku a já původně chtěl tahat už vyselektovaná data.
Ale nikde nemůžu najít nějakou vzorovou strukturu. Problém je že mám moc dotazů.
Select * ...
...where input1 vyplnen
...where input1 vyplnen ale nerovná se
...where input1 vyplnen a input2 vyplnen
...atd
...atd
xmark
Profil
Jcas:
Nemyslíš, že si to zbytečně komplikuješ?

SELECT neco1, neco2, neco3 from tabulka where x=1 and y=2 and z=3


je prostě string. If používat umíš, tak ho prostě po odeslání formuláře desetkrát použij a seskládej si dotaz na míru.
Jcas
Profil *
Takhle nějak jsem si to představoval, ale asi řeším kravinu, ovšem a musím se vráti k dotazu č.1
Problém mám např. když pole 3 nebude vyplněno a dotaz bude
where sloupec3=všechno


Může se udělat
$text2='where sloupec2=$hodnota2'
$text3=""
where sloupec1=$hodnota1'.$text2.' and '.$text3.' and '.text4.' 
xmark
Profil
Proč chceš skládat SQL dotaz, který bude vytahovat řádky, kde sloupec1 rovná se jedna a zároveň i druhá a třetí hodnota?
xmark
Profil
A k tomu #1 :

Pokud jde o to else {$data='*'}, tak to sice do dotazu nějak začlenit můžeš, ale je to zbytečný. Opravdu nemá smysl vytvářet podmínku, která je vždy splněna.
Jcas
Profil *
Odkaz

Tuhle str. potřebuji předělat a uživatel by měl mít možnost si nechat zobrazit výstavy dle data, kraje, pořadatele, typu výstavy. Takže mám vlastně jenom 5 vstupů, ale každý může být a nemusí být vyplněn. Mohu chtít zobrazit pouze dle kraje, ale také mohu chtít zobrazit dle kraje && datumu $$ typu.
xmark
Profil
Když nebude vyplněn, tak ho do selectu nezahrneš.

$sql= "SELECT * FROM tbl WHERE ID>0";
if (!empty($_POST["barva"])) {$sql.=" AND barva='".$_POST["barva"]."'";};
if (!empty($_POST["velikost"])) {$sql.=" AND velikost='".$_POST["velikost"]."'";};
if (!empty($_POST["pocet"])) {$sql.=" AND pocet='".$_POST["pocet"]."'";};
if (!empty($_POST["druh"])) {$sql.=" AND druh='".$_POST["druh"]."'";};



Proč je tam to ID, to máš za domácí úkol. (obešlo by se to i bez toho, ale spěchám)
Jcas
Profil *
Tak tohle je přesně to co jsem hledal a co jsem nevěděl jak udělat.
Jestli tomu teda dobře rozumím, tak první přiřazení $sql zajistí vybrání všech řádků. Myslím, že to id tam je kvůly prázdné tabulce.

A následně ta tečka před = zajistí přidání podmínky. Takže připojení k předchozímu sql dotazu.
Asi špatně studuji. Tečku jako zřetězení jsem nalezl mockrát, ale .= vlastně ani neznám, takže si domýšlím, jak asi funguje zřetězení+přiřazení.
Keeehi
Profil
Jcas:
To ID>0 je tam proto, aby se nemusel zabývat s tím, jestli tam má AND být nebo ne. Klidně by tam mohlo být 1=1. Jinak,, kdyby tam tato vždy pravdivá podmínka nebyla, musel by jsi nejdříve kontrolovat, zda to co do řetězce přidáváš je první podmínka (potom nepřidávat AND) a nebo jedna z dalších podmínek (pak přidat AND).

$prvni=true;
$sql= "SELECT * FROM tbl";
if (!empty($_POST["barva"])) {$sql.=($prvni?" WHERE":" AND")." barva='$_POST[barva]'";$prvni=false;}
if (!empty($_POST["velikost"])) {$sql.=($prvni?" WHERE":" AND")." velikost='$_POST[velikost]'";$prvni=false;}
if (!empty($_POST["pocet"])) {$sql.=($prvni?" WHERE":" AND")." pocet='$_POST[pocet]'";$prvni=false;}
if (!empty($_POST["druh"])) {$sql.=($prvni?" WHERE":" AND")." druh='$_POST[druh]'";$prvni=false;}
+ nechat $_POST["xxx"] bez jakékoliv kontroly je bezpečnostní díra jak vrata. Takže je musíš ošetřit.


K druhé "otázce" ti uvedu příklad. Oba řádky číslo 2 udělají ve výsledku to samé.
$a = "Ahoj";
$a .= " světe";
echo $a; // Ahoj světe

$a = "Ahoj";
$a = $a." světe";
echo $a; // Ahoj světe
Snad je to dost jasné.
Jcas
Profil *
Perfektní. Díky moc
Možná by jste to mohli zveřejnit, jako nějaký článek pro vícenásobnou selekci z databáze. (Teda pokud chcete radit laikům. Všude je totiž pouze vysvětleno, jak použít jednu, max dvě selekce. A potom musí člověk buď kompletně studovat programovaní, nebo si to nějak vymyslet, nebo otravovat na foru.

Vaše odpověď

Mohlo by se hodit

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0