PHP Recherche de personnages // MaNGOS
Salut tout le monde,

Je vous partage aujourd'hui un script qui vous permettra de gérer des recherches de personnages via un formulaire tout simple.
Le code est orienté objet et j'utilise les fonctions MySQLi en procédural pour gérer la base de données.

Certains vont surement me demander pourquoi j'utilise MySQLi en procédural au lieu de l'utilisé orienté objet.
Et bien c'est juste que je sais qu'on a à faire à des débutants et j'essaye de simplifié au maximum.
Je partagerais une version orienté objet si vous le désirez ...

Passons au code !

class.dbhandler.php: (V1->MySQLi Procédural)
[code=php]<?php

Class DatabaseHandler {

private $connectionLink = false;

/**
* @access public
* @param type $hostname
* @param type $username
* @param type $password
* @param type $database
*/
public function DatabaseHandler($hostname, $username, $password, $database) {
$this->connectionLink = @mysqli_connect($hostname, $username, $password, $database);
if(!$this->connectionLink) {
die('Erreur: La connexion au serveur MySQL a &eacute;chou&eacute; !');
}
$databaseLink = @mysqli_select_db($this->connectionLink, $database);
if(!$databaseLink) {
die('Erreur: La base de donn&eacute;es "' . $database . '" est introuvable !');
}
}

/**
* @access public
* @param type $query
* @param type $assoc=false
*/
public function query($query, $assoc=false) {
$sqlQuery = @mysqli_query($this->connectionLink, $query);
if(!$sqlQuery) {
die('Erreur: L\'ex&eacute;cution de la requ&ecirc;te "' . $query . '" a &eacute;chou&eacute; !<br />Erreur MySQL: ' . mysqli_error($this->connectionLink) . '.');
}
if($assoc == false) {
return $sqlQuery;
} else {
return @mysqli_fetch_assoc($sqlQuery);
}
}

/**
* @access public
* @param type $string
*/
public function escape_string($string) {
return mysqli_real_escape_string($this->connectionLink, $string);
}

/**
* @access public
*/
public function __destruct() {
@mysqli_close($this->connectionLink);
}

}

?>[/code]

class.dbhandler.php: (V2->MySQLi orienté objet)
[code=php]<?php

Class DatabaseHandler {

private $connectionLink = false;

/**
* @access public
* @param type $hostname
* @param type $username
* @param type $password
* @param type $database
*/
public function DatabaseHandler($hostname, $username, $password, $database) {
$this->connectionLink = new mysqli($hostname, $username, $password, $database);
if($this->connectionLink->connect_error) {
die('Erreur: La connexion au serveur MySQL a &eacute;chou&eacute; !');
}
}

/**
* @access public
* @param type $query
* @param type $assoc=false
*/
public function query($query, $assoc=false) {
$sqlQuery = $this->connectionLink->query($query);
if(!$sqlQuery) {
die('Erreur: L\'ex&eacute;cution de la requ&ecirc;te "' . $query . '" a &eacute;chou&eacute; !<br />Erreur MySQL: ' . $this->connectionLink->error . '.');
}
if($assoc == false) {
return $sqlQuery;
} else {
return $sqlQuery->fetch_assoc();
}
}

/**
* @access public
* @param type $string
*/
public function escape_string($string) {
return $this->connectionLink->real_escape_string($string);
}

/**
* @access public
*/
public function __destruct() {
$this->connectionLink->close();
}

}

?>[/code]
Cette classe gère les connexions au serveur MySQL et les requêtes SQL.

class.search.php:
[code=php]<?php

