Invalid argument supplied for foreach() [Résolu/Fermé]

Signaler
-
 toto -
Bonjour,
j'ai ce message d'erreur lorsque je veux me connecter sur mon application:

"invalid argument supplied for foreach() in c:\program files\EasyPHP 2.0b1\www\bytesys\applications\bo\objects\p4a_base_application.php on line 40"



et voici le code:

<?php



class P4A_Base_Application extends p4a
{
var $user_data = array();

function P4A_Base_Application()
{
$this->p4a();
$this->openMask("p4a_login");

$access_levels =& $this->build("p4a_array_source","access_levels");
$a = array();
for($i=1;$i<=10;$i++) {
$a[]["value"] = $i;
}
$access_levels->load($a);
$access_levels->setPk("value");
}

function createMenu()
{
if ( isset($this->menu) AND is_object($this->menu)) {
$this->menu->destroy();
}
$menu =& $this->build("p4a_menu","menu");

$db =& P4A_DB::singleton();



// livello menu 1
$items1 = $db->queryAll("SELECT * FROM menu_bo
WHERE parent_id IS NULL
ORDER BY position, name
");

***** foreach ($items1 as $item) {
$parent_name = $item["name"];
$name = $item["name"];
$label = $item["label"];
$id = $item["id"];
$item_obj =& $menu->addItem($name);
$item_obj->setLabel($label);
if ($this->user_data['level'] < $item['access_level']
or $item['visible'] == FALSE) {
$item_obj->setVisible(FALSE);
}
if (strlen($item['action'])) {
$this->intercept($item_obj,'onClick',$item['action']);
}
// livello menu 2
$items2 = $db->queryAll("SELECT * FROM menu_bo
WHERE parent_id = ".$id."
ORDER BY position, name
");
foreach ($items2 as $item2) {
$parent_name2 = $item2["name"];
$name2 = $item2["name"];
$label2 = $item2["label"];
$id2 = $item2["id"];
$item_obj2 =& $menu->items->$parent_name->addItem($name2);
$item_obj2->setLabel($label2);
if ($this->user_data['level'] < $item2['access_level']
or $item2['visible'] == FALSE) {
$item_obj2->setVisible(FALSE);
}
if (strlen($item2['action'])) {
$this->intercept($item_obj2,'onClick',$item2['action']);
}
// livello menu 3
$items3 = $db->queryAll("SELECT * FROM menu_bo
WHERE parent_id = ".$id2."
ORDER BY position, name
");
foreach ($items3 as $item3) {
$parent_name3 = $item3["name"];
$name3 = $item3["name"];
$label3 = $item3["label"];
$id3 = $item3["id"];
$item_obj3 =& $menu->items->$parent_name->items->$parent_name2->addItem($name3);
$item_obj3->setLabel($label3);
if ($this->user_data['level'] < $item3['access_level']
or $item3['visible'] == FALSE) {
$item_obj3->setVisible(FALSE);
}
if (strlen($item3['action'])) {
$this->intercept($item_obj3,'onClick',$item3['action']);
}
// livello menu 4
$items4 = $db->queryAll("SELECT * FROM menu_bo
WHERE parent_id = ".$id3."
ORDER BY position, name
");
foreach ($items4 as $item4) {
$parent_name4 = $item4["name"];
$name4 = $item4["name"];
$label4 = $item4["label"];
$id4 = $item4["id"];
$item_obj4 =& $menu->items->$parent_name->items->$parent_name2->items->$parent_name3->addItem($name4);
$item_obj4->setLabel($label4);
if ($this->user_data['level'] < $item4['access_level']
or $item4['visible'] == FALSE) {
$item_obj4->setVisible(FALSE);
}
if (strlen($item4['action'])) {
$this->intercept($item_obj4,'onClick',$item4['action']);
}
// livello menu 5
$items5 = $db->queryAll("SELECT * FROM menu_bo
WHERE parent_id = ".$id4."
ORDER BY position, name
");
foreach ($items5 as $item5) {
$parent_name5 = $item5["name"];
$name5 = $item5["name"];
$label5 = $item5["label"];
$id5 = $item5["id"];
$item_obj5 =& $menu->items->$parent_name->items->$parent_name2->items->$parent_name3->items->$parent_name4->addItem($name5);
$item_obj5->setLabel($label5);
if ($this->user_data['level'] < $item5['access_level']
or $item5['visible'] == FALSE) {
$item_obj5->setVisible(FALSE);
}
if (strlen($item5['action'])) {
$this->intercept($item_obj5,'onClick',$item5['action']);
}
}
}
}
}
}
$menu->addItem("logout");
$this->intercept($menu->items->logout,"onClick","restart");
}

function openMask($name)
{
if (is_object($name)) {
parent::openMask($name->getName());
} else {
parent::openMask($name);
}
}
}
?>

4 réponses

le probleme est que mon menu ne s'affiche pas. Merci pour tout ce que vous pourriez faire.
1
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 63550 internautes nous ont dit merci ce mois-ci

Bonjour

D'après ton message, c'est la requête précédente ne rend pas un tableau.
La méthode queryAll est-elle censée rendre un tableau ? Rien ne permet de le savoir dans ce que tu donnes.
Si elle doit bien rendre un tableau, c'est alors que la requête s'est mal passée. Vu la simplicité de la requête, tu auras vite fait de vérifier les noms de la table et des champs.
Dernière possibilité que je vois : ne manque-t-il pas une instruction de connexion à la base de données ? Ou la connexion est-elle faite ailleurs ?
Salut toto,
la connexion se fait ailleurs:

<php
define("P4A_EXTENDED_ERRORS", true);
//define("P4A_DSN", 'mysql://root:691005@localhost:3306/bswitch');
define("P4A_DSN", 'mssql://root:691005@JOB:1433/bswitch');


require_once( dirname(__FILE__) . '/../../p4a.php' );

$app =& p4a::singleton("p4a_base_application");
$app->main();

?>


Au niveau de la table tous les noms de champs que j'ai mentionné sont bons également.
Je devais avoir aussi un tableau avec la requête
Je ne connais rien de ton p4a (ça ne fait pas partie du php standard) et le code que tu m'as montré ne me dit pas où tu te connectes à ta base.

Insère un print_r($items1); entre la requête et le foreach. On verra bien ce qu'il y a dans $items1
Salut toto,
Au fait le p4a est lié à la platforme c'est juste question de sécurité. Et je me connecte effectivement à la base.

J'ai heureusement vu le problème, au niveau de SQL Server, il faut remplacer les types de données "text" par "nvarchar". C'est à cause des "OREDER BY" utilisés dans mes requêtes.

Encore une fois merci bcp.
> baabs12
de rien. Surtout qu'en fait, je n'ai pas trouvé grand chose...