Invalid argument supplied for foreach()

Résolu/Fermé
baabs12 - 14 oct. 2008 à 18:07
 toto - 15 oct. 2008 à 14:19
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);
}
}
}
?>
A voir également:

4 réponses

le probleme est que mon menu ne s'affiche pas. Merci pour tout ce que vous pourriez faire.
1
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 ?
0
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
0
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
0
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.
0
toto > baabs12
15 oct. 2008 à 14:19
de rien. Surtout qu'en fait, je n'ai pas trouvé grand chose...
0