Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: sj 10. 07. 2012, 20:38:19

Název: Formulář v PHP a MySQL
Přispěvatel: sj 10. 07. 2012, 20:38:19
Zdravím,
mám takový začátečnický problém - mám formulář s dvěma políčky "ID Jméno" a "ID Číslo" a potřebuji po vyplnění jednoho (libovolného) či obou ID, aby mi to našlo v databázi shodné údaje a vypsalo mi to k nim ostatní zbylé položky co k těmto ID patří.

zdrojový kód pro zpracování formuláře:

Kód: [Vybrat]
<?php
$con 
mysql_connect("","","");
if (!
$con)
  {
  die(
'Spojení s databází nelze navázat.' mysql_error());
  }

mysql_select_db(""$con);

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

echo 
"<table border='1'>
<tr>
<th>ID Jméno</th>
<th>ID Číslo</th>
<th>Jméno</th>
<th>Příjmení</th>
<th>Titul</th>
<th>Email1</th>
<th>Email2</th>
</tr>"
;

while (
$row mysql_fetch_array($vysledek))  
  {
  echo 
"<tr>";
  echo 
"<td>" $row['IDjmeno'] . "</td>";
  echo 
"<td>" $row['IDcislo'] . "</td>";
  echo 
"<td>" $row['jmeno'] . "</td>";
  echo 
"<td>" $row['prijmeni'] . "</td>";
  echo 
"<td>" $row['titul'] . "</td>";
  echo 
"<td>" $row['email1'] . "</td>";
  echo 
"<td>" $row['email2'] . "</td>";
  echo 
"</tr>";
  }

echo 
"</table>";

mysql_close($con);
?>

<html>
<body>
<a href="formular.html">zpět na formulář</a>
</body>
</html>

zdrojový kód formuláře:

Kód: [Vybrat]
<html>
<body>
<form action="zpracovani_formulare.php" method="post">
ID Jméno: <input type="text" name="udaj1" />
ID Číslo: <input type="text" name="udaj2" />
<input type="submit" />
</form>
</body>
</html>

pokud zakomentuji "vysledek" a "krok2" a v cyklu "while" přepíši "výsledek" na "krok1" tak to proběhne jak má... tudíž chybu dělám někde v zápise při vyhledávání z dvou polí...
předem děkuji za Vaše tipy a rady
Název: Re:formulář v PHP a MySQL
Přispěvatel: to_je_jedno 10. 07. 2012, 21:04:04
pokud tam budes mit nejaky zajimavy udaje tak sem pak hod URL
Název: Re:formulář v PHP a MySQL
Přispěvatel: Mirek Prýmek 10. 07. 2012, 21:11:31
pokud tam budes mit nejaky zajimavy udaje tak sem pak hod URL

:))))

Treba to je v ramci toho slavnyho centralniho registru, nebo jak se to jmenuje :)
Název: Re:formulář v PHP a MySQL
Přispěvatel: DK 10. 07. 2012, 21:50:37
poradim ti par veci

obecne
 - sql injection
 - escapovani
 - ochrana vstupu

php
 - mysql_error()
 - OR ( or die() )
 - PDO
Název: Re:formulář v PHP a MySQL
Přispěvatel: to_je_jedno 10. 07. 2012, 22:41:25
Treba to je v ramci toho slavnyho centralniho registru, nebo jak se to jmenuje :)
;D  ;D to by odpovidalo. zjistili ze na ms platforme to proste nerozjedou tak zacinaji na zeleny louce.
Název: Re:formulář v PHP a MySQL
Přispěvatel: to_je_jedno 11. 07. 2012, 03:10:43
v tom dotazu s OR by asi nemely bejt apostrofy okolo te promenne idcislo
Název: Re:formulář v PHP a MySQL
Přispěvatel: Oxymoron 11. 07. 2012, 07:09:28
Já bych hledal chybu tady: $vysledek = mysql_query("SELECT * FROM Agenda WHERE IDjmeno='$krok1' OR IDcislo='$krok2'");
co je smyslem toho řádku?
Název: Re:formulář v PHP a MySQL
Přispěvatel: Fremen 11. 07. 2012, 07:18:10
Tohle je přesně situace, kdy na fóru odpovídá banda namachrovaných linuxových blbečků, kteří buď nic neumí nebo už zapoměli, jaké to bylo, když začínali a dělali triviální chyby. Styďte se.

