Autor Zpráva
fili
Profil
Zdravim!

Prosim o pomoc mam dole uvedeny kod, ale nefunguje.
Chcem aby mi hladalo pri zadani obcho Polozka a Miesto, ale aj pri zadani jedneho Polozka alebo Miesto.
Kde mam chybu?

$sql="SELECT * FROM tabulka WHERE Polozka='%' AND Miesto='%' AND (Polozka='%' OR Miesto='%')";
Taps
Profil
fili:

<?
$polozka=mysql_real_escape_string($_POST['polozka']);
$miesto=mysql_real_escape_string($_POST['miesto']);
$sql="SELECT * FROM tabulka WHERE Polozka='$polozka' OR Miesto='$miesto' ";
?>
fili
Profil
Taps:
Vdaka za pomoc, ale nefunguje to podla mojich predstav.
Vysledok je OK len ak sa hlada Polozka alebo Miesto - vysledok mam 65 ks.
Ale potrebujem aby mi to vyhodilo Polozku a Miesto, tam by mal byt mensi pocte vysledkov - 1 ks.
Ak zadam aj Polozku a Miesto z formulara, tak potrebujem vysledok,
len konkretnych poloziek na konkretnom mieste, ale toto mi vyhadzuje
vsetko z polozky+to co by som chcel mat ako vysledok, takze namiesto
jedneho vysledku mam 66 ks.
Kajman
Profil
fili:
Položte tedy dotaz s podmínkami spojenými operátorem AND a když to nic nenajde, tak teprve uděletejte druhý se zmíněným OR.
fili
Profil
Tomuto celkom nerozumiem.
Potrebujem jednoduchu vec, aby hladanie fungovalo:
1.Pri zadani jednoho atributu z formulara, ak uzivatel chce takto hladat.
2. Vyhladat z toho isteho formulara, ak iny uzivatel zada oba atributy pri hladani.
Kajman
Profil
Tak jednoduše v tom php sestavte dotaz podle toho, kolik atributů uživatel zadal do hledání.
fili
Profil
Kajman:
Ako bude vyzerat ten jednoduchy dotaz, pretoze php mi moc nejde,
keby ano tak nehladam pomoc. Mam dole uvedeny dotaz, ale stale mi to nejde ako by malo. Ak zadam polozka vysledok je v poriadku - 65 vysledkov.
Ale ak zadam plozka aj miesto vo formulari, co ma byt presnejsie - 1 vysldedok, tak mam stale
vysledok 65 + ten 1 pozadovany. Kde mam chybu???



$sql="SELECT * FROM tabulka WHERE Polozka='$polozka' AND Miesto='$miesto' OR (Polozka ='$polozka' OR Miesto ='$miesto')";
Kajman
Profil
Když zadá uživatel jen miesto, uděláte dotaz
$sql="SELECT * FROM tabulka WHERE Miesto='$miesto'";

Když zadá uživatel jen polozku, uděláte jiný dotaz
$sql="SELECT * FROM tabulka WHERE Polozka='$polozka'";

Když zadá miesto i polozku, uděláte ještě jiný dotaz...
$sql="SELECT * FROM tabulka WHERE Polozka='$polozka' AND Miesto='$miesto' ";
fili
Profil
Kajman:
No tak som to otestoval - tri dotazy na databazu,
ale funguje z toho len jeden, kotry je uvedeny v kode ako posledny.
Ostatne nenajdu nic.
Bud to treba zlucit do jedneho - nieco podobne ako som mal vyssie,
alebo tam treba pridat este nejaku podmienku na dotazy a to uz vobec neviem napisat.
jenikkozak
Profil
<?php
if(isset($polozka, $miesto)){
  $sql="SELECT * FROM tabulka WHERE Polozka='$polozka' AND Miesto='$miesto'";
}elseif(isset($polozka)){
  $sql="SELECT * FROM tabulka WHERE Polozka='$polozka'";
}else{
  $sql="SELECT * FROM tabulka WHERE Miesto='$miesto'";
}
fili
Profil
jenikkozak:
vdaka, ale nefunguje to tak ako by malo
funguje len tato cast
$sql="SELECT * FROM tabulka WHERE Polozka='$polozka' AND Miesto='$miesto'";
jenikkozak
Profil
fili:
Pak hádám, že je „problém“ v tom, že ve skriptu jsou nastavené obě proměnné, přestože některá z nich obsahuje prázdný řetězec. (Což samozřejmě nemohu vědět, když nevím, odkud ty proměnné pocházejí.)
Je-li tomu tak, můžeš otestovat, jestli ty proměnné obsahují hodnotu:
<?php
if($polozka!="" AND $miesto!=""){
  $sql="SELECT * FROM tabulka WHERE Polozka='$polozka' AND Miesto='$miesto'";
}elseif($polozka!=""){
  $sql="SELECT * FROM tabulka WHERE Polozka='$polozka'";
}else{
  $sql="SELECT * FROM tabulka WHERE Miesto='$miesto'";
}
fili
Profil
jenikkozak:
Vysledok je stale rovnaky.
Pri zadani oboch je OK - 1 vysledok,
ale pri zadani jedneho alebo druheho, mam vysledok vzdy 0.
Neviem ako si myslel, ci obsahuju hodnotu?
Pouzivam roletky - select, takze tam mam uz vpisanie hodnoty na vyber.
A testujem to na tom co mam skutocne aj v databaze, takze neviem...
A mam jednu otazku mimo vyhladavania, mozem uz do existujucej databazy
dodatocne vlozit ID? Myslim, ze by to nemalo sposobit problemy alebo???
Kajman
Profil
fili:
Pouzivam roletky - select, takze tam mam uz vpisanie hodnoty na vyber.

