NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

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.

Aktivity
Avatar
karbos166
Člen
Avatar
karbos166:6.6.2016 23:16

Zdravím jsem začátečník ohledně PHP ale už delší dobu bojuji s jednou věci.
Dělám si takovou "srandu" mám už část hotovou jen nevím jak vyřešit jednu věc.
Chci vybrat jeden řádek z databáze (což funguje) vypsat jeho hodnotu v sloupci A a poté porovnat se vstupem od uživatele (porovnání se sloupcem B)
výsledek dobře-špatně.
funguje to jen to má mouchu v tom že to nedokáže porovnávat s tou vypsanou hodnotou ale porovnává to s hodnotou kterou bude vybírat tudíž už zas s jiným řádkem(jestli chápete jak to myslím... když tak se mohu vyjádřit lépe :D )

takže bych byl rád za nějaký rady a nápady :) chtělo by to asi načíst do pole nebo tak něco ne ?

session_start();
require('Db.php');
Db::connect('localhost', 'databaze', 'root', '');


$radek = Db::queryAll('
SELECT* from tabulky order by rand() limit 1
');
echo('<h2>Uživatelé</h2><table border="1">');
foreach ($radek as $u)
{
        echo('<tr><td>' . htmlspecialchars($u['sloupecA'])); //tato hodnota se vypíše v HTML
        echo('</td><td>' . htmlspecialchars($u['SloupecB'])); // pokud do formuláře bude vyplněna tato hodnota tak = spravne
        echo('</td></tr>');
}
echo('</table>');


      if($_POST['kPorovnaniB']== $u['SloupecB'] )
     echo("dobře");

    else
    echo ("spatne");

Posílám jen PHP část v html je jen

<form method="post">
        <br />
        <input type="text" name="kPorovnaniB" /><br />

        <input type="submit" value="odeslat" />
 
Odpovědět
6.6.2016 23:16
Avatar
Odpovídá na karbos166
Michael Kufner:7.6.2016 1:41

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($_POS­T['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' :)

 
Nahoru Odpovědět
7.6.2016 1:41
Avatar
Michael Kufner:7.6.2016 10:13
<?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>');
?>
 
Nahoru Odpovědět
7.6.2016 10:13
Avatar
Odpovídá na Michael Kufner
Dominik Gavrecký:7.6.2016 14:02

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 ...

Nahoru Odpovědět
7.6.2016 14:02
Hlupák nie je ten kto niečo nevie, hlupákom sa stávaš v momente keď sa na to bojíš opýtať.
Avatar
Odpovídá na karbos166
Dominik Gavrecký:7.6.2016 14:06

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 ...

Nahoru Odpovědět
7.6.2016 14:06
Hlupák nie je ten kto niečo nevie, hlupákom sa stávaš v momente keď sa na to bojíš opýtať.
Avatar
Michael Kufner:7.6.2016 20:09

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.

 
Nahoru Odpovědět
7.6.2016 20:09
Avatar
karbos166
Člen
Avatar
Odpovídá na Michael Kufner
karbos166:7.6.2016 22:33

Pokud použiji tento kód napíše mi to

Notice: Undefined variable: u in C:\xampp\htdoc­s\PhpProject1\ne­wEmptyPHP.php on line 24

Notice: Undefined variable: u in C:\xampp\htdoc­s\PhpProject1\ne­wEmptyPHP.php on line 25

 
Nahoru Odpovědět
7.6.2016 22:33
Avatar
karbos166
Člen
Avatar
Odpovídá na Dominik Gavrecký
karbos166:7.6.2016 22:44

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í(sloupec­B=uživatelskýv­stup) "dobře" pokud ne "špatně", poté se načte znova jiný řádek a to se opakuje

 
Nahoru Odpovědět
7.6.2016 22:44
Avatar
Michal
Člen
Avatar
Michal:7.6.2016 22:45

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");
    }
}
Editováno 7.6.2016 22:48
 
Nahoru Odpovědět
7.6.2016 22:45
Avatar
Michal
Člen
Avatar
Michal:7.6.2016 22:56

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");
    }
}
 
Nahoru Odpovědět
7.6.2016 22:56
Avatar
Michal
Člen
Avatar
Michal:7.6.2016 23:36

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.

 
Nahoru Odpovědět
7.6.2016 23:36
Avatar
karbos166
Člen
Avatar
karbos166:15.6.2016 23:35

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ě

 
Nahoru Odpovědět
15.6.2016 23:35
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 12 zpráv z 12.