Formulář v PHP a MySQL

Re:formulář v PHP a MySQL
« Odpověď #15 kdy: 11. 07. 2012, 11:49:10 »
$vysledek = mysql_query("SELECT * FROM Agenda WHERE IDjmeno='$krok1' OR IDcislo='$krok2'");
- rikam podruhe ze u sloupce ktery je ciselny tam nemaji byt ty apostrofy!!!
- jak tady nekdo vyse psal: pouzijte probo promenne jako argumenty v te query! tohle je jako by se automechanik ucil ze na cokoliv je dobre zacit autogenem.
Děkuji za možnost editace příspěvku.


Moje nervy


Oxymoron

Re:formulář v PHP a MySQL
« Odpověď #17 kdy: 11. 07. 2012, 17:24:25 »
$vysledek = mysql_query("SELECT * FROM Agenda WHERE IDjmeno='$krok1' OR IDcislo='$krok2'");
- rikam podruhe ze u sloupce ktery je ciselny tam nemaji byt ty apostrofy!!!
- jak tady nekdo vyse psal: pouzijte probo promenne jako argumenty v te query! tohle je jako by se automechanik ucil ze na cokoliv je dobre zacit autogenem.

Ano, tak praví teorie, že okolo číselných databázových údajů by neměly být apostrofy. Asi mám něco někde blbě nakonfigurováno, ale v mojí instalaci, když dám číslo bez apostrofů, tak mi databáze vyplivne zhůvěřilosti, zatímco s apostrofama mi vyplivne, co má, i když se podmínka týká číselného sloupce (integer, double, ...). Kde mám co nastavené špatně?

sj

Re:formulář v PHP a MySQL
« Odpověď #18 kdy: 11. 07. 2012, 21:22:23 »
Oxymoron - díky za Tvoji analýzu i řešení, oboje je správné...
jinak pro ostatní, žádná data se nikde "takhle na talíři" neobjeví... slouží to jen k mým studijním účelům a prvním zkušebním pokusům s php a mysql... a navíc jsou stejně vymyšlené... v jedné online kuchařce pro zelenáče jsem našel ukázku toho formuláře s jedním vyhledávacím políčkem, tak jsem si jen chtěl zkusit napsat kód, který by vyhledával ze dvou...
a ještě jednou díky všem kteří se nějak zapojili do diskuze

Re:formulář v PHP a MySQL
« Odpověď #19 kdy: 12. 07. 2012, 00:30:08 »
slouží to jen k mým studijním účelům a prvním zkušebním pokusům s php a mysql... v jedné online kuchařce pro zelenáče
Úpěnlivě tě prosím, tuhle "kuchařku pro zelenáče" už nikdy neotevírej. Ideálně si její adresu vlož do /etc/hosts s adresou 127.0.0.1, protože tahle "kuchařka" není studium, ale cesta do pekla. Takhle se to prostě nedělá. A už vůbec ne ze studijních důvodů. Jestli tohle někdo radí zelenáčům, tak je to prostě kokot. Rád bych použil jiný slovo, ale v téhle situaci se to nedá. Televize se neopravuje kladivem, hodinky se nenastavují mlácením o zem a data z formulářů se nevkládají do SQL dotazů. Prostě ne. A už vůbec ne v rámci studia, kdy ještě nevíš, co si můžeš lajznout a co ne. Je to věc, kterou si možná může dovolit profesionál v nějaké situaci, kdy přesně ví, co a proč dělá, ale rozhodně ne "zelenáč".

Pokud si chceš SQL dotazy zkoušet, zkoušej si je v konzoli a zadávej si tam, co chceš. Pokud chceš zkoušet programovat weby, tak si kup nějakou pořádnou učebnici, čti, přemýšlej, zkoušej, laboruj, zkoumej. A když ti něco nebude hrát a nebudeš schopnej tomu sám přijít na kobylku, tak se neboj zeptat, určitě ti někdo rád poradí, když uvidí, že ses poctivě snažil.

Ale tímhle způsobem fakt ne, sorry. Pochopit, proč takhle ne, to tě posune víc, než dvacet takovýchhle debilních "kuchařek pro zelenáče".


cosmo

Re:Formulář v PHP a MySQL
« Odpověď #20 kdy: 12. 07. 2012, 10:14:59 »
[Miroslav Prýmek] - zčasti musím súhlasiť, ale rozumiem aj tomu, že začiatočník hľadá čo najjednoduchšiu cestu.

[sj] Môžem doporučiť robiť veci pekne, prehľadne a systémovo hneď na začiatku, pretože časom sa musí aj špagetti-kóder naučiť programovať progresívne a slušne. Čím skôr tým lepšie.

Doporučujem dobre si uvedomiť logiku SQL dotazov, pretože stále nie je úplne zrejme, čo je cieľom dotazu. Až potom sa dá skladať kód. DB dotazy je to prvé, čo musí byť ujasnené a vyladené, kľudne aj v phpmyadmin - uistíš sa tak, že máš správny dotaz.

Teraz k samotnej technike:

