Diskuze: Uncaught exception

PHP PHP Uncaught exception American English version English version

Avatar
Michal Kuba
Redaktor
Avatar
Michal Kuba:

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. ledna 23:44
Avatar
Odpovídá na Michal Kuba
Martin Konečný (pavelco1998):

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. ledna 0:05
Avatar
Michal Kuba
Redaktor
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Michal Kuba:

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. ledna 9:42
Avatar
Odpovídá na Michal Kuba
Martin Konečný (pavelco1998):

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

 
Nahoru Odpovědět 17. ledna 10:09
Avatar
Michal Kuba
Redaktor
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Michal Kuba:

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. ledna 10:27
Avatar
Michal Kuba
Redaktor
Avatar
Odpovídá na Michal Kuba
Michal Kuba:

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. ledna 10:46
Avatar
Michal Kuba
Redaktor
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Michal Kuba:

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. ledna 10:50
Avatar
Odpovídá na Michal Kuba
Martin Konečný (pavelco1998):

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í
+1 bodů
Řešení problému
 
Nahoru Odpovědět 17. ledna 12:30
Avatar
Michal Kuba
Redaktor
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Michal Kuba:

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. ledna 12:52
Avatar
Odpovídá na Michal Kuba
Martin Konečný (pavelco1998):

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

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

?

 
Nahoru Odpovědět 17. ledna 17:12
Avatar
Michal Kuba
Redaktor
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Michal Kuba:

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