class mysql - requete imbriqué
Posté : 28 oct. 2005, 13:05
Yop yop tout le monde,
voila je passe doucement a PHP5 orienté objet avec un classic : une classe MySQL.
J'ai un petit probleme pour imbriquer une requete dans une autre.
Voila le code de ma classe

dans ma page:
Je seche... Quelqu'un a une idée ?
Merci d'avance.
ps: si vous avez des suggestions ou commentaire pour améliorer ma classe mysql n'ésitez pas
voila je passe doucement a PHP5 orienté objet avec un classic : une classe MySQL.
J'ai un petit probleme pour imbriquer une requete dans une autre.
Voila le code de ma classe
<?php
class Mysql {
/*
* $error: error report
*/
public $error;
/*
* $host: the name or IP address of the MySQL server
*/
private $host;
/*
* $login: login and your password to access to the MySQL server
*
*/
private $login;
private $password;
/*
* $DB: name of the database you need to connect to
*/
private $DB;
/*
* $connect_id: connection identifiant
*/
private $connect_id;
/*
* $result_id: query result identifiant
*/
private $result_id;
/*
* __construct create a new MySQL object
* eg: $DB = new Mysql();
*/
function __construct($aHost='***',$aLogin='***',$aPassword='***',$aDB='intranet') {
$this->host = $aHost;
$this->login = $aLogin;
$this->password = $aPassword;
$this->DB = $aDB;
$this->connect_id = false;
$this->error = false;
}
/*
* connect set the connection with the database
* eg: $DB->connect();
*/
function connect() {
$this->connect_id = mysql_connect($this->host,$this->login,$this->password);
if(!$this->connect_id) {
$this->error = 'Can not connect to the database. Check connection information.';
return false;
}
else {
if(!mysql_select_db($this->DB,$this->connect_id)) {
$this->error = 'You are not allow to access this database or the database "'.$this->DB .'" does not exist.';
return false;
}
else {
return $this->connect_id;
}
}
}
/*
* send a query to the database. $query is a string variable
* eg: DB->sendQuery("SELECT name FROM clients_tbl");
*/
function sendQuery($query) {
if(!$this->connect_id) {
$this->error = 'You are not connected to a MySQL database.';
return false;
}
else if(!$this->result_id = mysql_query($query,$this->connect_id)) {
$this->error = mysql_error();
return false;
}
else {
return $result;
}
}
/*
* method to use a query previously done
* while ($data = $DB->fetchQuery())
* {
* echo $data['name'] ."<br />\n";
* }
*/
function fetchQuery() {
if(!$this->connect_id) {
$this->error = 'You are not connected to a MySQL database.';
return false;
}
else if(!$this->result_id) {
$this->error = 'You have to do a query to a database to get the number of row in a database.';
return false;
}
else {
return mysql_fetch_assoc($this->result_id);
}
}
/*
* count the number of row of a query
* eg: $DB->numRow()
*/
function numRow() {
if(!$this->connect_id) {
$this->error = 'You are not connected to a MySQL database.';
return false;
}
else if(!$this->result_id) {
$this->error = 'You have to do a query to a database to get the number of row in a database.';
return false;
}
else {
return mysql_num_rows($this->result_id);
}
}
function prepareJumble($string) {
$ready = addslashes($string);
return $ready;
}
/*
* close the MySQL connection
* eg: $DB->close()
*/
function close() {
return mysql_close($this->connect_id) ;
}
}
?>
Rien d'extraordinaire dans ma page:
<?php
//1) J'inclue ma class
require("class.mysql.php");
//2 J'ai créé un objet mysql:
$benDb = new Mysql();
//3) Je me connect et fait ma requete de selection
if(!$benDb->connect()) {
echo $benDb->error;
}
else {
$benDb->sendQuery('SELECT id,name,firstname,department FROM people ORDER BY firstname'); //le champ department contient un identifiant dans cette table.
//4) J'affiche les infos et c'est la que ca couille!
while($tablePeople = $benDb->fetchQuery())
{
print '<tr><td width="250px" height="25px" align="left" id="list"> '.$tablePeople['firstname'].' '.$tablePeople['name'].' </td>'; //affiche le prenom et nom de la personne
$benDb->sendQuery('SELECT department FROM people WHERE id='.$tablePeople['department'].''); //si je fait cette requete, avec laquelle je voulais faire la correspondance entre l'id (de type INT) et le nom du departement (de type STRING), ma variable $tablePeople = $benDb->fetchQuery() ne contient plus rien :/// et donc mon code n'affiche que le nom et prenom de la premiere personne. Si je la commente elle m'affiche bien tous les noms et prenoms dans la base.
$departmentName = $benDb->fetchQuery();
print '<td width="200px" height="25px" align="left" id="list"> '.$departmentName['department'].' </td></tr>
';
}
?>
Ma question est comment faire pour plusieur requete imbriqué. Je pensais que le fait de mettre $benDb->fetchQuery() dans une variable $tablePeople me permettrais de la réutiliser apres mais apparement non.Je seche... Quelqu'un a une idée ?
Merci d'avance.
ps: si vous avez des suggestions ou commentaire pour améliorer ma classe mysql n'ésitez pas