K tématu: vypiš si dotaz na databázi a zjistíš, co tam leze a co tam děláš špatně

$query = "SELECT * FROM Agenda WHERE IDjmeno='$krok1' OR IDcislo='$krok2'";
echo $query;
Název: Re:formulář v PHP a MySQL
Přispěvatel: podlesh 11. 07. 2012, 08:51:07
Já bych hledal chybu tady: $vysledek = mysql_query("SELECT * FROM Agenda WHERE IDjmeno='$krok1' OR IDcislo='$krok2'");
co je smyslem toho řádku?
Přidávám se - tento dotaz je tak nesmyslný, že ani nedokážu uhádnout co by mělo být účelem.
Problém je, že na takovémto fóru se málokdy najde někdo kdo by dokázal dobře vysvětlit naprosté základy.
Název: Re:formulář v PHP a MySQL
Přispěvatel: sj 11. 07. 2012, 09:11:18
Fremen diky za reakci - vypíše to "Resource id # ..." jinak pokud vypíši dotaz pouze k jednomu vysledku, např. krok2, a ostatní zakomentuji, tak mi to vypíše správnou hodnotu - např.  hledám údaje k číslu 1234, tak mi vypíše SELECT * FROM Agenda WHERE IDcislo=1234 a proběhne to správně, tj. vypíše mi to zbylé údaje z databáze...

Oxymoron, podlesh - osobně si myslím, že chyba je také v tom řádku, jeho smyslem mělo být aby mi $vysledek přiřadil z tabulky údej k hledanému výrazu  buď z prvního políčka formuláře nebo k toho z druhého či popřípadě obou políček formuláře... bohužel nevím jak to napsat do jednoho příkazu, vždycky mi to vypsalo nějakou chybovou hlášku... tak to zkouším takhle krkolomně... 
Název: Re:formulář v PHP a MySQL
Přispěvatel: sj 11. 07. 2012, 09:38:46
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 #..."
Název: Re:formulář v PHP a MySQL
Přispěvatel: Granda Urso 11. 07. 2012, 09:57:02
Tohle je přesně situace, kdy na fóru odpovídá banda namachrovaných linuxových blbečků, kteří buď nic neumí nebo už zapoměli, jaké to bylo, když začínali a dělali triviální chyby. Styďte se.

K tématu: vypiš si dotaz na databázi a zjistíš, co tam leze a co tam děláš špatně

$query = "SELECT * FROM Agenda WHERE IDjmeno='$krok1' OR IDcislo='$krok2'";
echo $query;
Ještě bych doplnil to, že je dobré ten dotaz si zkopírovat a pak spustit v phpmyadmin nebo ještě lépe v konzoli. Tam uvidíš přímo výsledky. V konzoli nezapomeň po přihlášení zadat přepnutí na utf8 příkazem \C utf8
Název: Re:formulář v PHP a MySQL
Přispěvatel: Mirek Prýmek 11. 07. 2012, 10:17:57
Tohle je přesně situace, kdy na fóru odpovídá banda namachrovaných linuxových blbečků,
Proč "linuxových"? ;)

už zapoměli, jaké to bylo, když začínali a dělali triviální chyby.
Nejde o triviální chyby, ale o šílený principielní bezpečnostní mor. Děsí mě, že se tazatel takhle naučí programovat a pak třeba někomu nabídne, že mu udělá nějakou komerční zakázku. ...a chyby programátora si pak vyžere admin.

Jasně, když s něčím začínám, tak můžu (a budu) dělat hloupý chyby, ale neměl bych se (ani na začátku) učit způsobům, které jsou naprosto principielně vadné a NIKDY se v produkci nesmí objevit. To je ten rozdíl oproti např. začátečnicky neefektivní nebo neelegantní implementaci - to, co tady tazatel prezentuje, by se prostě nikdy nikde a za žádných okolností nemělo objevit. Ani v tutoriálu a už vůbec ne v učebnici. Pokud teda začíná, má si vzít k ruce literaturu, studovat a zkoušet a ne bastlit řešení sice "funkční", ale principielně vadné.

