NOVINKA: Získej 40 hodin praktických dovedností s AI – ZDARMA ke každému akreditovanému kurzu!

Diskuze: PHP,práce s databází

V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.

Jak se ti líbí článek?
Před uložením hodnocení, popiš prosím autorovi, co je špatněZnaků 0 z 50-500
Jak se ti kurz líbí?
Tvé hodnocení kurzuZnaků 0 z 50-500
Aktivity
Avatar
Neaktivní uživatel:6.8.2012 19:27

Zdravím,
ti kteří mě už znají (kit... :D ) ví,že jsem dřív použival takovou tu "bezdatabázovou" diskuzi na vše možné... Pořád mi říkáte že se mám učit databázi,OK zkouším to,a to na vtipech (vtipy.bobikpa­ge.cz)
Ale je tam nějaká chybička,a navíc vůbec nevím jak se to dělá,tak bych prosil poučení :)

---pridat.php---

<h2>Přidat vtip !</h2>
  <form action="pridej.php" method="post">
  <textarea name="vtip" rows="20" cols="60"></textarea>
  <select title="Vyber...">
  <option name="kategorie" value="blondynky">Blondýnky</option>
  <option name="kategorie" value="doktori">Doktoři</option>
  <option name="kategorie" value="opilci">Opilci</option>
  <option name="kategorie" value="pocitace">Počítače</option>
  <option name="kategorie" value="policejni">Policejní</option>
  <option name="kategorie" value="programatori">Programátoři</option>
  <option name="kategorie" value="skola">Škola</option>
  <option name="kategorie" value="urednici">Úředníci</option>
  <option name="kategorie" value="zvirata">Zvířata</option>
  <option name="kategorie" value="ostatni">Ostatní</option>
  </select> <input type="submit" name="odeslat" value="Přidej !">

  </form>

---pridej.php---

<?php
$spojeni = mysql_connect('localhost','vtipybobikpage','***********************');
if (!$spojeni) die('Připojení k databázi selhalo...');
$databaze = mysql_select_db('vtipybobikpage',$spojeni);
if (!$databaze) die('Výběr databáze selhal !');
?>

