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.

Tvůrce

Zobrazeno 50 zpráv z 93.
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
To tu nikdo není ??
Btw chybu nemusíš mať iba na 19 ale už oveľa skôr, ide o to že tá chyba sa prejavila na 19
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...)
btw. když už jsme u toho escapování,ty tu taky jednu věc nemáš escapovanou...
$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ů.
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.
takže .......
.....
{
echo ('Vtip byl úspěšně přidán');
header("Location: .");
exit();
}
??
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.
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í
už mi to jedéé
kam si tím heder tedy ? před echo ?
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.
<?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))
{
echo ('<script type="text/javascript"
src="pridan.js"></script>');
}
else
{
echo ('<script type="text/javascript"
src="nepridan.js"></script>');
}
}
?>
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.
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();
Můžeš, ale nebude to fungovat správně. Zkus si několikrát F5 za sebou. Vtip se ti přidá opakovaně.
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 ?
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.
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.
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');
}
}
?>
koukám že se mi tu ty CODE spojily - tam kde začíná <?php tak to už je další soubor
co s tím tedy je ?
Máš špatně select, viz zdejší HTML 5 manuál: http://www.itnetwork.cz/index.php?…
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.
Vidíš, to mě nenapadlo nakouknout do formuláře. Nečekal jsem, že to někdo zvoře, když je kolem tolik návodů.
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 :/
Zkus tohle:
while($radek=mysql_fetch_assoc($vypis)){
...
}
<?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 ?
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";
}
takže jsem zase něco pokazil
<?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 ?
teď na to tak koukám,ono to funguje,ale ten poslední vtip se nevypíše
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";
}
????
OK,moc moc moc moc moc moc moc dííííííííík =D
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ší.
...dá se nějak jednoduše nastavit řazení od nejstaršího po nejnovější ?
Samozřejmě to jde.
SELECT vtip FROM dbvtipy WHERE kategorie='ostatni' ORDER BY Datum;
...ale já tam nemám datum vložení vtipu,asi to tam mám přidat že ?
Zobrazeno 50 zpráv z 93.