A co se týče toho "styďte se", tak si myslím, že je lepší, když dostanu facku jako začátečník při zkoušení, než když mě zfackuje neznámý cracker a poté ještě jednou zákazník. (a potřetí zákazníkův admin) Spíš by se imho měl stydět tazatel za to, že tu facku přešel bez komentáře, jako by tím říkal "no a co? já si to budu dělat takhle a vy se klidně pošklebujte" :( Právě proto, že jsem admin, bych takovýhle kodéry vraždil...

Přidávám se - tento dotaz je tak nesmyslný, že ani nedokážu uhádnout co by mělo být účelem.
Problém je, že na takovémto fóru se málokdy najde někdo kdo by dokázal dobře vysvětlit naprosté základy.
Smyslem žádného fóra není vysvětlovat základy. Pokud má tazatel nějaký problém, má postupovat podle Howto ask smart questions, v tomhle případě:

1. čeho chci přesně dosáhnout
2. jak se přesně liší to, co dostávám, od 1)
3. jaká řešení jsem zatím vyzkoušel a proč (a jak) nefungovala

Já třeba vůbec netuším, co vlastně tazatel chce získat. Má to být UNION mezi (IDjmeno=x) a (IDcislo=y)? Nebo co vlastně? Jako jestli někdo chce dalekosáhle radit, vysvětlovat základní věci a po x příspěvcích zjistit, že tazatel chce něco úplně jinýho, tak ok, každý svého štěstí strůjcem...
Název: Re:formulář v PHP a MySQL
Přispěvatel: Claudie1 11. 07. 2012, 10:32:56
Co to zkusit takhle?
$query = sprintf("SELECT * FROM Agenda WHERE IDjmeno='%s' OR IDcislo=%d, mysql_real_escape_string($_POST["udaj1"]),
    mysql_real_escape_string($_POST["udaj2"]));

// Perform Query
$vysledek= mysql_query($query);
....

