NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: Uncaught exception

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:16.1.2016 23:44

Ahoj.
Nějakou chvíli si lámu hlavu s tímto a nevím proč, nemůžu na to přijít, byť jsem již podobných věcí dělal už více a vždy to nakonec nějak šlo.
Chci z modal okna uložit nový článek, jenže mi skáče tato chyba:

Uncaught exception 'PDOException' with message 'SQLSTATE[42S22]: Column not found: 1054 Unknown column '' in 'field list'' in /data/www/19227­/teplostyl_cz/ad­min/modely/Db­.php:50 Stack trace: #0 /data/www/19227­/teplostyl_cz/ad­min/modely/Db­.php(50): PDO->prepare('INSERT INTO `cl...') #1 /data/www/19227­/teplostyl_cz/ad­min/modely/Db­.php(60): Db::dotaz('INSERT INTO `cl...', Array) #2 /data/www/19227­/teplostyl_cz/ad­min/modely/Sprav­ceClanku.php(21): Db::vloz('clanky', Array) #3 /data/www/19227­/teplostyl_cz/ad­min/kontrolery/Clan­kyKontroler.php(53): SpravceClanku->ulozClanek('', Array) #4 /data/www/19227­/teplostyl_cz/ad­min/kontrolery/Sme­rovacKontroler­.php(50): ClankyKontroler->zpracuj(Array) #5 /data/www/19227­/teplostyl_cz/ad­min/index.php(26): SmerovacKontroler->zpracuj(Array) #6 {main} thrown in /data/www/19227­/teplostyl_cz/ad­min/modely/Db­.php on line 50

Napřed hodím šablonu, odkud se vše načítá:

<?php foreach($clanek as $clanek): ?>
<div id="novyClanek" class="modal fade" role="dialog">
  <div class="modal-dialog">

    <!-- Modal content-->
    <div class="modal-content">
      <div class="modal-header">
        <button type="button" class="close" data-dismiss="modal">&times;</button>
        <h4 class="modal-title">UPRAVIT ČLÁNEK (ID článku: <?= $clanek['ID_clanek'] ?>)</h4>
      </div>
      <div class="modal-body">
           <form class="form-horizontal" role="form" method="post">
               <input type="hidden" name="ID_clanek" value="<?= $clanek['ID_clanek'] ?>" />
               <div class="form-group">
    <label class="control-label col-sm-2" for="autor">Autor:</label>
    <div class="col-sm-10">
        <input type="text" class="form-control" id="autor" placeholder="Vyplňte autora" value="<?= $clanek['autor'] ?>">
    </div>
  </div>
  <div class="form-group">
    <label class="control-label col-sm-2" for="nadpis">Nadpis:</label>
    <div class="col-sm-10">
      <input type="text" class="form-control" id="nadpis" placeholder="Vložte nadpis" value="<?= $clanek['nadpis'] ?>">
    </div>
  </div>
   <div class="form-group">
  <label class="control-label col-sm-2" for="anotace">Anotace:</label>
  <div class="col-sm-10">
      <textarea class="form-control" rows="3" id="anotace"><?= ($clanek['anotace']) ?></textarea>
  </div>
</div>
               <div class="form-group">
  <label class="control-label col-sm-2" for="obsah">Obsah článku:</label>
  <div class="col-sm-10">
  <textarea class="form-control" rows="6" id="obsah"><?= ($clanek['text']) ?></textarea>
  </div>
</div>
  <div class="form-group">
    <div class="col-sm-offset-2 col-sm-10">
      <button type="submit" class="btn btn-default">Uložit</button>
    </div>
  </div>
</form>
      </div>
      <div class="modal-footer">
        <button type="button" class="btn btn-default" data-dismiss="modal">Zavřít</button>
      </div>
    </div>

  </div>
</div>
 <?php endforeach; ?>

Toto je část kontroleru, která toto ovládá:

