Avatar
Michal Kuba
Redaktor
Avatar
Michal Kuba:

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:

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
Redaktor
Avatar
Odpovídá na pivovary
Michal Kuba:

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:

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
Redaktor
Avatar
Odpovídá na pivovary
Michal Kuba:

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:

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
Redaktor
Avatar
Odpovídá na pivovary
Michal Kuba:

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:

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í
+1 bodů
Řešení problému
 
Nahoru Odpovědět 20.4.2015 22:36
Avatar
IT Man
Redaktor
Avatar
Odpovídá na Michal Kuba
IT Man:

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
Když nevíš jak dál, podá ti ruku někdo, od koho by jsi to nečekal. A tu šanci musíš přijmout!
Avatar
Jan Demel
Redaktor
Avatar
Jan Demel:

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
IT Man
Redaktor
Avatar
Odpovídá na IT Man
IT Man:

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

Nahoru Odpovědět 21.4.2015 7:07
Když nevíš jak dál, podá ti ruku někdo, od koho by jsi to nečekal. A tu šanci musíš přijmout!
Avatar
Michal Kuba
Redaktor
Avatar
Odpovídá na pivovary
Michal Kuba:

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.