<?php
if (isset($_POST['odeslat']))
{

if (mysql_query('INSERT INTO ' . $_POST['kategorie'] . 'VALUES ($_POST['vtip'])',$spojeni))
{
                echo ('Vtip úspěšně přidán !');
}
        else
{
                echo (' Vtip nepřidán,někde nastala chyba...');
}

?>


<a href="#" onClick="window.close()">POKRAČOVAT</a><br>

Píše mi to

Parse error: syntax error, unexpected T_STRING in /home/users/birdsoftware/bobikpage.cz/sub/vtipy/vtipy/pridej.php on line 19

Line 19 je

if (mysql_query('INSERT INTO ' . $_POST['kategorie'] . 'VALUES ($_POST['vtip'])',$spojeni))
Odpovědět
6.8.2012 19:27
Neaktivní uživatelský účet
Avatar
Odpovídá na Neaktivní uživatel
Neaktivní uživatel:6.8.2012 19:31

Kite mužeš na slovíčko ?? :D

Nahoru Odpovědět
6.8.2012 19:31
Neaktivní uživatelský účet
Avatar
Neaktivní uživatel:6.8.2012 19:54

To tu nikdo není ?? :(

Nahoru Odpovědět
6.8.2012 19:54
Neaktivní uživatelský účet
Avatar
Raiper34
Tvůrce
Avatar
Odpovídá na Neaktivní uživatel
Raiper34:6.8.2012 19:55

Btw chybu nemusíš mať iba na 19 ale už oveľa skôr, ide o to že tá chyba sa prejavila na 19

Nahoru Odpovědět
6.8.2012 19:55
Posledná vydaná hra: http://www.islandsoft.cz/index.php?art=hra-akcna-space-resistance
Avatar
Odpovídá na Raiper34
Neaktivní uživatel:6.8.2012 19:56

tak co s tím je ?

Nahoru Odpovědět
6.8.2012 19:56
Neaktivní uživatelský účet
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Neaktivní uživatel
David Hartinger:6.8.2012 19:58

No fuj, escapování ti nic neříká?

Nahoru Odpovědět
6.8.2012 19:58
New kid back on the block with a R.I.P
Avatar
Odpovídá na David Hartinger
Neaktivní uživatel:6.8.2012 20:03

já už možnáá vím,chybí mi tam závorka

Nahoru Odpovědět
6.8.2012 20:03
Neaktivní uživatelský účet
Avatar
Odpovídá na David Hartinger
Neaktivní uživatel:6.8.2012 20:07

okej,zde máš to escapování (stačí ??)

<?php
if (isset($_POST['odeslat']))
{
$vtip = htmlspecialchars($_POST['vtip']);

if (mysql_query('INSERT INTO ' . $_POST['kategorie'] . 'VALUES ($vtip)',$spojeni))
{
                echo ('Vtip úspěšně přidán !');
                }
        else
            {
                echo (' Vtip nepřidán,někde nastala chyba...');
            }
}
?>

Ale vypíše to chybové hlášení (Vtip nepřidán,někde nastla chyba...)

Nahoru Odpovědět
6.8.2012 20:07
Neaktivní uživatelský účet
Avatar
Odpovídá na David Hartinger
Neaktivní uživatel:6.8.2012 20:09

btw. když už jsme u toho escapování,ty tu taky jednu věc nemáš escapovanou...

Nahoru Odpovědět
6.8.2012 20:09
Neaktivní uživatelský účet
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Neaktivní uživatel
Kit:6.8.2012 20:36
$kategorie=mysql_real_escape_string($_POST['kategorie']);
$vtip=mysql_real_escape_string($_POST['vtip']);

$result=mysql_query("INSERT INTO vtipovnik (kategorie, vtip) VALUES ('$kategorie','$vtip')",$spojeni);

Sice tento zastaralý způsob už nepoužívám, ale snad to mám správně. Ty první dva řádky ber jako nezbytnou nutnost, pokud o tu databázi nechceš přijít. Každý uživatelský vstup musíš takto ošetřit proti útokům nebo použít novější ovladač s parametrizovanými dotazy.

Na esapování rozhodně nepoužívej htmlspecialchars(), tato funkce se používá až při výstupu z databáze do HTML.

Nejsem tady nonstop, nevolej mě.

A ještě něco: Oprav si datový model. Byla by velká hloupost mít jednu tabulku pro každou kategorii vtipů.

Nahoru Odpovědět
6.8.2012 20:36
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Kit
Kit:6.8.2012 20:58

A ještě přídavek: Po přidání vtipu do tabulky zavolej tyto funkce:

header("Location: .");
exit();

Je to prevence před tzv. doublepostem. Proces ukládání do tabulky se navíc neuloží do historie prohlížeče. Pokud někdo stiskne F5, nepošle se znovu a ani při návratu o stránku zpět.

Nahoru Odpovědět
6.8.2012 20:58
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Odpovídá na Kit
Neaktivní uživatel:7.8.2012 6:19

to mě už taky napadlo :)

Nahoru Odpovědět
7.8.2012 6:19
Neaktivní uživatelský účet
Avatar
Odpovídá na Kit
Neaktivní uživatel:7.8.2012 6:20

takže .......

.....
{
echo ('Vtip byl úspěšně přidán');
header("Location: .");
exit();
}

??

Nahoru Odpovědět
7.8.2012 6:20
Neaktivní uživatelský účet
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Neaktivní uživatel
Kit:7.8.2012 8:01

To echo tam nesmí být, protože pak by ta funkce header() přestala fungovat a vypisovala by varovné hlášení. Před ní nesmí být žádný textový výstup.

Nahoru Odpovědět
7.8.2012 8:01
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Odpovídá na Kit
Neaktivní uživatel:7.8.2012 8:05

Mám takhle (zatím bez header)

<?php
if (isset($_POST['odeslat']))
{
$kategorie=mysql_real_escape_string($_POST['kategorie']);
$vtip=mysql_real_escape_string($_POST['vtip']);


if (mysql_query($vysledek=mysql_query("INSERT INTO dbvtipy (kategorie, vtip) VALUES ('$kategorie','$vtip')",$spojeni)))
{
                echo ('Vtip úspěšně přidán !');
                }
        else
            {
                echo (' Vtip nepřidán,někde nastala chyba...');
            }
}
?>

Ale nechce se to do té tabulky vložit,kontroloval jsem to i v adminovi a nic tam není :(

Nahoru Odpovědět
7.8.2012 8:05
Neaktivní uživatelský účet
Avatar
Odpovídá na Neaktivní uživatel
Neaktivní uživatel:7.8.2012 8:06

ou to je blbost :D už asi vím

Nahoru Odpovědět
7.8.2012 8:06
Neaktivní uživatelský účet
Avatar
Odpovídá na Neaktivní uživatel
Neaktivní uživatel:7.8.2012 8:08

už mi to jedéé :D
kam si tím heder tedy ? před echo ?

Nahoru Odpovědět
7.8.2012 8:08
Neaktivní uživatelský účet
Avatar
Kit
Tvůrce
Avatar
Kit:7.8.2012 8:13

Asi máš jinou strukturu tabulek. Proto je dobré používat nové ovladače MySQL a nechat si vyhodit výjimku.

Asi máš jinak strukturu DB.

Je zvykem pojmenovávat DB tabulky v jednotném čísle.

Také tam vidím vnořené volání funkce mysql_query(), což je blbost vzniklá opisováním.

Nahoru Odpovědět
7.8.2012 8:13
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Odpovídá na Kit
Neaktivní uživatel:7.8.2012 8:15

<?php
if (isset($_POST['o­deslat']))
{
$kategorie=mys­ql_real_escape_strin­g($_POST['kate­gorie']);
$vtip=mysql_re­al_escape_strin­g($_POST['vtip']);

if (mysql_query("IN­SERT INTO dbvtipy (kategorie, vtip) VALUES ('$kategorie','$vtip')"­,$spojeni))
{
echo ('<script type="text/ja­vascript" src="pridan.js"></scrip­t>');
}
else
{
echo ('<script type="text/ja­vascript" src="nepridan­.js"></script>');
}
}
?>

Nahoru Odpovědět
7.8.2012 8:15
Neaktivní uživatelský účet
Avatar
Nahoru Odpovědět
7.8.2012 8:15
Neaktivní uživatelský účet
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Neaktivní uživatel
Kit:7.8.2012 8:15

To echo tam vůbec nebude. Stejně by se nezobrazilo, protože header() dělá přesměrování. Můžeš ho napsat třeba takto:

header('Location: uspech.php');

a napsat speciální podstránku uspech.php.

Nahoru Odpovědět
7.8.2012 8:15
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Odpovídá na Kit
Neaktivní uživatel:7.8.2012 8:17

a mužu to mít jak jsem teď posílal ?
obsah souborů js :
pridan.js

alert("Vtip úspěšně přidán");
window.close();

nepridan.js

alert("Vtip nepřidán...........");
window.close();
Nahoru Odpovědět
7.8.2012 8:17
Neaktivní uživatelský účet
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Neaktivní uživatel
Kit:7.8.2012 8:19

Můžeš, ale nebude to fungovat správně. Zkus si několikrát F5 za sebou. Vtip se ti přidá opakovaně.

Nahoru Odpovědět
7.8.2012 8:19
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Odpovídá na Kit
Neaktivní uživatel:7.8.2012 8:21

Ale na to nebude dostatek času,nebo jo ? Vtip se přidá,vyletí zpráva,a když kliknu na OK tak se okno hned zavře,nebo ne ?

Nahoru Odpovědět
7.8.2012 8:21
Neaktivní uživatelský účet
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Neaktivní uživatel
Kit:7.8.2012 8:27

Po každém odeslání dat metodou POST je nutné ta odeslaná data z formuláře zrušit. Nejlépe přes zmíněný header(). Javascript bych do toho vůbec netahal, protože zablokuje funkci header(), viz výše.

Nahoru Odpovědět
7.8.2012 8:27
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Odpovídá na Kit
Neaktivní uživatel:7.8.2012 8:31

ok nějak to zkusím ;)

Nahoru Odpovědět
7.8.2012 8:31
Neaktivní uživatelský účet
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Neaktivní uživatel
Kit:7.8.2012 8:40

Jde to celé udělat i přes AJAX, ale nejprve se nauč klasiku. Ta funguje vždy.

Zmíněná technika se nachází v knížce od Koska
http://www.kosek.cz/…aplikaci.pdf
Trochu jsem si ji vylepšil.

Nahoru Odpovědět
7.8.2012 8:40
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Odpovídá na Kit
Neaktivní uživatel:7.8.2012 14:40

z roku 99 :/

Nahoru Odpovědět
7.8.2012 14:40
Neaktivní uživatelský účet
Avatar
Odpovídá na Kit
Neaktivní uživatel:7.8.2012 15:32

Fajn,mám to tam :) akorát to tak napůl nefunguje... Vtip se přidává bez problému,ale kategorie se nechce poslat,v PhPMyAdmin je "kategorie" prázdná - na stránce se nic nevypíše. Zkoušel jsem ručně v adminovi upravit "kategorie" na "ostatní" a na stránce se text vypsal :) takže vypisování funguje,jen tu mám problém s posláním té kategorie... posílám zdroják...

