Trying to get property of non-object – v bootstrap.php

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

Ahoj,

mám napsaný router. Ale hází my to chybu Trying to get property of non-object na řádku

<?php
    return $products->findBy(array("uri" => $id))->fetch()->id;
?>

Už si fakt nevím rady. Mohl bych vás poporsit o radu? Děkuji

<?php
// Setup router using mod_rewrite detection
if (function_exists('apache_get_modules') && in_array('mod_rewrite', apache_get_modules())) {
    $container->router[] = new Route('index.php', 'Front:Default:default', Route::ONE_WAY);

    $container->router[] = $adminRouter = new RouteList('Admin');
    $adminRouter[] = new Route('admin/<presenter>/<action>[/<id>]', 'Default:default');

    // /product
    // /product/4534-rovnak-na-ohybak

    $container->router[] = $frontRouter = new RouteList('Front');



      //pages
      $frontRouter[] = new Route('page/<id>', array(
      "id" => array(
      Route::FILTER_IN => function ($id) use ($container) {
      if (is_numeric($id)) {
      return $id;
      } else {
      $pages = $container->pageRepository;

      // echo $pages->findBy(array("uri", $id))->fetch()->id;
      return $pages->findBy(array("uri", $id))->fetch()->id;
      }
      },
      Route::FILTER_OUT => function ($id) use ($container) {
      if (!is_numeric($id)) {
      return $id;
      } else {
      $pages = $container->pageRepository;

      return $pages->findBy(array("id", $id))->fetch()->uri;
      }
      }
      ),
      "presenter" => "Page",
      "action" => "default",
      ));

    //product

    $frontRouter[] = new Route('<id>', array(
        "id" => array(
            Route::FILTER_IN => function ($id) use ($container) {
                if (is_numeric($id)) {
                    return $id;
                } else {
                    $products = $container->productRepository;

                    // echo $pages->findBy(array("uri", $id))->fetch()->id;

                    return $products->findBy(array("uri" => $id))->fetch()->id;
                }
            },
            Route::FILTER_OUT => function ($id) use ($container) {
                if (!is_numeric($id)) {
                    return $id;
                } else {
                    $products = $container->productRepository;

                    return $products->findBy(array("id" => $id))->fetch()->uri;
                }
            }
        ),
        "presenter" => "Product",
        "action" => "default",
    ));

    $frontRouter[] = new Route('<presenter>/<action>[/<id>]', 'Default:default');
    $frontRouter[] = new Route('cron/<action>[/<id>]', 'Cron:default');
} else {
    $container->router = new SimpleRouter('Front:Default:default');
}
?>
Draffix
Člen | 146
+
0
-

Když si dumpneš výsledek z dotazu $products->findBy(array("uri" => $id))->fetch(), máš tam i to požadované ID?

llsm
Člen | 121
+
0
-

batko napsal(a):

Ahoj,

mám napsaný router. Ale hází my to chybu Trying to get property of non-object na řádku

<?php
    return $products->findBy(array("uri" => $id))->fetch()->id;
?>

Už si fakt nevím rady. Mohl bych vás poporsit o radu? Děkuji

Precti si, co ti rika ladenka. Znamena to, ze ten dotaz nevrati zadny vysledek z databaze, tedy misto objektu s vysledkem vraci FALSE. A ty se pak z FALSE snazis ziskat property id, ktere tam samozrejme neni. Takze musis opravit dotaz (muze v nem byt nejaka chyba, nevim) a osetrit to, ze se muze stat, ze v databazi nebude odpovidajici zaznam, treba kdyz nekdo neco podvrhne v adresnim radku, viz:

<?php
    $result = $products->findBy(array("uri" => $id))->fetch();
    if($result) {
        //pokud dotaz vratil nejaky vysledek
	     return $result->id;
    } else {
    	//pokud nevratil, tak si nastav co ti to ma vratit, treba:
        return NULL;
    }
?>

Editoval llsm (24. 4. 2013 10:47)

Draffix
Člen | 146
+
0
-

treba kdyz nekdo neco podvrhne v adresnim radku

V Nette tuším funguje automaticky vázání proměnných, takže SQL injection není možné

llsm
Člen | 121
+
0
-

Draffix napsal(a):

V Nette tuším funguje automaticky vázání proměnných, takže SQL injection není možné

Nemyslel jsem nutne nejaky typ cileneho utoku, staci aby tam proste neco z nudy umazal, zkusil zmenit nebo pouzil stary odkaz na uz nefunkcni adresu a hned je notice na svete.