while ($row = mysql_fetch_array($vysledek)) 
  {
...
Název: Re:formulář v PHP a MySQL
Přispěvatel: Oxymoron 11. 07. 2012, 11:10:40
Oxymoron, podlesh - osobně si myslím, že chyba je také v tom řádku, jeho smyslem mělo být aby mi $vysledek přiřadil z tabulky údej k hledanému výrazu  buď z prvního políčka formuláře nebo k toho z druhého či popřípadě obou políček formuláře... bohužel nevím jak to napsat do jednoho příkazu, vždycky mi to vypsalo nějakou chybovou hlášku... tak to zkouším takhle krkolomně...

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

Tak si uděláme analýzu toho, co to dělá tenhle kus kódu:
Krok1: vyberou se všechny sloupce záznamu, kde ve sloupci IDjmeno je obsažen požadovaný obsah zadávaný v $_POST["udaj1"]. Výběr je uložen do jakési struktury (podtabulky) $krok1.
Krok2: podobně pro IDcislo a $_POST["udaj2"] se vybraná data uloží do jakési struktury (podtabulky) $krok2.
Krok3 (výsledek): Nyní vybíráš všechny sloupce záznamu, kde ve sloupci IDjmeno je obsažena celá už vybraná podtabulka $krok1 nebo kde ve sloupci IDcislo je obsažena celá podtabulka $krok2

Závěr: Nepíšeš, co ti to dělá špatně, nicméně předpokládám, že výsledkem je prázdná tabulka, resp. že to nenajde nic, co by odpovídalo tomu, co hledáš.

Závěr 2: podle popisu, co chceš vypsat, odhaduji, že jsi chtěl v principu něco takovéhoto:

if($_POST["udaj2"]=="")
$vysledek = mysql_query("SELECT * FROM Agenda WHERE IDjmeno=".$_POST["udaj1"]);
elseif($_POST["udaj1"]=="")
$vysledek = mysql_query("SELECT * FROM Agenda WHERE IDcislo=".$_POST["udaj2"]);
else
$vysledek = mysql_query("SELECT * FROM Agenda WHERE IDjmeno=".$_POST["udaj1"]." OR IDcislo=".$_POST["udaj2"]);
end;
Název: Re:formulář v PHP a MySQL
Přispěvatel: to_je_jedno 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.
Název: Re:formulář v PHP a MySQL
Přispěvatel: Moje nervy 11. 07. 2012, 14:39:08
http://farm2.staticflickr.com/1368/987251565_22ea2338dd.jpg
Název: Re:formulář v PHP a MySQL
Přispěvatel: Oxymoron 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ě?
Název: Re:formulář v PHP a MySQL
Přispěvatel: sj 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
Název: Re:formulář v PHP a MySQL
Přispěvatel: Mirek Prýmek 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".
Název: Re:Formulář v PHP a MySQL
Přispěvatel: cosmo 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...
Název: Re:Formulář v PHP a MySQL
Přispěvatel: Mirek Prýmek 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.
Název: Re:Formulář v PHP a MySQL
Přispěvatel: Jamaic 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.
Název: Re:Formulář v PHP a MySQL
Přispěvatel: Jan Vostrý 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)?
Název: Re:Formulář v PHP a MySQL
Přispěvatel: Marcel 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?
Název: Re:Formulář v PHP a MySQL
Přispěvatel: DK 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);
Název: Re:Formulář v PHP a MySQL
Přispěvatel: to_je_jedno 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!!!
Název: Re:Formulář v PHP a MySQL
Přispěvatel: Mirek Prýmek 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.
Název: Re:Formulář v PHP a MySQL
Přispěvatel: DK 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)
Název: Re:Formulář v PHP a MySQL
Přispěvatel: Claudie1 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ě...)
Název: Re:Formulář v PHP a MySQL
Přispěvatel: DK 13. 07. 2012, 15:17:48
Claudie: viz muj predchozi prispevek, tu query jsem nekontroloval, jenom prepsal :) a samozrejme tam jedno %d mam :)  nicmene je vazne lepsi odejit od klasickeho mysql_connectu napriklad k PDO (ktere je od php 5), ty prepared statements jsou vazne nekde jinde :)
Název: Re:Formulář v PHP a MySQL
Přispěvatel: Claudie1 13. 07. 2012, 15:31:37
dk: "nicmene je vazne lepsi odejit od klasickeho mysql_connectu napriklad k PDO (ktere je od php 5), ty prepared statements jsou vazne nekde jinde"

kde jinde? v čem  jsou výrazně lepší? myslím, že by to mohlo být užitečné autorovi dotazu v rámci jeho učení se
(myslím to vážně - když nevím, tak se prostě ptám)
Název: Re:Formulář v PHP a MySQL
Přispěvatel: DK 13. 07. 2012, 16:22:21
tak krome toho, ze je to bezpecnejsi a nemusis resit zadne escapovani, tak, pokud to spravne pouzivas, tak to je mirne rychlejsi (coz u narocnych aplikaci je plus), navic to neni delane pouze na mysql, ale na mnohem vice databazi (jednodusse to upravis, portujes, muzes pouzit mysql, postgre, mssql, oracle...)

vicemene je to nahrada zastaraleho adodb
Název: Re:Formulář v PHP a MySQL
Přispěvatel: Claudie1 16. 07. 2012, 10:50:27
tak krome toho, ze je to bezpecnejsi a nemusis resit zadne escapovani, tak, pokud to spravne pouzivas, tak to je mirne rychlejsi (coz u narocnych aplikaci je plus), navic to neni delane pouze na mysql, ale na mnohem vice databazi (jednodusse to upravis, portujes, muzes pouzit mysql, postgre, mssql, oracle...)

vicemene je to nahrada zastaraleho adodb
děkuji, za info i za tvůj čas, jdu se na to podívat
Název: Re:Formulář v PHP a MySQL
Přispěvatel: Kit 16. 07. 2012, 11:18:05
dk: "... ty prepared statements jsou vazne nekde jinde"

kde jinde? v čem  jsou výrazně lepší?
Při opakovaných dotazech stejného typu se dají udělat tak, aby se kompilovaly pouze 1×, například v konstruktoru. Opakované hrabání v číselnících a podobných datech je pak ještě rychlejší.

Parametrizované dotazy bývají také o něco kratší a přehlednější.