Aplikace pro správu článků – problém s mazáním

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Sopta
Člen | 12
+
0
-

Zdravím všechny,
zrovna začínám s Nette a všechno si zkouším na různých příkladech. Teď si píši mini aplikaci pro správu článků (přidávání, prohlížení, mazání) prostě klasika na naučení. Akorát sem narazil na jeden problém při mazání článků. Když si nechám vyjet články z DB tak u každé položky mám odkaz pro smazání
<a n:href="smazat, $clanek->id">Smazat</a> a v presenteru ClankyPresenter metodu

<?php
    public function actionSmazat($id = 0) {
     dibi::delete('clanky')
          ->where('id = %d', $id);

      $this->redirect('Clanky:');
    }
?>

Tohle řešení s action<Action> jsem našel v jednom příkladě, popravdě jsem ho nezkoušel spustit. Jde o to, že se po kliknutí na odkaz nesmaže záznam, ale k přesměrování dojde. SQL jsem si několikrát prohlížel, různě měnil ale pořád nic. Mohli byste mi prosím poradit, kde dělám chybu? díky moc

Používám Nette pro PHP5.3 a dibi.

Filip Procházka
Moderator | 4668
+
0
-

Podle mě ti to žádnou chybu nevypsalo :) Protože ti tam chybí jedno důležité klíčové slovíčko.

dibi::delete('clanky')->where('id = %d', $id);
dibi::delete('clanky')->where('id = %d', $id)->execute(); // execute=vykonat

U selectů to není potřeba, ale u insert,update a delete ano.

Editoval HosipLan (3. 8. 2011 8:04)

Sopta
Člen | 12
+
0
-

HosipLan napsal(a):

Podle mě ti to žádnou chybu nevypsalo :) Protože ti tam chybí jedno důležité klíčové slovíčko.

dibi::delete('clanky')->where('id = %d', $id);
dibi::delete('clanky')->where('id = %d', $id)->execute(); // execute=vykonat

U selectů to není potřeba, ale u insert,update a delete ano.

Jojo to je pravda, ale mám takový pocit, že jsem to měl normálně přes dibi::query(); každopádně zkusím :)

Sopta
Člen | 12
+
0
-

Připsal jsem tam execute() a nic to neudělalo ani když sem to přepsal do podoby

<?php
dibi::query('DELETE FROM [clanky] WHERE id = %d', $id);
?>

K přesměrování dojde ale k odstranění ne. Přes AJAX by to šlo jelo, ale to by mělo jet i bez AJAXu a nechci to zase obcházet kejklemi.

Filip Procházka
Moderator | 4668
+
0
-

Beztak si tam špatně předáváš to ID

Sopta
Člen | 12
+
0
-

HosipLan napsal(a):

Beztak si tam špatně předáváš to ID

Vyřešeno. Problém byl v routě. Sice jsem měl <presenter>/<action>/<id>, ale už sem tam zapomněl přidat id ⇒ NULL :)

Sopta
Člen | 12
+
0
-

No :D když chcu zase volat metodu z modelu:

<?php
  public static function smazatClanek($id_clanku)
  {
   return dibi::query('DELETE FROM [clanky] WHERE id = %d', $id_clanku);
  }
?>

kterou pak zavolat v presenteru v metodě actionSmazat($id)

<?php
    public function actionSmazat($id)
    {
      ClankyModel::smazatClanek($id);
      $this->redirect('Clanky:');
    }
?>

Tak to nejede :)

Filip Procházka
Moderator | 4668
+
0
-

A co s tím mám dělat? :) Tak to oprav. https://tester.nette.org/cs/

Sopta
Člen | 12
+
0
-

no mam takovej pocit ze si to dela co chce :D :D

Sopta
Člen | 12
+
0
-

No jooo tak hotovo :)

<?php
  dibi::delete('clanky')->where('id = %d', $id)->execute();
?>

špatnej modifikátor!!!
¨
<?php
dibi::delete(‚clanky‘)->where(‚id = %i‘, $id)->execute();
?> – správně.

Já jsem totiž dělal v céčku a tam bylo celý číslo vyjádřeno %d :) … takova blbost