Afficher les menus et sous menus depuis ma BDD

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

29 juin 2011, 15:19

sadeq: j'ai voulu tester le code avant de le bien comprendre ca donne rien, aucun affichage, avec un echo sur $result:
echo $result;
ca donne rien
Moi non plus je n'ai pas testé, mais si tu me poste au moins le code SQL de création des 2 tables hmenu et bmenu je le ferais.
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Mammouth du PHP | 725 Messages

30 juin 2011, 03:08

voila les tables:
-- phpMyAdmin SQL Dump
-- version 2.11.9.2
-- http://www.phpmyadmin.net
--
-- Host: localhost
-- Generation Time: Jun 30, 2011 at 01:56 AM
-- Server version: 5.0.67
-- PHP Version: 5.2.6

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";

--
-- Database: `testme`
--

-- --------------------------------------------------------

--
-- Table structure for table `bmenu`
--

CREATE TABLE IF NOT EXISTS `bmenu` (
  `id_bm` int(2) NOT NULL auto_increment,
  `id_hm1` tinyint(2) NOT NULL COMMENT 'head menu id',
  `bmenu_ar` varchar(30) collate utf8_unicode_ci NOT NULL,
  `onoff` enum('0','1') collate utf8_unicode_ci NOT NULL default '1' COMMENT '0:no, 1:active',
  PRIMARY KEY  (`id_bm`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=3 ;

--
-- Dumping data for table `bmenu`
--

INSERT INTO `bmenu` (`id_bm`, `id_hm1`, `bmenu_ar`, `onoff`) VALUES
(1, 1, 'smenu1', '1'),
(2, 1, 'smenu2', '1');

-- --------------------------------------------------------

--
-- Table structure for table `hmenu`
--

CREATE TABLE IF NOT EXISTS `hmenu` (
  `id_hm` int(2) NOT NULL auto_increment,
  `hmenu_ar` varchar(30) collate utf8_unicode_ci NOT NULL,
  `location` enum('r','l') collate utf8_unicode_ci NOT NULL COMMENT 'right left',
  `onoff` enum('0','1') collate utf8_unicode_ci NOT NULL default '1' COMMENT '0:no, 1:active',
  PRIMARY KEY  (`id_hm`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=4 ;

--
-- Dumping data for table `hmenu`
--

INSERT INTO `hmenu` (`id_hm`, `hmenu_ar`, `location`, `onoff`) VALUES
(1, 'menu1', 'r', '1'),
(2, 'menu2', 'r', '1'),
(3, 'menu3', 'l', '1');


Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

30 juin 2011, 14:19

Bonjour,

Voici la nouvelle version testée OK.
<?php

######################## Class de connexion #################################
class Connexion {
	// propriétés       
	public $connexion, $db, $db_host, $db_user, $db_passwd, $db_name, $result, $mysqli;

	// connect to the server & open default database
	public function __construct($db_host='', $db_user='', $db_passwd='', $db_name='')
	{
		$this->db_host = $db_host;
		$this->db_user = $db_user;
		$this->db_passwd = $db_passwd;
		$this->connexion = new mysqli($db_host, $db_user, $db_passwd); //HOST, USER, PASSWORD
		if ($this->connexion->connect_error)
	   	{
	   		die('Error (' . $this->connexion->connect_errno . ') : '. $this->connexion->connect_error);
		}
       
		// set charset to utf-8
		$this->connexion->set_charset("utf8");
		
		// open default database
		if (!$this->openDb($db_name))
	   	{
	   		die ('The '.$db_name.' does not exists');
		}
     
	} // end __construct
       
       
	// select a databse
	public function openDb($db_name)
	{
		//si pas de connexion, alors rien
		if (!$this->connexion) return false;
		
		//sinon ouvrir la base
		$this->db_name = $db_name;
       	$this->db = $this->connexion->select_db($this->db_name);
       	if(!$this->db)
		{
			return false;
		}
		return true; // db opened
       
	} // end db_name
       
       
	// method: select, create, insert, delete, update, read (CRUD)
	public function execSQL($sql)
	{
		//si pas de connexion, alors rien
		if (!$this->connexion) return false;
		
		// exécution SQL : 3 cas (1. erreur d'exécution, 2. résultat requêtes non SELECT, 3. résultat SELECT)
		$result = $this->connexion->query($sql);
		if ($result === FALSE) // cas d'erreur d'exécution
		{
			echo ('Error (' . $this->connexion->connect_errno . ') : '. $this->connexion->connect_error);
			return false;
		}
		else if ($result === TRUE)// cas de toute requête non SELECT
		{
			return true;
		}
		else {
			// cas du select
			$tabl_result = array();
			while ($result && $row = $result->fetch_object())
			{
				$tabl_result[] = $row;
			}
			return $tabl_result;
		}
	} // EnD execSQL
} // EnD class
######################## Class de connexion #################################



//////////// TEST de la classe ////////////////


// ouvrir la base de données TEST
$db_test = new Connexion('localhost', 'root', '', 'test');

// exécuter des requêtes SELECT
$tabl_hMenu = $db_test->execSQL("SELECT * FROM hmenu WHERE location='r' AND onoff='1'");
echo 'Number of rows returned: ' . count($tabl_hMenu);
if ($tabl_hMenu && is_array($tabl_hMenu))
{
	foreach($tabl_hMenu as $row_hMenu)
	{
		// on affiche les menus principales
		echo '<div class="headMenu">'.$row_hMenu->hmenu_ar.'</div>';
	
		// on affiche les sous menus du menu principale
		$tabl_bMenu = $db_test->execSQL("SELECT * FROM bmenu WHERE id_hm1='".$row_hMenu->id_hm."' AND onoff='1'");
		echo 'Number of rows returned: ' . count($tabl_bMenu);
		if ($tabl_bMenu && is_array($tabl_bMenu))
		{
			echo '<ul class="ulMenus">';
			foreach($tabl_bMenu as $row_bMenu)
			{                        
				echo '<li class="liMenus">'.$row_bMenu->bmenu_ar.'</li>';
            } // fin boucle $tabl_bMenu
			echo '</ul>';
		}
	} // fin boucle $tabl_hMenu
}
?>
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Mammouth du PHP | 725 Messages

02 juil. 2011, 11:45

merci sadeq je vais le relire, et je reviendrais par des questions sur des lignes que je voudrais bien comprendre, au coup je vois que du fait d'ouvrir une connexion en selectionnant une BDD sur le meme code, alors qu'on peut laisser la connexion ouverte, ouvrir la premiere BDD et apres on se destine vers une autre BDD, suivant votre code on doit encore refaire une "new"

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

04 juil. 2011, 10:48

au coup je vois que du fait d'ouvrir une connexion en selectionnant une BDD sur le meme code, alors qu'on peut laisser la connexion ouverte, ouvrir la premiere BDD et apres on se destine vers une autre BDD, suivant votre code on doit encore refaire une "new"
Non, on peut réouvrir une autre base de données avec le même objet sans devoir le ré-instancier (refaire un new) pour cela il suffit d'exécuter la méthode openDb($db_name) de l'objet Connexion.
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Mammouth du PHP | 725 Messages

05 juil. 2011, 14:47

merci sadeq, pour le moment j'ai pas change de BD, mais je rencontre un probleme au niveau d'utilisation des variables:
Notice: Undefined property: stdClass::$i on line 23
<?php
if ($tabl_ti && is_array($tabl_ti))
{
	    foreach($tabl_ti as $row_ti)
        {
        	if ($row_ti->i%4 == 0) echo '<tr align="center">'; 
// si j'utilise $i seulement je recois:
//Notice: Undefined variable: i  on line 23
       	}
}
?>
merci

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

05 juil. 2011, 18:59

Bonjour,

Pour que $row_ti->i soit correct il faut que le mot "i" désigne un nom de champ de la table $tabl_ti. Tu ne donnes pas la requête SQL pour que je vérifie mais apparemment ce champ "i" n'existe pas dans la table interrogé par SQL à l'instruction où tu crée le tableau $tabl_ti.
Dans une instruction de ce genre:
$tabl_ti = $db_test->execSQL("SELECT .......");
Globalement, selon le fonctionnement de ta classe, le $row_ti désigne une des lignes du tableau $tabl_ti créé à partir d'une requête SQL. $row_ti dans ce cas ne devrait contenir que des champs retournés par la requête SQL.

Bon, en fait, si j'ai bien compris, ton "i" n'est qu'un compteur que tu veux utiliser pour afficher 4 colonnes par ligne dans la table HTML. Dans ce cas il faut utiliser une simple variable $i qui doit être initialisée à zéro avant la boucle pour éviter l'erreur : Undefined variable ...
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Mammouth du PHP | 725 Messages

06 juil. 2011, 03:55

merci sadeq, donc toute variable doit etre predefinie avant foreach??

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

06 juil. 2011, 09:57

Bonjour,

En principe, oui. Toute variable utilisée dans le programme dans des tests (IF, WHILE) ou dans un calcul ou dans un affichage doit être initialisée (déclarée) au début du programme ou d'une fonction. C'est le cas aussi des tableaux et de leurs index (pour les tableaux $_GET, $_POST, $_SESSION il faut tester l'existence de leurs index avant usage avec isset()).

Par exemple:
// début du programme
// variables de travail
$data1 = isset($_GET["data1"])?$_GET["data1"]:''; // teste l'existence de l'index data1 puis l'affecte si existe dans $data1 sinon affecte une valeur par défaut (chaine vide ou zéro ou autre valeur selon le type de la variable).
....
....
// début d'une boucle
$i = valeur initiale;
while($i ...)
{
   ...
  usage de $i
  ...
}

...
...
echo $data1;
...
...
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Mammouth du PHP | 725 Messages

07 juil. 2011, 04:21

merci sadeq