Class Search {

private $cDB = null;

private $name = null;

/**
* @access public
* @param type $cDB
*/
public function __construct(&$cDB) {
$this->cDB = $cDB;
}

/**
* @access public
* @param type $name
*/
public function setName($name) {
$this->name = $this->cDB->escape_string($name);
}

/**
* @access public
* @param type $race
*/
public function getFactionId($race) {
switch($race) {
case 1:
case 3:
case 4:
case 7:
case 11:
case 22:
return 0;
break;

default:
return 1;
}
}

/**
* @access public
* @param type $race
*/
public function getFactionName($race) {
switch($race) {
case 1:
case 3:
case 4:
case 7:
case 11:
case 22:
return 'Alliance';
break;

default:
return 'Horde';
}
}

/**
* @access public
* @param type $race
* @param type $gender
*/
public function getRaceName($race, $gender) {
if($gender == 0) {
switch($race) {
case 1:
$RaceName = 'Humain';
break;
case 2:
$RaceName = 'Orc';
break;
case 3:
$RaceName = 'Nain';
break;
case 4:
$RaceName = 'Elfe de la nuit';
break;
case 5:
$RaceName = 'Mort-vivant';
break;
case 6:
$RaceName = 'Tauren';
break;
case 7:
$RaceName = 'Gnome';
break;
case 8:
$RaceName = 'Troll';
break;
case 9:
$RaceName = 'Gobelin';
break;
case 10:
$RaceName = 'Elfe de sang';
break;
case 11:
$RaceName = 'Draeneï';
break;
case 22:
$RaceName = 'Worgen';
break;

default:
$RaceName = 'NONE';
}
} else {
switch($race) {
case 1:
$RaceName = 'Humaine';
break;
case 2:
$RaceName = 'Orque';
break;
case 3:
$RaceName = 'Naine';
break;
case 4:
$RaceName = 'Elfe de la nuit';
break;
case 5:
$RaceName = 'Morte-vivante';
break;
case 6:
$RaceName = 'Taurène';
break;
case 7:
$RaceName = 'Gnome';
break;
case 8:
$RaceName = 'Trollesse';
break;
case 9:
$RaceName = 'Gobeline';
break;
case 10:
$RaceName = 'Elfe de sang';
break;
case 11:
$RaceName = 'Draeneï';
break;
case 22:
$RaceName = 'Worgen';
break;

default:
$RaceName = 'NONE';
}
}
return htmlentities($RaceName);
}

/**
* @access public
* @param type $class
* @param type $gender
*/
public function getClassName($class, $gender) {
if($gender == 0) {
switch($class) {
case 1:
$ClassName = 'Guerrier';
break;
case 2:
$ClassName = 'Paladin';
break;
case 3:
$ClassName = 'Chasseur';
break;
case 4:
$ClassName = 'Voleur';
break;
case 5:
$ClassName = 'Prêtre';
break;
case 6:
$ClassName = 'Chevalier de la mort';
break;
case 7:
$ClassName = 'Chaman';
break;
case 8:
$ClassName = 'Mage';
break;
case 9:
$ClassName = 'Démoniste';
break;
case 11:
$ClassName = 'Druide';
break;

default:
$ClassName = 'NONE';
}
} else {
switch($class) {
case 1:
$ClassName = 'Guerrière';
break;
case 2:
$ClassName = 'Paladin';
break;
case 3:
$ClassName = 'Chasseuse';
break;
case 4:
$ClassName = 'Voleuse';
break;
case 5:
$ClassName = 'Prêtresse';
break;
case 6:
$ClassName = 'Chevalier de la mort';
break;
case 7:
$ClassName = 'Chamane';
break;
case 8:
$ClassName = 'Mage';
break;
case 9:
$ClassName = 'Démoniste';
break;
case 11:
$ClassName = 'Druidesse';
break;

default:
$ClassName = 'NONE';
}
}
return htmlentities($ClassName);
}

/**
* @access public
*/
public function getNbCharacters() {
$query = "SELECT COUNT(*) AS nombre FROM `characters` WHERE `name` LIKE '%" . $this->name . "%'";
$dataCharacters = $this->cDB->query($query, true);
return $dataCharacters['nombre'];
}

/**
* @access public
*/
public function getList() {
$query = "SELECT guid, name, race, class, gender, level FROM `characters` WHERE `name` LIKE '%" . $this->name . "%' ORDER BY name ASC";
$queryCharacters = $this->cDB->query($query);
while($dataCharacters = mysqli_fetch_assoc($queryCharacters)) {
$charactersList[] = $dataCharacters;
}
return $charactersList;
}

}

?>[/code]
Cette classe gère les recherches de personnages.

index.php:
[code=php]<?php

/**
* @title: Recherche de personnages
* @author: Allan
* @emulator: MaNGOS
* @version: 3.3.5
*/

/* Accès MySQL pour la base de données des personnages */
$characters = array();
$characters = array(
'hostname' => '127.0.0.1',
'username' => 'root',
'password' => '',
'database' => 'characters'
);

/* On charge le gestionnaire de bases de données */
if(!@include_once('class.dbhandler.php')) {
die('Erreur: Le fichier "class.dbhandler.php" est introuvable !');
}