$clanek=array(
                    'ID_clanek'=>'',
                    'nadpis'=>'',
                    'anotace'=>'',
                    'text'=>'',
                    'autor'=>'',
                    'datum_vlozeni'=>'',
                    'url'=>'',
                    'active'=>''
                );

                if($_POST)
                {
                 $klice = array('nadpis','anotace','text','autor','datum_vlozeni','url','active');
                 $clanek= array_intersect_key($_POST, array_flip($klice));

                 $spravceClanku->ulozClanek($_POST['ID_clanek'],$clanek);
                 $this->pridejZpravu('Článek přidán!');
                 $this->presmeruj('clanky');
                }
                $this->data['clanek']=$clanek;

No a správce:

public function ulozClanek($id, $clanek)
        {
                if (!$id)
                        Db::vloz('clanky', $clanek);
                else
                        Db::zmen('clanky', $clanek, 'WHERE ID_clanek = ?', $id);
        }

A tedy ještě databázový wrapper, konkrétně část kde je evidentně chyba na řádku 50 (v tomto kousku kodu je to druhý řádek):

public static function dotaz($dotaz, $parametry = array()) {
                $navrat = self::$spojeni->prepare($dotaz);
                $navrat->execute($parametry);
                return $navrat->rowCount();
        }

Předem díky za jakoukoliv radu, možná na to nemůžu přijít jen skrze únavu.. :/

 
Odpovědět
16.1.2016 23:44
Avatar
Odpovídá na Michal Kuba
Martin Konečný (pavelco1998):17.1.2016 0:05

zdar,

ohraničuje ten wrapper sloupce do zpětných apostrofů? Pokud ne, zřejmě ti tam koliduje nějaký sloupec s klíčovým slovem (např. 'text).

Nahoru Odpovědět
17.1.2016 0:05
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
Michal Kuba
Tvůrce
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Michal Kuba:17.1.2016 9:42

Wrapper na vkládání dělá toto:

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

Zkusím si tam pohrát s apostrofy

 
Nahoru Odpovědět
17.1.2016 9:42
Avatar
Odpovídá na Michal Kuba
Martin Konečný (pavelco1998):17.1.2016 10:09

Zkus si vypsat, co obsahuje pole $clanek (třeba v metodě ulozClanek)

Nahoru Odpovědět
17.1.2016 10:09
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
Michal Kuba
Tvůrce
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Michal Kuba:17.1.2016 10:27

No, tam někde bude zakopanej pes. vrací to totiž prázdný pole a za boha mi ho nejde nijak naplnit..
Zkouším už i takový věci v kontroleru:

if($_POST)
                {
                  $_SESSION['clanek']=$clanek=array(
                    'ID_clanek'=>$_POST['ID_clanek'],
                    'nadpis'=>$_POST['nadpis'],
                    'anotace'=>$_POST['anotace'],
                    'text'=>$_POST['text'],
                    'autor'=>$_POST['autor'],
                    'datum_vlozeni'=>'1',
                    'url'=>'FEF',
                    'active'=>0
                );
                  $klice = array( 'nadpis','anotace','text','autor', 'datum_vlozeni','url', 'active');
                        $clanek = array_intersect_key($_POST, array_flip($klice));
                 $spravceClanku->ulozClanek($_SESSION['clanek']['ID_clanek'],$clanek);
                 $this->pridejZpravu('Článek přidán!');
                 $this->presmeruj('clanky');
                }
 
Nahoru Odpovědět
17.1.2016 10:27
Avatar
Michal Kuba
Tvůrce
Avatar
Odpovídá na Michal Kuba
Michal Kuba:17.1.2016 10:46

Už to načítá alespoň z formuláře, byla tam chyba že jsem u inputů neměl "name" ale jen "id" a proto to nic nebralo :) Teď ještě vyřešit tu stejnou chybu co na začátku

 
Nahoru Odpovědět
17.1.2016 10:46
Avatar
Michal Kuba
Tvůrce
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Michal Kuba:17.1.2016 10:50