<h2>Přidat vtip !</h2>
  <form action="pridej.php" method="post">
  <textarea name="vtip" rows="20" cols="60"></textarea>
  <select title="Vyber...">
  <option name="kategorie" value="blondynky">Blondýnky</option>
  <option name="kategorie" value="doktori">Doktoři</option>
  <option name="kategorie" value="opilci">Opilci</option>
  <option name="kategorie" value="pocitace">Počítače</option>
  <option name="kategorie" value="policejni">Policejní</option>
  <option name="kategorie" value="programatori">Programátoři</option>
  <option name="kategorie" value="skola">Škola</option>
  <option name="kategorie" value="urednici">Úředníci</option>
  <option name="kategorie" value="zvirata">Zvířata</option>
  <option name="kategorie" value="ostatni">Ostatní</option>
  </select> <input type="submit" name="odeslat" value="Přidej !">
<?php
if (isset($_POST['odeslat']))
{
$kategorie = mysql_real_escape_string($_POST['kategorie']);
$vtip = mysql_real_escape_string($_POST['vtip']);


if (mysql_query("INSERT INTO dbvtipy (kategorie, vtip) VALUES ('$kategorie','$vtip')",$spojeni))
            {
        header('Location: pridan.html');
            }
        else
            {
           header('Location: nepridan.html');
            }
}
?>
Nahoru Odpovědět
7.8.2012 15:32
Neaktivní uživatelský účet
Avatar
Odpovídá na Neaktivní uživatel
Neaktivní uživatel:7.8.2012 15:34

