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: Předávání parametrů - nyní nefunguje :O

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

Aktivity
Avatar
Michal Kuba
Tvůrce
Avatar
Michal Kuba:20.4.2015 21:31

Ahoj.

NELEKEJTE SE PROSÍM DÉLKY, NENÍ TO TAK HROZNÝ :)))
Předělávám svůj web do nové podoby (funkční) pomocí MVC - mnozí to jistě již postřehli :D

Na staré verzi, když jsem chtěl podat inzerát, zvládl to jeden php soubor s takovýmto kodem:

$titulek=$_POST['titulek'];
$text=$_POST['text'];
$kategorie=$_POST['kategorie'];
$mesto=$_POST['mesto'];
if ($_POST){
    if(empty($titulek)){
        $hlaska='Zadejte titulek inzerátu! (Nezapomeňte na výběr kategorie)';
    }
    else if(empty($text)){
        $hlaska='Nebyl zadán text inzerátu!(Nezapomeňte na výběr kategorie)';
    }
   else if(empty($kategorie)){
        $hlaska='Vyberte kategorii!';
    }
    else if(empty($mesto)){
        $hlaska='Zadejte město!(Nezapomeňte na výběr kategorie)';
    }
    else if(!$_POST['ID']){
     if ( isset($_POST['kategorie']) AND isset($_POST['upresneni_' . $_POST['kategorie']]) )

             $upresneni = $_POST['upresneni_' . $_POST['kategorie']];

     $autor = $_SESSION['uzivatel_jmeno'];

         $ulozitInzerat=  Db::query('
           INSERT INTO inzeraty (autor, datum_vlozeni, titulek, text, kategorie, upresneni,  mesto)
           VALUES (?,CURRENT_TIMESTAMP(),?, ?, ?, ?, ?)
             ',$autor, $_POST['titulek'], $_POST['text'], $_POST['kategorie'],$upresneni,$_POST['mesto'] );
             $autor = $_SESSION['uzivatel_jmeno'];
            if($ulozitInzerat) {
                 $hlaska2='Inzerát byl úspěšně přidán. Najdete ho v administraci, kde jej lze editovat a smazat.';
             header('Location: podat_inzerat.php');
            exit;}

a HTML podoba:

<form name="form" id="podani_inzeratu" method="post">
                    <input type="hidden" name="ID" >
                    Titulek: <br>
                    <input type="text" name="titulek" value="<?= htmlspecialchars($titulek) ?>"/><br />
                    Text inzerátu: <br>
                    <textarea name="text" onKeyPress="over();"/><?php echo htmlspecialchars($text); ?></textarea><br />
                zbývá znaků: <input type="text" name="cislo" size="2" value="500">
zapsáno znaků: <input type="text" name="cislo2" size="2" value="0">
                    Kategorie: <br>

                    <select class="kategorie" name="kategorie" value="<?= htmlspecialchars($kategorie) ?>"/>
            <option>Vyber</option>
            <option value="automobily">Auto</option>
            <option value="motorky">Moto</option>
            <option value="práce">Práce</option>
            <option value="reality">Reality</option>
            <option value="stavba">Stavba</option>
            <option value="mobily">Mobily</option>
            <option value="počítače">Počítače</option>
            <option value="audioVideo">Audio & video</option>
        </select><br>

        <select class="audioVideo box" name="upresneni_audioVideo">
        <option  value="televizory">Televizory</option>
        <option  value="fotoaparaty">Fotoaparáty</option>
        <option  value="videokamery">Videokamery</option>
        <option value="zesilovace">Zesilovače</option>
        <option  value="radia">Rádia</option>
        <option value="jine">Jiné</option>
        </select>
//... a dále všechny podkategorie

Všechno se uložilo jak mělo a bylo hotovo.. jenže nyní se mi pomocí MVC neuloží upřesnění (podkategorie) a ani autor, to ale ted neřeším..
stránka podatinzerat.phtml má stejnou html strukturu jako výše uvedený příklad. Obsluhuje to PodatinzeratKon­troler a SpravceInzeratu a Uzivatelu.

PodatinzeratKon­troler:

class PodatinzeratKontroler extends Kontroler {
    public function zpracuj($parametry){


        $spravceInzeratu= new SpravceInzeratu();
        $spravceUzivatelu = new SpravceUzivatelu();
        $uzivatel = $spravceUzivatelu->vratUzivatele();
        if (!isset($_SESSION["uzivatel"]))
{
        $this->pridejZpravu('Pro vložení inzerátu se musíte přihlásit.');
          $this->presmeruj('prihlaseni');
}
        $this->hlavicka = array(
                        'titulek' => 'Podat inzerát - Mainos.cz',
                        'klicova_slova' => 'podat inzerát, inzerát, mainos.cz, inzeráty zdarma',
                        'popis' => 'Přidání nového inzerátu na web Mainos.cz'
                );
        $this->pohled = 'podatinzerat';


        $inzerat = array(
                        'ID' => '',
                        'titulek' => '',
                        'text' => '',
                        'kategorie' => '',
                        $upresneni => '',
                        'mesto' => '',
                        $autor => '',
                );
       $titulek=$_POST['titulek'];
       $text=$_POST['text'];
       $kategorie=$_POST['kategorie'];
       $mesto=$_POST['mesto'];
       $upresneni = $_POST['upresneni_' . $_POST['kategorie']];
       $autor = $_SESSION['uzivatel']['jmeno'];

        if ($_POST)
                {
             if(empty($titulek)){
                $this->pridejZpravu('Zadejte titulek inzerátu (nezapomeňte vybrat kategorii).');
    }
            else if(empty($text)){
                 $this->pridejZpravu('Zadejte text inzerátu (nezapomeňte vybrat kategorii).');
    }
            else if(empty($kategorie)){
                $this->pridejZpravu('Vyberte kategorii');
    }
            else if(empty($mesto)){
                $this->pridejZpravu('Zadejte město (nezapomeňte vybrat kategorii).');
    }
            else if(!$_POST['ID']){
                if ( isset($_POST['kategorie']) AND isset($_POST['upresneni_' . $_POST['kategorie']]) )






                        $klice = array('titulek', 'text', 'kategorie', 'upresneni', 'mesto', 'autor');
                        $inzerat = array_intersect_key($_POST, array_flip($klice));
                        // Uložení článku do DB
                        $spravceInzeratu->ulozInzerat($_POST['ID'], $inzerat);
                        $this->pridejZpravu('Inzerát byl úspěšně uložen.');
                        $this->presmeruj('nejnovejsi');
                }

    }
}
}

SpravceInzeratu - metoda pro uložení:

public function ulozInzerat($id, $inzerat)
        {
                if (!$id)
                        Db::vloz('inzeraty', $inzerat);
                else
                        Db::zmen('inzeraty', $inzerat, 'WHERE ID = ?', array($id));
        }

A metoda vloz v Db.php je ze zdejšího wrapperu:

public static function vloz($tabulka, $parametry = array()) {
                return self::dotaz("INSERT INTO `$tabulka` (`".
                implode('`, `', array_keys($parametry)).
                "`) VALUES (".str_repeat('?,', sizeOf($parametry)-1)."?)",
                        array_values($parametry));
        }

V čem může být chyba? Protože inzerát se do tabulky uloží, ale bez vybraného upřesnění..

Editováno 20.4.2015 21:31
 
Odpovědět
20.4.2015 21:31
Avatar
pivovary
Člen
Avatar
pivovary:20.4.2015 21:53

v poli inzerat si pojmenovas klice pomoci promene, kterou jeste nemas definou a dle kodu tam ma byt asi pouze 'upresneni' a 'autor'

$inzerat = array(
                        'ID' => '',
                        'titulek' => '',
                        'text' => '',
                        'kategorie' => '',
                        $upresneni => '',
                        'mesto' => '',
                         $autor => '',
                );

$inzerat = array(
                        'ID' => '',
                        'titulek' => '',
                        'text' => '',
                        'kategorie' => '',
                        'upresneni' => '',
                        'mesto' => '',
                         'autor' => '',
                );
Editováno 20.4.2015 21:54
 
Nahoru Odpovědět
20.4.2015 21:53
Avatar
Michal Kuba
Tvůrce
Avatar
Odpovídá na pivovary
Michal Kuba:20.4.2015 21:57

Takhle jsem to měl hned na začátku, jenže to nijak nepomáhá.. Už to mám pro jistotu změněný, ale pes bude asi zakopanej někde jinde :/

 
Nahoru Odpovědět
20.4.2015 21:57
Avatar
pivovary
Člen
Avatar
Odpovídá na Michal Kuba
pivovary:20.4.2015 22:03

tak jedině zkontrolovat celé to pole $inzerat, kdyz mi neco nefunguje tak si vzdycky udelam

print_r($pozadovana_promena);
exit; // abych nemel v databazi pripadne x spatnych zaznamu

a takto si pomalinku projedu vsechno co to muze zpusobit.

Kdyz si to vlozis pred uloz_inzerat tak by sis mel poradit, s tim ze se ti klice v tom poli musi rovnat s nazvy sloupcu v dane tabulce

 
Nahoru Odpovědět
20.4.2015 22:03
Avatar
Michal Kuba
Tvůrce
Avatar
Odpovídá na pivovary
Michal Kuba:20.4.2015 22:09

když si to vypíšu tak to skutečně v tom poli vůbec ty dva klíče ani nevypíše (autor, upresneni).. ale proč? :/

 
Nahoru Odpovědět
20.4.2015 22:09
Avatar
pivovary
Člen
Avatar
Odpovídá na Michal Kuba
pivovary:20.4.2015 22:12

Zkus chvilku pátrat sám, ono takto se dost naučíš kde můžeš udělat chybu. Pokud na to nepřijdeš tak dej vědět, poradím jak dál

 
Nahoru Odpovědět
20.4.2015 22:12
Avatar
Michal Kuba
Tvůrce
Avatar
Odpovídá na pivovary
Michal Kuba:20.4.2015 22:16

ted sem zkusil udělat toto:

$inzerat['autor']= $_SESSION['uzivatel']['jmeno'];
      $inzerat['upresneni']=$_POST['upresneni_' . $_POST['kategorie']];

a v definici toho pole to nechat prázdné stejně jako ostatní položky.. ale stále se to tváří, že to pole vůběc neexistuje a tudíž ho nijak nepředává do databáze.. doufám že není chyba někde zde:

$klice = array('titulek', 'text', 'kategorie', 'upresneni', 'mesto', 'autor');
                        $inzerat = array_intersect_key($_POST, array_flip($klice));
                        // Uložení článku do DB
                        $spravceInzeratu->ulozInzerat($_POST['ID'], $inzerat);

to bych totiž asi úplně dobře nenašel :/
zkusím ještě pátrat..

 
Nahoru Odpovědět
20.4.2015 22:16
Avatar
pivovary
Člen
Avatar
Odpovídá na Michal Kuba
pivovary:20.4.2015 22:36

jednak s tím polem inzerat nikde nepracujes, buď si ho přímo dopln posty z formu vcetne toho upresneni a autora

$inzerat = array(
                        'ID' => $_POST["ID"],
                        'titulek' => $_POST["titulek"],
                        'text' => $_POST["text"],
                        'kategorie' => $_POST["kategorie"],
                        'upresneni' => $_POST['upresneni_' . $_POST['kategorie']],
                        'mesto' => $_POST["mesto"],
                         'autor' => '$_SESSION['uzivatel']['jmeno']',
                );

a dal pracuj s timto polem

if(empty($inzerat["titulek"])){

atd.

$inzerat = array_intersect_key($inzerat, array_flip($klice));
// Uložení článku do DB
$spravceInzeratu->ulozInzerat($_POST['ID'], $inzerat);
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
20.4.2015 22:36
Avatar
Jan Lupčík
Tvůrce
Avatar
Odpovídá na Michal Kuba
Jan Lupčík:21.4.2015 6:31

V druhém selectu máš name upresneni_audi­oVideo. Přejmenuj si to na jen upresneni.

Teda aspoň v tom minulém to tak bylo. :D

Editováno 21.4.2015 6:32
Nahoru Odpovědět
21.4.2015 6:31
TruckersMP vývojář
Avatar
Jan Demel
Tvůrce
Avatar
Jan Demel:21.4.2015 6:47

Dej sem prosím dump toho pole.

Nahoru Odpovědět
21.4.2015 6:47
To co se zdá být nemožné, je vždy možné.
Avatar
Jan Lupčík
Tvůrce
Avatar
Odpovídá na Jan Lupčík
Jan Lupčík:21.4.2015 7:07

Promiň, nevšiml jsem si tam doplnění té kategorie. Takže tam chyba nebude ...

Nahoru Odpovědět
21.4.2015 7:07
TruckersMP vývojář
Avatar
Michal Kuba
Tvůrce
Avatar
Odpovídá na pivovary
Michal Kuba:21.4.2015 9:25

Super, díky :) Stačilo to dát do toho pole a už to ukládá všechno :)

 
Nahoru Odpovědět
21.4.2015 9:25
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.