Na DB používať radšej ORM, prípadne nejakú vrstvu abstrakcie (NotOrm, DiBi). Osobne odporúčam Dibi.
Na formuláre jednoznačne NetteForms. Vysoko kultúrne riešenie, ktoré za teba urobí kopec zbytočnej práce a eliminuje zbytočné riziká. Prípadne si dopraj hodinku dve a pozri si videotutorialy k nejakému php frameworku. Zistíš, že čas môžeš využiť aj inak, ako písať zbytočnú "bižutériu" okolo DB alebo formulárov.

Má to ale jednu nevýhodu - pre začiatočníka sa to môže javiť ako čierna skrinka so vstupmi a výstupmi. Čiže teraz si ku kódu bližšie, ale o to zodpovednejšie musíš k nemu pristupovať. Tu to až tak nevadí, ale časom budu tvoje projekty narastať.
A pri rozsiahlejšom projekte sa týmto spôsobom môžeš jedine zblázniť a skončiť u Doc. Chocholouška.

Ber to ako odporúčanie jedného bývalého špagetti-kódera, ktorý sa musel jedného dňa naučiť programovať aspoň trošku kultúrne :-)
A o produktivite práce ani nehovoriac...

Re:Formulář v PHP a MySQL
« Odpověď #21 kdy: 12. 07. 2012, 10:30:26 »
ale rozumiem aj tomu, že začiatočník hľadá čo najjednoduchšiu cestu.

Jenže tohle není nejjednodušší cesta, ale nesmyslná cesta. Pokud si chci vyzkoušet, jak fungují SQL dotazy, je nejlepší je zadávat ručně a koukat se, co mi vracejí. Pokud si chci vyzkoušet, jak se dolují data z POSTu z formuláře, můžu si výsledek vypsat do html.

Přímým vkládáním dat do SQL se nenučím NIC navíc oproti předchozímu, kromě špatného návyku, který dřív nebo později někde (nevědomky) použiju v ostré aplikaci.

Je to stejný jako se strcpy - jestli se o něm něco má začátečník naučit, tak to, že ho vůbec nemá používat.

Jamaic

Re:Formulář v PHP a MySQL
« Odpověď #22 kdy: 12. 07. 2012, 11:06:09 »
Citace
$vysledek = mysql_query("SELECT * FROM Agenda WHERE IDjmeno='$krok1' OR IDcislo='$krok2'");

Chyba je jednoduchá.
Citace z oficiální dokumentace PHP:
Citace
For SELECT, SHOW, DESCRIBE, EXPLAIN and other statements returning resultset, mysql_query() returns a resource on success, or FALSE on error.

Takže jestli si myslíš že do query nacpeš resource z předchozího query a php/mysql to nějak přelouská, tak ti doporučuju aby jsi s PHP raději zkončil.

Re:Formulář v PHP a MySQL
« Odpověď #23 kdy: 12. 07. 2012, 11:11:03 »
Citace
oprava - správnou hodnotu mi dotaz vypíše pokud zadám $query = "SELECT * FROM Agenda WHERE IDjmeno=".$_POST["udaj1"];
jinak to píše "Resource id #..."
Hmm a není to náhodou tím, že ti mysql hodí syntax error a funkce na query false (a v PHP platí: false == 0)?

Marcel

Re:Formulář v PHP a MySQL
« Odpověď #24 kdy: 13. 07. 2012, 08:12:15 »
No ja osobne bych to videl teda takto (nevim jak Vy)

$vysledek = mysql_query(" SELECT * FROM Agenda WHERE IDjmeno=(SELECT * FROM Agenda WHERE IDjmeno=".$_POST["udaj1"]) OR IDcislo=(SELECT * FROM Agenda WHERE IDcislo=".$_POST["udaj2"]) ");

zjednodusene ,.. odpovida tu banda lidi kteri mozna umi Nette ci jine FW ale nejak neumi zaklady PHP?

DK

Re:Formulář v PHP a MySQL
« Odpověď #25 kdy: 13. 07. 2012, 08:59:36 »
Marcel: tak nejak, coz obecne plati i o tobe... kdyz uz, tak nejak takhle (kdyz beru v potaz, ze tvoji query by mu nekdo mohl smazat celou databazi)

Kód: [Vybrat]
$vysledek = sprintf(" SELECT * FROM Agenda WHERE IDjmeno=(SELECT * FROM Agenda WHERE IDjmeno='%s') OR IDcislo=(SELECT * FROM Agenda WHERE IDcislo=%d)",mysql_real_escape_string($_POST["udaj1"]),$_POST["udaj2"]);
$query=mysql_query($vysledek);

nebo jeste lepe
Kód: [Vybrat]
$db=new PDO(...);
$query=$db->prepare("SELECT * FROM Agenda WHERE IDjmeno=(SELECT * FROM Agenda WHERE IDjmeno=:jmeno) OR IDcislo=(SELECT * FROM Agenda WHERE IDcislo=:cislo)");
$query->bindParam(":jmeno",$_POST["udaj1"],PDO::PARAM_STR);
$query->bindParam(":cislo",$_POST["udaj2"],PDO::PARAM_INT);
$query->execute();
$rows=$query->fetchAll(PDO::FETCH_ASSOC);