koukám že se mi tu ty CODE spojily - tam kde začíná <?php tak to už je další soubor

Nahoru Odpovědět
7.8.2012 15:34
Neaktivní uživatelský účet
Avatar
Neaktivní uživatel:7.8.2012 18:09

co s tím tedy je ? :(

Nahoru Odpovědět
7.8.2012 18:09
Neaktivní uživatelský účet
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Neaktivní uživatel
David Hartinger:7.8.2012 18:53

Máš špatně select, viz zdejší HTML 5 manuál: http://www.itnetwork.cz/index.php?…

Nahoru Odpovědět
7.8.2012 18:53
New kid back on the block with a R.I.P
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Neaktivní uživatel
Kit:7.8.2012 18:58

Však už možná víš, že to obvykle všechno spojuji do jednoho souboru. Jenom ty kusy kódu dávám v opačném pořadí.

Ještě jsi neposlal strukturu tabulky. Také je dobré si přečíst chybové hlášení, které ti databáze pošle při neúspěchu.

Nahoru Odpovědět
7.8.2012 18:58
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kit
Tvůrce
Avatar
Odpovídá na David Hartinger
Kit:7.8.2012 19:01

Vidíš, to mě nenapadlo nakouknout do formuláře. Nečekal jsem, že to někdo zvoře, když je kolem tolik návodů.

Nahoru Odpovědět
7.8.2012 19:01
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Neaktivní uživatel:7.8.2012 21:14

Teď mám maličký problém s vypisováním...
mám toto

$vypis = mysql_query("SELECT vtip FROM dbvtipy WHERE kategorie='ostatni'",$spojeni);

$radek=mysql_fetch_array($vypis);
if ($radek)                 //Povedlo se? Kdyby ne, vyšla by logická nula.
 $vtipy=$radek['vtip'];  //OK, máme to - přečti číslo.
 else $vtipy='Error';           //Nepovedlo se - dej tam nějakou chybovou hlášku.

echo($vtipy);

Jenže to nevypíše všechny vtipy,jen ten 1.
Asi se to dělá nějak přes "for"..nevím jak :/

Nahoru Odpovědět
7.8.2012 21:14
Neaktivní uživatelský účet
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Neaktivní uživatel
Kit:7.8.2012 21:32

Zkus tohle:

while($radek=mysql_fetch_assoc($vypis)){
...
}
Nahoru Odpovědět
7.8.2012 21:32
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Odpovídá na Kit
Neaktivní uživatel:8.8.2012 6:49
<?php
$vypis = mysql_query("SELECT vtip FROM dbvtipy WHERE kategorie='ostatni'",$spojeni);

$radek=mysql_fetch_array($vypis);



while($radek=mysql_fetch_assoc($vypis))
{
 if ($radek)                 //Povedlo se? Kdyby ne, vyšla by logická nula.
 $vtipy=$radek['vtip'];  //OK, máme to - přečti číslo.
 else $vtipy='Error';           //Nepovedlo se - dej tam nějakou chybovou hlášku.

echo($vtipy);
}

?>

Takto ?

Nahoru Odpovědět
8.8.2012 6:49
Neaktivní uživatelský účet
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Neaktivní uživatel
Kit:8.8.2012 6:57

Proč tak složitě?

<?php
$vypis = mysql_query("SELECT vtip FROM dbvtipy WHERE kategorie='ostatni'",$spojeni);
while($radek=mysql_fetch_assoc($vypis)) {
   echo "<p>", htmlspecialchars($radek['vtip']),"</p>\n";
}
Nahoru Odpovědět
8.8.2012 6:57
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Odpovídá na Kit
Neaktivní uživatel:8.8.2012 7:28

ahá :D jdu ozkoušet ;)
dík :)

