Formulář v PHP a MySQL

sj

Formulář v PHP a MySQL
« kdy: 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
« Poslední změna: 12. 07. 2012, 09:04:35 od Petr Krčmář »


Re:formulář v PHP a MySQL
« Odpověď #1 kdy: 10. 07. 2012, 21:04:04 »
pokud tam budes mit nejaky zajimavy udaje tak sem pak hod URL
Děkuji za možnost editace příspěvku.

Re:formulář v PHP a MySQL
« Odpověď #2 kdy: 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 :)

DK

Re:formulář v PHP a MySQL
« Odpověď #3 kdy: 10. 07. 2012, 21:50:37 »
poradim ti par veci

obecne
 - sql injection
 - escapovani
 - ochrana vstupu

php
 - mysql_error()
 - OR ( or die() )
 - PDO

Re:formulář v PHP a MySQL
« Odpověď #4 kdy: 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.
Děkuji za možnost editace příspěvku.


Re:formulář v PHP a MySQL
« Odpověď #5 kdy: 11. 07. 2012, 03:10:43 »
v tom dotazu s OR by asi nemely bejt apostrofy okolo te promenne idcislo
Děkuji za možnost editace příspěvku.

Oxymoron

Re:formulář v PHP a MySQL
« Odpověď #6 kdy: 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?

Fremen

Re:formulář v PHP a MySQL
« Odpověď #7 kdy: 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;

podlesh

Re:formulář v PHP a MySQL
« Odpověď #8 kdy: 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.

sj

Re:formulář v PHP a MySQL
« Odpověď #9 kdy: 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ě... 

sj

Re:formulář v PHP a MySQL
« Odpověď #10 kdy: 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 #..."

Granda Urso

  • *
  • 13
  • Ne estas pano sen laboro!
    • Zobrazit profil
    • univerzální celosvětový jazyk
    • E-mail
Re:formulář v PHP a MySQL
« Odpověď #11 kdy: 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

Re:formulář v PHP a MySQL
« Odpověď #12 kdy: 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...

Claudie1

Re:formulář v PHP a MySQL
« Odpověď #13 kdy: 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)) 
  {
...

Oxymoron

Re:formulář v PHP a MySQL
« Odpověď #14 kdy: 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;