CodeIgniter

La classe Database

Avant-Propos : chargement d'une classe

Rappelons que CodeIgniter est aussi est un framework utilisé pour le PHP et il dispose de classes aidant les développeurs dans leur tâche de développement.
Avant de pouvoir utiliser les méthodes d'une classe, il faut la charger au préalable. Pour effectuer cette opération, il existe deux moyens :
1) On charge la classe désirée (exemple : Calendar) dans le constructeur du contrôleur que l'on est entrain de créer :

<?php
class FakeController extends Controller{

	function __construct(){
		$this->load->library('calendar');
	}
	
}
?>
Note : il existe quelques exceptions comme la classe Database (voir paragraphe suivant) ou d'autres classes qui se chargent automatiquement (voir la liste des classes).

2) Ou alors, on charge automatiquement la classe à chaque appel de script en la spécifiant dans le fichier autoload.php se trouvant dans le répertoire system/application/config : Après avoir chargé la classe, on peut appeler ses méthodes en utilisant la méthode $this->classe_chargee->methode().

Exemple : Avec la classe Calendar chargé précédemment :

Charger la classe Database

Nous avons vu dans le paragraphe précédent que nous pouvons charger des classes de deux manières différentes : soit avec le fichier autoload.php, soit en le spécifiant dans le constructeur d'un contrôleur.

Pour la classe Database, qui permet de manipuler les bases de données, il faut l'appeler différemment dans le cas où l'on choisit d'appeler cette classe depuis le constructeur du contrôleur : normalement, nous devrions utiliser la méthode $this->load->library() mais avec la classe Database, nous devons utiliser la méthode $this->load->database().

Quoiqu'il en soit, indépendamment de la méthode utilisée pour charger la classe Database, le fait de charger celle-ci va appeler les paramètres par défaut de connexion à une base de données, se trouvant dans le fichier database.php du répertoire system/application/config :

$active_group = "default";
$active_record = TRUE;

$db['default']['hostname'] = "localhost";
$db['default']['username'] = "root";
$db['default']['password'] = "";
$db['default']['database'] = "blackjack";
$db['default']['dbdriver'] = "mysql";
$db['default']['dbprefix'] = "";
$db['default']['pconnect'] = TRUE;
$db['default']['db_debug'] = TRUE;
$db['default']['cache_on'] = FALSE;
$db['default']['cachedir'] = "";
$db['default']['char_set'] = "utf8";
$db['default']['dbcollat'] = "utf8_general_ci";

C'est au programmeur de modifier ces paramètres pour qu'ils correspondent aux paramètres de sa base de données et si des paramètres sont inutiles, on peut les supprimer.

On peut aussi noter que les paramètres de ce fichier sont stockés dans un tableau à deux dimensions : cela a été introduit afin de pouvoir définir plusieurs valeurs de connexion à une base de données en utilisant une autre valeur pour la première dimension (dans l'exemple : 'default').

Puis il faut spécifier quelle est le groupe de valeurs actives grâce à la variable $active_group. Il est tout de même possible d'indiquer un autre groupe dans le constructeur du contrôleur en passant en paramètre de la fonction $this->load->database() le nom du groupe à utiliser (chaîne de caractères).

Il est aussi possible de se passer des valeurs du fichier de configuration en spécifiant nous même les valeurs de configuration dans un tableau à passer en paramètre de la fonction $this->load->database() :
<?php
class FakeController extends Controller{

	function __construct(){
		$array['hostname'] = "localhost";
		$array['username'] = "root";
		$array['password'] = "";
		$array['database'] = "blackjack";
		$array['dbdriver'] = "mysql";
		$array['dbprefix'] = "";
		$array['pconnect'] = TRUE;
		$array['db_debug'] = TRUE;
		$array['cache_on'] = FALSE;
		$array['cachedir'] = "";
		$array['char_set'] = "utf8";
		$array['dbcollat'] = "utf8_general_ci";

		$this->load->database($array);
	}
	
}
?>

Appel de requêtes SQL

Une fois que le classe Database a été chargée, nous pouvons utiliser la méthode $this->db->query() pour exécuter des requêtes SQL.
Les requêtes de type 'select' renvoient un tableau contenant les résultats de la requête que nous pouvons traiter de la manière suivante (à utiliser dans la fonction d'un contrôleur) :

$query = $this->db->query("SELECT * FROM Table");
foreach ($query as $row){
	//Utiliser $row[0], $row[1]...
}
Les requêtes qui modifient la base (insert, update...) quant à elles renvoient un booléen indiquant si l'opération s'est déroulée avec succès ou non.

La requête 'select' sans utiliser la méthode $this->db->query()

La classe Database permet d'exécuter des requêtes de type 'select' sans utiliser la méthode $this->db->query(). Pour cela, nous devons utiliser une ou deux méthodes :

/**
 * Si nous n'utilisons pas la fonction suivante,
 * nous aurons tous les champs de la table 'Table'
 * (équivaut à "SELECT *")
 **/
$this->db->select('id'); 
$query = $this->db->get('Table');


Nous récupérons le même type de données que lorsque nous appelons la fonction $this->db->query() avec en paramètre une requête 'select' et nous pouvons les traiter de la même manière.
Ces deux fonctions sont un minimum pour effectuer une sélection, nous pouvons spécifier par exemple l'équivalent d'une clause 'where' grâce à la fonction $this->db->where() :

$this->db->select('id');
$this->db->where('id',1); //id = 1
$this->db->where('id <',10); // id < 10
$this->db->where('id >',10); // id > 10
$query = $this->db->get('Table');
Il existe beaucoup d'autres fonctions qui sont détaillées sur cette page.

Les requêtes 'insert' et 'update' sans utiliser la méthode $this->db->query()

La classe Database permet aussi d'effectuer les opérations de modification de la base de données en n'utilisant que quelques fonctions, mais contrairement aux requêtes 'select' il faut utiliser un tableau associatif :

//Insertion
$array = ("id" => 2, "nom" =>"Aravindan");
$this->db->insert("Table",$array);

//Mise à jour
$array = ("nom" =>"Mahendran");
$this->db->insert('Table',$array);

Nous récupérons le même type de données que lorsque nous appelons la fonction $this->db->query() avec en paramètre une requête qui modifie la table. Il est aussi possible d'utiliser la fonction $this->db->where() utilisée dans l'exemple de la fonction $this->db->get().
Pour voir le fonctionnement des autres opérations, voir cette page.