Trying to get property of non-object – v bootstrap.php
- batko
- Člen | 219
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');
}
?>
- llsm
- Člen | 121
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)
- llsm
- Člen | 121
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.