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.


Zobrazeno 50 zpráv z 93.
K personalizaci obsahu a reklam, poskytování funkcí sociálních médií a analýze naší návštěvnosti využíváme soubory cookie. Informace o tom, jak náš web používáte, sdílíme se svými partnery pro sociální média, inzerci a analýzy. Partneři tyto údaje mohou zkombinovat s dalšími informacemi, které jste jim poskytli nebo které získali v důsledku toho, že používáte jejich služby.
Používáme nezbytné cookies pro fungování webu a s tvým souhlasem také analytické a marketingové cookies.
Zajišťují základní funkce, bezpečnost a služby, které sis vyžádal. Nelze je vypnout.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| ITnetwork | ITnetwork | Provoz webu, relace, přihlášení a uložení nastavení cookies. | PHPSESSID, auth_token, sid, itn_consent_impression, __Host-itn_consent | Relace až 1 rok |
| Google Tag Manager | Správa značek a načítání měřicích nástrojů webu. | Žádné | Neukládá se | |
| Google Fonts | Načítání typografie webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google Hosted Libraries | Načítání potřebných knihoven a stylů webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google reCAPTCHA | Ochrana formulářů a webu před zneužitím. | _GRECAPTCHA, rc::a, rc::b, rc::c, rc::f | Relace až 180 dní | |
| YouTube | Přehrávání vloženého video obsahu. | localStorage, IndexedDB; cookies after playback interaction | Relace až trvalé úložiště | |
| Vimeo | Vimeo | Přehrávání vloženého video obsahu. | __cf_bm, _cfuvid, vuid, localStorage, IndexedDB | Relace až 2 roky |
| Facebook Login | Meta | Přihlášení pomocí účtu třetí strany. | Úložiště řízené poskytovatelem | Relace až 1 rok |
| GoPay | GoPay | Zpracování uživatelem vyžádané platby. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
Pomáhají nám porozumět používání webu a zlepšovat ho.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Analytics 4 | Měření návštěvnosti a používání webu. | _ga, _ga_* | Až 2 roky | |
| Microsoft Clarity | Microsoft | Měření návštěvnosti a používání webu. | _clck, _clsk, _cltk | Relace až 1 rok |
Slouží k měření kampaní, personalizaci reklamy a marketingové komunikaci.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Ads | Měření kampaní, reklama a remarketing. | _gcl_au, _gcl_ls | Relace až 90 dní | |
| Meta Pixel | Meta | Měření kampaní, reklama a remarketing. | _fbp, _fbc, localStorage | Až 90 dní |
| Sklik | Seznam.cz | Měření kampaní, reklama a remarketing. | retargeting, sid, szn:* | Relace až trvalé úložiště |
| LinkedIn Insight | Měření kampaní, reklama a remarketing. | bcookie, li_gc, lidc, __cf_bm | Relace až 1 rok | |
| Ecomail | Ecomail.cz | Měření kampaní, reklama a remarketing. | ecmid, Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
| Atribuce kampaní ITnetwork | ITnetwork | Přiřazení návštěvy a objednávky ke kampani. | campaign_clid[*], user_session_context | Až 1 rok |
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.