Nahoru Odpovědět
8.8.2012 7:28
Neaktivní uživatelský účet
Avatar
Odpovídá na Kit
Neaktivní uživatel:8.8.2012 7:34

takže jsem zase něco pokazil :D

<?php
$vypis = mysql_query("SELECT vtip FROM dbvtipy WHERE kategorie='ostatni'",$spojeni);

$radek=mysql_fetch_array($vypis);


while($radek=mysql_fetch_assoc($vypis)) {
   echo "<p>", htmlspecialchars($radek['vtip']),"</p>\n";
}


?>

takto nebo ještě jinak ?

Nahoru Odpovědět
8.8.2012 7:34
Neaktivní uživatelský účet
Avatar
Kit
Tvůrce
Avatar
Kit:8.8.2012 7:36

K čemu je dobrá funkce mysql_fetch_a­rray()? Jenom ti zlikviduje první vtip.

Nahoru Odpovědět
8.8.2012 7:36
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Odpovídá na Neaktivní uživatel
Neaktivní uživatel:8.8.2012 7:36

teď na to tak koukám,ono to funguje,ale ten poslední vtip se nevypíše

Nahoru Odpovědět
8.8.2012 7:36
Neaktivní uživatelský účet
Avatar
Odpovídá na Kit
Neaktivní uživatel:8.8.2012 7:38

takže jen

?php
$vypis = mysql_query("SELECT vtip FROM dbvtipy WHERE kategorie='ostatni'",$spojeni);
while($radek=mysql_fetch_assoc($vypis)) {
   echo "<p>", htmlspecialchars($radek['vtip']),"</p>\n";
}

????

Nahoru Odpovědět
8.8.2012 7:38
Neaktivní uživatelský účet
Avatar
Odpovídá na Neaktivní uživatel
Neaktivní uživatel:8.8.2012 7:39

OK,moc moc moc moc moc moc moc dííííííííík =D

Nahoru Odpovědět
8.8.2012 7:39
Neaktivní uživatelský účet
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Neaktivní uživatel
Kit:8.8.2012 7:43

To jsi jen zkopíroval můj post. Samozřejmě, víc není třeba.

Možná bys mohl doplnit detekci chybových stavů, ale pro začátek je tam kvůli jednoduchosti dávat nemusíš. Proto používám PDO. Udělá spoustu práce za mne a navíc je i rychlejší.

Nahoru Odpovědět
8.8.2012 7:43
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Odpovídá na Kit
Neaktivní uživatel:8.8.2012 7:48

...dá se nějak jednoduše nastavit řazení od nejstaršího po nejnovější ?

Nahoru Odpovědět
8.8.2012 7:48
Neaktivní uživatelský účet
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Neaktivní uživatel
Kit:8.8.2012 8:12

Samozřejmě to jde.

SELECT vtip FROM dbvtipy WHERE kategorie='ostatni' ORDER BY Datum;
Nahoru Odpovědět
8.8.2012 8:12
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Nahoru Odpovědět
8.8.2012 8:13
Neaktivní uživatelský účet
Avatar
Odpovídá na Kit
Neaktivní uživatel:8.8.2012 8:14

...ale já tam nemám datum vložení vtipu,asi to tam mám přidat že ?

Nahoru Odpovědět
8.8.2012 8:14
Neaktivní uživatelský účet
Avatar
Kit
Tvůrce
Avatar
Nahoru Odpovědět
8.8.2012 8:16
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 50 zpráv z 93.