V tom bude problém. Buď v tom optionu znamenající nic nastavte value na prázdný řetězec, nebo na řádcíh 2 a 4 porovnávejte s nic znamenající hodnotou místo prázdného řetězce.
fili
Profil
Kajman:
Formular nechcem menit, a co ma znamenat prazdny? aby si uzivatel
mohol vpisat co hlada? Ako teda by mal vyzerat spravne ten dotaz???
A co to ID???
peta
Profil
fili: var_dump(array($polozka,$miesto)); // co to vypise?
"Pouzivam roletky - select, takze tam mam uz vpisanie hodnoty na vyber."
Tento kod jsi nam neukazal, nelze ho zahrnout tedy do uvah o problemu, ktery muzeme resit. Cili sem zkopiruj html kod tech roletek, asi nejlepe. Mozna uplne idealne i s tagy form a odesilacim tlacitkem.
fili
Profil
Pri zadani prvej plozky z formulara "polozka"
Vysledok 0
array(2) { [0]=> NULL [1]=> string(10) "Miesto" }
Pri zadani oboch "polozka" aj "miesto"
Vyhodilo spravny vysledok
Pri zadani druhej plozky
Vysledok 0
array(2) { [0]=> NULL [1]=> string(8) "Biela" }

Formular je bezny:
<form action="vysledok-hladania.php" method="post">
<select name="Typ">option value="Typ">Typ</option
<option value="Ponožky">Ponožky</option>
<select name="Miesto"><option value="Miesto">Miesto</option>
<option value="Biela">Biela</option>
<input type="submit" name="odoslat" value="Vyhľadaj"></input></form>
[/pre]
juriad
Profil
Je to tím, že pokud nevybereš Typ, tak se odešle jeho hodnota Typ, podobně pro Miesto, pokud nevybereš nic, odešle se Miesto.
Z toho důvodu se vždy bude provádět jen SELECT podle obou parametrů; pokud vybereš Typ a Miesto necháš prázdné:
SELECT * FROM tabulka WHERE Polozka='Ponožky' AND Miesto='Miesto'