Te´d je pro změnu takováto chyba:

Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ')' at line 1' in /data/www/19227­/teplostyl_cz/ad­min/modely/Db­.php:50 Stack trace: #0 /data/www/19227­/teplostyl_cz/ad­min/modely/Db­.php(50): PDO->prepare('INSERT INTO `cl...') #1 /data/www/19227­/teplostyl_cz/ad­min/modely/Db­.php(60): Db::dotaz('INSERT INTO `cl...', Array) #2 /data/www/19227­/teplostyl_cz/ad­min/modely/Sprav­ceClanku.php(22): Db::vloz('clanky', Array) #3 /data/www/19227­/teplostyl_cz/ad­min/kontrolery/Clan­kyKontroler.php(53): SpravceClanku->ulozClanek('', Array) #4 /data/www/19227­/teplostyl_cz/ad­min/kontrolery/Sme­rovacKontroler­.php(50): ClankyKontroler->zpracuj(Array) #5 /data/www/19227­/teplostyl_cz/ad­min/index.php(26): SmerovacKontroler->zpracuj(Array) #6 {main} thrown in /data/www/19227­/teplostyl_cz/ad­min/modely/Db­.php on line 50

 
Nahoru Odpovědět
17.1.2016 10:50
Avatar
Odpovídá na Michal Kuba
Martin Konečný (pavelco1998):17.1.2016 12:30

máš tam někde v SQL dotazu chybu u nějaké závorky :D
umí wrapper ten dotaz vypsat?

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
17.1.2016 12:30
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
Michal Kuba
Tvůrce
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Michal Kuba:17.1.2016 12:52

Vymazal jsem ty zpětné apostrofy, na té databázi klienta co to běží se právě moc nemají ty apostrofy používat. Jenže teď jsem chtěl jen doladit editaci, ale i tam to háže chybu, zase tam asi bude problém ve wrapperu.
Chyba:

Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '= ? WHERE ID_clanek = ?' at line 1' in /data/www/19227­/teplostyl_cz/ad­min/modely/Db­.php:50 Stack trace: #0 /data/www/19227­/teplostyl_cz/ad­min/modely/Db­.php(50): PDO->prepare('UPDATE clanky S...') #1 /data/www/19227­/teplostyl_cz/ad­min/modely/Db­.php(69): Db::dotaz('UPDATE clanky S...', Array, '3') #2 /data/www/19227­/teplostyl_cz/ad­min/modely/Sprav­ceClanku.php(24): Db::zmen('clanky', Array, 'WHERE ID_clanek...', '3') #3 /data/www/19227­/teplostyl_cz/ad­min/kontrolery/Clan­kyKontroler.php(53): SpravceClanku->ulozClanek('3', Array) #4 /data/www/19227­/teplostyl_cz/ad­min/kontrolery/Sme­rovacKontroler­.php(50): ClankyKontroler->zpracuj(Array) #5 /data/www/19227­/teplostyl_cz/ad­min/index.php(26): SmerovacKontroler->zpracuj(Array) #6 {main} thrown in /data/www/19227­/teplostyl_cz/ad­min/modely/Db­.php on line 50

wrapper s funkcí pro editaci:

public static function zmen($tabulka, $hodnoty = array(), $podminka, $parametry = array()) {

                return self::dotaz("UPDATE $tabulka SET ".
                implode(' = ?, ', array_keys($hodnoty)).
                " = ? " . $podminka. ";",
                array_merge(array_values($hodnoty)), $parametry);
        }
 
Nahoru Odpovědět
17.1.2016 12:52
Avatar
Odpovídá na Michal Kuba
Martin Konečný (pavelco1998):17.1.2016 17:12

No a co ti vypíše ta část

echo "UPDATE $tabulka SET ".
                implode(' = ?, ', array_keys($hodnoty)).
                " = ? " . $podminka. ";"

?

Nahoru Odpovědět
17.1.2016 17:12
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
Michal Kuba
Tvůrce
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Michal Kuba:17.1.2016 18:53

Už to nakonec všechno běží.. Teď zpětně po pár hodinách nevím, čím to přesně bylo, ale musel jsem promazat nějaké apostrofy ve wrapperu :)

Díky za předešlou pomoc! :)

 
Nahoru Odpovědět
17.1.2016 18:53
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 11 zpráv z 11.