Re:Formulář v PHP a MySQL
« Odpověď #26 kdy: 13. 07. 2012, 09:42:40 »
asi tak no... at si to klidne pise jako obyc query ale proboha do psich vajec parametry posilat jako parametry a escapovat!!!
Děkuji za možnost editace příspěvku.

Re:Formulář v PHP a MySQL
« Odpověď #27 kdy: 13. 07. 2012, 09:45:18 »
" SELECT * FROM Agenda WHERE IDjmeno=(SELECT * FROM Agenda WHERE IDjmeno='%s') OR IDcislo=(SELECT * FROM Agenda WHERE IDcislo=%d)"

Tenhle příkaz má dělat co? Ty vnitřní selecty vrací celý řádek ("SELECT *") a IDjmeno se asi těžko může rovnat celýmu řádku, ne? A proč dělat podselecty nad stejnou tabulkou? Na to přece stačí normální OR.

(SQL moc neznám, ptám se, třeba to má nějakou logiku, která mi nedochází)

Pořád nechápu, čeho se vlastně má dosáhnout. Jsou minimálně 4 různý možnosti:
1. uživatel zadá do web formuláře jenom udaj1
2. zadá jenom udaj2
3. nezadá ani jeden
4. zadá oba

Tyhle případy je přece blbost oddělovat pomocí SQL, přehlednější a logičtější imho je to otestovat předem a pro každou variantu použít jinej dotaz, jak už psal Oxymoron.

DK

Re:Formulář v PHP a MySQL
« Odpověď #28 kdy: 13. 07. 2012, 11:34:22 »
Prymek: selecty muzes normalne pouzivat vevnitr, pokud maji smysl (pokud treba potrebujes tahat data z jinych tabulek a podle nich to treba radit), tyhle nemaji vubec smysl, ja akorat "opravoval" predchozi kod... to, ze se to da napsat jednodusse a predhledne a ze by se mel nejdrive naucit tvorit spravne tabulku v databazi, je vec jina (viz to, ze tohle proste dela v prvnim prispevku autor)

obecne by to tedy melo by takto


obycejny mysql connect
Kód: [Vybrat]
$prepared=sprintf("SELECT * FROM Agenda WHERE IDjmeno='%s' OR IDcislo=%s",mysql_real_escape_string($_POST["udaj1"]),$_POST["udaj2"]);
$query=mysql_query($prepared) or die(mysql_error());
$vysledne_pole=mysql_fetch_array($query);
print_r($vysledne_pole);

PDO
Kód: [Vybrat]
$db=new PDO(...);
$query=$db->prepare("SELECT * FROM Agenda WHERE IDjmeno=:jmeno OR IDcislo=:cislo");
$query->bindParam(":jmeno",$_POST["udaj1"],PDO::PARAM_STR);
$query->bindParam(":cislo",$_POST["udaj2"],PDO::PARAM_INT);
$query->execute();
$vysledne_pole=$query->fetchAll(PDO::FETCH_ASSOC);
pritn_r($vysledne_pole);


pro autora (sj): vyhod tu knihu/prirucku/manual/tutorial, kde ti tohle radi, nejlepe rekni, kdo je autor, at ho muzeme verejne zlyncovat a zacni uplne od zacatku (tj zaklady php)

Claudie1

Re:Formulář v PHP a MySQL
« Odpověď #29 kdy: 13. 07. 2012, 14:20:34 »
DK: ta "oprava původního kódu" ale nedává smysl, protože jak už bylo řečeno, porovnáváš jedno pole s celým řádkem.
Když už, tak:
Kód: [Vybrat]
" SELECT * FROM Agenda WHERE IDjmeno=(SELECT IDjmeno FROM Agenda WHERE IDjmeno='%s') OR IDcislo=(SELECT IDcislo FROM Agenda WHERE IDcislo=%d)"
Ale potom je hned  vidět, že vnořené selecty jsou tady zbytečné, na tohle stačí jeden select.

Takže jak už jsem psala (a jak uvádíš i ty), použít sprint a mysql_real_escape nebo $_POSTY z formuláře otestovat a ošetřit v kódu a pak teprve s nimi složit dotaz a provést.
Mimochodem, jeden parametr je číselný, tam by se v sprintf hodilo spíše %d, než %s....

Pro autora:
jak už ti tu psali, ta kuchařka, z kterés to bral, asi nebude nejlepší začátek. Zkus raději jiné zdroje (php.net, http://php.vrana.cz/, http://www.kosek.cz/, o sql najdeš články i tady na rootu...  pro pochopení, jak fungují dotazy, ti tu už radili phpmyadmin, což je taky výborná věc, a pro pochopení jak s ním pracovat v php najdeš dost informací na uvedených zdrojích. Doporučuji také přečíst si něco o SQLinjection a bezpečnosti webových stránek obecně...)