Řešením je nastavit prázdnou hodnotu pro nevyplněný select:
<form action="vysledok-hladania.php" method="post">
<select name="Typ"><option value="">Typ</option
<option value="Ponožky">Ponožky</option>
<select name="Miesto"><option value="">Miesto</option>
<option value="Biela">Biela</option>
<input type="submit" name="odoslat" value="Vyhľadaj"></input></form> 
Potom začnou fungovat podmínky v [#12] jenikkozak a vše bude sluníčkové.
fili
Profil
juriad:
Treba to nechat prazdne len pri tych hlavickach Typ a Miesto,
alebo aj pri ich konkretnych polozkach Ponozky atd.?
A co to ID??? Mozem ho pridat dodatocne a nenaburat si tak uz hotovu databazu?????
Tori
Profil
fili:
mozem uz do existujucej databazy dodatocne vlozit ID?
Do tabulky. Ano, můžete přidat další sloupec pro ID. Když ho nastavíte na auto_increment, tak se řádky správně očíslují.
juriad
Profil
fili:
Jen u těch, které znamenají, že není vybraná hodnota - ty které mají význam hlavičky/nadpisu. U ostatních je naopak neprázdná value nutná - value je ta hodnota, která se odešle na server.

mozem uz do existujucej databazy dodatocne vlozit ID? Myslim, ze by to nemalo sposobit problemy alebo???
Možná ti na to neodpovídá nikdo proto, že nechápe, na co se ptáš. Zkus tu otázku víc rozvést; třeba uveď příklad toho, čeho se snažíš dosáhnout.
fili
Profil
juriad:
Vdaka, teraz vyhladavanie uz funguje lepsie, ale ma to jeden hacik,
potrebujem tam este zakomponovat aj aby mi vyhladalo nielen Biele vybrate z formulara, ale aj Biele so vzorom, ktore nie je vo formulari ale je v databaze, cize aby mi to vzalo nejaky retazec s pevnou a zaroven volnou hodnotou. Dufam, ze sa da pochopit, co vlastne mam na mysli
Ospravedlnujem sa ohladom toho ID, samozrejme som myslel vlozenie noveho stlpca s ID do tabulky v databaze. Robim s tym len obcasne, tak mi ani neprislo, ze je to vlastne cely stlpec. Vdaka aj za to!!!!!
Som v PHP amater, tak este budem potrebovat pomoc, pretoze musim este poriesit nejake veci.
juriad
Profil
Můžeš vyhledávat podřetězec: WHERE Miesto LIKE 'Biela%'; oprátor LIKE, procento značí wildcard (cokoli).
Ale lepší je data před vložením do databáze normalizovat, aby tam takové nesrovnalosti nevznikaly.
Nebo můžeš v <select> zobrazit všechny přípustné hodnoty: SELECT DISTINCT Miesto FROM tabulka.

Ono je lepší se napřed zamyslet a navrhnout databázi rovnou správně. Neboj se tady zeptat, jestli máš schéma správně, ušetříš si hodně času a problémů.
K ID: můžeš ten sloupec přidávat do každé tabulky, je to zadarmo (pár bajtů většinou nevadí), a je jednodušší o tom přemýšlet.
fili
Profil
juriad:
Dakujem ja by som tam dal len WHERE Miesto '%'; bez LIKE a zas by som sa s tym trapil. Ale zistil som, ze povodny dotaz, ktory som pouzival predtym
bol tiez dobry, hl. chyba bola vo formulari pri odosielani hodnot
Typ alebo Miesto, ktore v databaze nie su. Chapem to, je to logicke,
ale nikdy by ma nenapadlo, ze chyba je v html. Na to treba asi prax...


"Nebo můžeš v <select> zobrazit všechny přípustné hodnoty: SELECT DISTINCT Miesto FROM tabulka."
Toto by som ani nevedel pouzit.

A co ostatne nastavenia pri vkladani stlpca s ID do databazy???????
Moderátor jenikkozak: Za každou větou piš raději jen jeden interpunkční znak.
jenikkozak
Profil
fili:
A co ostatne nastavenia pri vkladani stlpca s ID do databazy?
Nic. Nastav, že to má být přirozené číslo, tedy celé, kladné a nenulové.
juriad
Profil
fili:
Nastav ten sloupec, podle toho, co od něj vyžaduješ.

Většinou je žádoucí aby byl typu INTEGER (číslo faktury), někdy můžeš potřebovat VARCHAR (uživatelské jméno).
Z povaha ID vyplývá, že bude unikátní; pokud v tabulce není jiný sloupec označený jako primární klíč, ID by mělo být primárním klíčem, pokud už jiný primární klíč existuje, bude stačit unikátní klíč s příznakem NOT NULL.
Pokud chceš, aby se hodnota ID sama vyplňovala pro nové záznamy a nezáleží ti na konkrétní hodnotě, nastav AUTO_INCREMENT; pokud ID generuješ na základě nějakého pravidla, třeba faktury: první čtyři číslice rok, pak pořadové číslo faktury zleva doplněné nulami na 5 znaků, AUTO_INCREMENT nenastavuj.

Jak vidíš neexistuje žádný rozumný důvod říct, udělej to tak, protože je to tak správně. V případě, že ID je uměle přidaný klíč, který má za úlohu jen identifikovat záznam, zajistit jednoduchý způsob spojení s jinými tabulkami a není třeba napojení na jiné systémy, můžeme říct, že následující zápis bude často správný.
id INTEGER AUTO_INCREMENT PRIMARY_KEY

Mě se v průběhu vývoje aplikace osvědčilo napsat si sql skript (pozor není určen pro mysql), který vytvoří celé databázové schéma a druhý skript, který ho naplní testovacími daty. To umožňuje docela rychle změnit schéma a naplnit databázi čerstvými daty.

zkus trochu zkulturnit svůj projev, tučným písmem a interpunkcí šetři
fili
Profil
juriad:
Dakujem za vycerpavajucu odpoved, urcite sa mi vsetky info zidu.
Staci mi to "jednoduche" ID
Tak som dal vytvorit stlpec s ID, ale mi to neulozilo, vyhodilo chybu
#1075 - Incorrect table definition; there can be only one auto column and it must be defined as a key
Ospravedlnujem sa pisomny prejav, nevedel som, ze sa to nema.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

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

0