/* On ouvre la connexion MySQL */
if(!defined('DATABASE_HANDLER')) {
$cDB = new DatabaseHandler($characters['hostname'], $characters['username'], $characters['password'], $characters['database']);
}

/* On charge la classe qui gère les recherches de personnages */
if(!@include_once('class.search.php')) {
die('Erreur: Le fichier "class.search.php" est introuvable !');
}
$search = new Search($cDB);

?>
<html>
<head>
<title>Recherche de personnages</title>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
</head>
<body>
<form method="post" action="index.php">
<table border="0" align="center">
<tr>
<td>Nom du personnage</td>
<td>&nbsp;</td>
</tr>
<tr>
<td><input type="text" name="name" value="<?php echo $_POST['name']; ?>"/></td>
<td><input type="submit" value="Chercher"/></td>
</tr>
</table>
</form>
<br />
<?php if($_SERVER['REQUEST_METHOD'] == 'POST') { ?>
<?php $search->setName($_POST['name']); ?>
<table border="1" align="center">
<tr>
<td>Nom du personnage</td>
<td>Niveau</td>
<td>Race</td>
<td>Classe</td>
<td>Faction</td>
</tr>
<?php if($search->getNbCharacters() != 0) { ?>
<?php foreach($search->getList() as $character) { ?>
<tr>
<td><a href="index.php?guid=<?php echo $character['guid']; ?>"><?php echo htmlentities($character['name']); ?></a></td>
<td align="center"><?php echo $character['level']; ?></td>
<td align="center"><img src="http://eu.media.blizzard.com/wow/icons/18/race_<?php echo $character['race'] . '_' . $character['gender']; ?>.jpg" title="<?php echo $search->getRaceName($character['race'], $character['gender']); ?>"/></td>
<td align="center"><img src="http://eu.media.blizzard.com/wow/icons/18/class_<?php echo $character['class']; ?>.jpg" title="<?php echo $search->getClassName($character['class'], $character['gender']); ?>"/></td>
<td align="center"><img src="http://eu.media.blizzard.com/wow/icons/18/faction_<?php echo $search->getFactionId($character['race']); ?>.jpg" title="<?php echo $search->getFactionName($character['race']); ?>"/></td>
</tr>
<?php } ?>
<?php } else { ?>
<tr>
<td colspan="5" align="center">Aucun personnage n'a &eacute;t&eacute; trouver pour la recherche: "<font color="red"><?php echo $_POST['name']; ?></font>"</td>
</tr>
<?php } ?>
</table>
<?php } ?>
</body>
</html>[/code]
Cette page gère les classes, affiche le formulaire et les résultats des recherches.

Voilà c'est ici que ça se termine. Le script est relativement facile à comprendre.
Il peut facilement être modifié/adapté à un site.

Amicalement Allan.
Pièce(s) jointe(s) Miniature(s)
   
Cool Clin mais pourquoi t'es si bien partit en objet et tu n'a pas utilisé Mysqli en objet ? c'est bien plus "propre" que en procédural.

Un simple et unique "$toto = new mysqli ($host,$user, $pass, $dbname);" suffit. Après il suffit juste de passer la référence.

Autre remarque pour ton constructeur du databaseHandler :
[code=php]
public function __construct($cDB) {
$this->cDB = $cDB;
}
[/code]

met pluttot
[code=php]
public function __construct(&$cDB) {
$this->cDB = $cDB;
}
[/code]

Ca évite de faire une COPIE de l'objet te cela utilise un pointeur (ca te bouffera beaucoup moins de ressources.
Salut,

Merci pour l'info du constructeur.
La seule raison pour laquelle j'ai utilisé MySQLi en procédural, c'est pour facilité la modification aux débutants dans le domaine.
Sinon j'aurais utilisé à coup sur MySQLi en orienté objet car sa facilite largement les choses et je n'aurait pas été obligé de passer par une classe de gestion de bases de données.

Je vais aller de ce pas, créer une deuxième version totalement orienté objet pour que tout le monde soit content ! Langue
J'y ajouterais aussi la modification dont tu ma fais part ! Smile

Amicalement Allan.


Édition :
Voilà j'ai mis le post principal à jour.

Vous êtes libre de choisir entre la classe "class.dhandler.php" procédural ou orienté objet.

Amicalement Allan.
Super Clin GG a toi Clin

Retourner en haut Accueil