Diskuze: Načtení řádku z databáze do pole
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
Člen
Zobrazeno 12 zpráv z 12.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
První věc : Queryall bude mit asi metodu fetchAll(). Tu nahraď pouze fetch() (vzdy kdyz vybiras jeden radek pouzivej fetch)
Vem si co ten tvuj program dela (krok po kroku)...
Druhá věc: u podminky if ($_post...) bys tam podle me mel mit jeste isset
(nevyhazuje to pri prvnim sousteni warning/notice?)
If(isset($_POST['kPorovnaniB'])
{ If(post == radekZDatabaze)
...
Snad chpes
A posledni vec k tvemu problemu:
Promennou $radek nahrad $_SESSION['radek'], protoze si ji script 'bude
pamatovat' a overeni delej jeste PRED VYBEREM z databaze.
Jsou 2 rano a pisu z mobilu. Kdybys tomh nerozuměl, klidne ti to prepisu z meho
'pseudo kodu'
<?php
session_start();
require('Db.php');
Db::connect('localhost', 'databaze', 'root', '');
//podmínka musí být před voláním příkazu do DB (jinak se původní přepíše)
if(isset($_POST['kPorovnaniB']))
{
if($_POST['kPorovnaniB'] == $_SESSION["radek")
{
//dobře
}
else
{
//špatně
}
}
//Místo queryAll použiješ query (aspoň myslím, čekáš jeden řádek)
$_SESSION["radek"] = Db::query('SELECT* from tabulky order by rand() limit 1');
echo('<h2>Uživatelé</h2><table border="1">');
echo('<tr><td>' . htmlspecialchars($u['sloupecA']));
echo('</td><td>' . htmlspecialchars($u['SloupecB']));
echo('</td></tr>');
echo('</table>');
?>
Toto ti ale predsa nemôže fungovať ... Ty overuješ v podmienke $_SESSION["radek"] ktorý si deklaruješ až pod celou tou podmienkou takže by mu to kričalo neexistujúci $_SESSION. Nezabúdaj na to že kód ide z hora dole ...
Chceš vytvoriť takúto tabuľku lebo som z toho celkom zmätený ...
Uživatelé
db fetch - stlpec A | uživateľský vstup - stlpec B |
heslo | heslo |
Ale v tom prípade nerozumiem prečo sa volá uživatelia keď overuješ len jedného skús mi popísať na čo to potrebuješ prípadne viac popísať a hodím ti tu kód ...
Fungovat to samozřejmě bude.
$_SESSION se ukládá na server, není potřeba jí deklarovat podruhé ve
scriptě protože..
Při prvním spuštění scriptu není deklarovaný $_POST (=session se
kontrolovat nebude). Zároveň při prvním spuštění se zavolá databáze a
řádek se uloží do SESSION (na serveru).
Po odeslání formuláře se script pustí od znova:
POST už bude deklarovaný, takže se podmínkou ověří jestli se rovnají.
Proměná SESSION se vezme ze serveru, příkazem session_start() řekneme, aby
se SESSION načetli do scriptu.
Pokud použiji tento kód napíše mi to
Notice: Undefined variable: u in C:\xampp\htdocs\PhpProject1\newEmptyPHP.php on line 24
Notice: Undefined variable: u in C:\xampp\htdocs\PhpProject1\newEmptyPHP.php on line 25
pro jasnější příklad vyplním tabulku srozumitelně jak by mohla fungovat(jde pouze o příklad).Databáze bude obsahovat nějaký textový hodnoty toto je pouze ilustrační pro pochopení
sloupecA | sloupecB |
1+2 | 3 |
2+3 | 5 |
3+0 | 3 |
1+1 | 2 |
jde o to že náhodně vyberu řádek z databáze ze kterého sloupecA zobrazím v prohlížeči a ve formuláři očekávám hodnotu ze sloupecB, v případě že se tyto hodnoty shodují(sloupecB=uživatelskývstup) "dobře" pokud ne "špatně", poté se načte znova jiný řádek a to se opakuje
Nejsem si jist, jestli jsem pochopil tvůj dotaz, ale zkus tvé PHP nahradit tímto:
if (isset($_POST["kPorovnaniB"])) {
Db::connect('localhost', 'databaze', 'root', '');
$radek = Db::queryAll('SELECT * from tabulky order by rand() limit 1');
foreach ($radek as $u) {
echo('<h2>Uživatelé</h2><table border="1">');
echo('<tr><td>' . htmlspecialchars($u['sloupecA']));
echo('</td><td>' . htmlspecialchars($_POST["kPorovnaniB"]));
echo('</td></tr>');
echo('</table>');
if ($_POST['kPorovnaniB'] == $u['sloupecA'])
echo("dobře");
else
echo ("spatne");
}
}
Pokud máš v databázi ve sloupci sloupecA textový řetězec s příkladem a nikoliv pouze číslo, pak použij tohle:
if (isset($_POST["kPorovnaniB"])) {
Db::connect('localhost', 'databaze', 'root', '');
$radek = Db::queryAll('SELECT * from tabulky order by rand() limit 1');
foreach ($radek as $u) {
$hodnotaZDb = eval("return $u[sloupecA];");
echo('<h2>Uživatelé</h2><table border="1">');
echo('<tr><td>' . htmlspecialchars($u['sloupecA']));
echo('</td><td>' . $_POST["kPorovnaniB"]);
echo('</td></tr>');
echo('</table>');
if ($_POST['kPorovnaniB'] == $hodnotaZDb)
echo("dobře");
else
echo ("spatne");
}
}
Ještě k té funkci eval(), pro cvičené příklady je dobrá, ale na reálném webu ji raději nepoužívej. Vykoná vše, co do ní uživatel napíše a tudíž představuje velké bezpečnostní riziko. V tomto případě bys místo eval() mohl použít nějakou vlastní funkcí, která regulárním výrazem rozloží příklad z databáze na 2 operandy a operátor a ty podle druhu operandu buď sečte, odečte, atp.
Nemužu si pomoci ale nějak mi to nefunguje ...
cesky | anglicky |
jedna | one |
dva | two |
pro lepší vysvětlení přikládám jinou tabulku máte nějaké nápady
jak to zprovoznit ?
Náhodně vybere z databáze vypíše "jedna" a přes formulář očekáváme
"one" --->dobře když ne ---> špatně
Zobrazeno 12 zpráv z 12.