Lors de la migration d'un site Kohana 3.2 vers PHP 5.5, l'uitlisation de mysql_connect() n'est plus supportée, nécessitant le recours à PDO pour établir des connexions aux bases de données. Cependant, après avoir basculé sur PDO, une expection peut se produire : Kohana_Exception [ 0 ]: Database method list_columns is not supported by Kohana_Database_PDO. Cette incompatibilité empêche l'utilisation des fonctionnalités natives de listing des colonnes de Kohana avec le pilote PDO par défaut.
Pour contourner ce problème, il est possible de créer une classe étendue qui implémente la méthode manquante. Commencez par établir un nouveau fichier à l'emplacement approprié, par exemple dans APPPATH/classes/Adaptateur/PDO/MySQL.php, avec le contenu suivant :
<?php
defined('SYSPATH') or die('Accès direct non autorisé.');
class Adaptateur_PDO_MySQL extends Database_PDO
{
public function list_columns($table_name, $filter = NULL, $apply_prefix = TRUE)
{
$qualified_table = ($apply_prefix === TRUE) ? $this->quote_table($table_name) : $table_name;
$query_filter = '';
if (is_string($filter)) {
$query_filter = ' LIKE ' . $this->quote($filter);
}
$column_list_query = 'SHOW FULL COLUMNS FROM ' . $qualified_table . $query_filter;
$query_result = $this->query(Database::SELECT, $column_list_query, FALSE);
$column_data = array();
$position = 0;
foreach ($query_result as $record) {
$parsed_type = $this->_parse_type($record['Type']);
$type_info = $this->datatype($parsed_type[0]);
$type_info['name'] = $record['Field'];
$type_info['default_value'] = $record['Default'];
$type_info['base_type'] = $parsed_type[0];
$type_info['nullable'] = ($record['Null'] == 'YES');
$type_info['position'] = ++$position;
switch ($parsed_type[0]) {
case 'float':
if (isset($parsed_type[1])) {
$dimensions = explode(',', $parsed_type[1]);
$type_info['precision'] = $dimensions[0];
$type_info['scale'] = $dimensions[1] ?? 0;
}
break;
case 'int':
if (isset($parsed_type[1])) {
$type_info['display_width'] = $parsed_type[1];
}
break;
case 'string':
switch ($type_info['base_type']) {
case 'binary':
case 'varbinary':
$type_info['max_length'] = $parsed_type[1];
break;
case 'char':
case 'varchar':
$type_info['max_length'] = $parsed_type[1];
case 'text':
case 'tinytext':
case 'mediumtext':
case 'longtext':
$type_info['collation'] = $record['Collation'];
break;
case 'enum':
case 'set':
$type_info['collation'] = $record['Collation'];
$options_str = substr($parsed_type[1], 1, -1);
$type_info['allowed_values'] = explode('\',\'', $options_str);
break;
}
break;
}
$type_info['description'] = $record['Comment'];
$type_info['extra_info'] = $record['Extra'];
$type_info['key_status'] = $record['Key'];
$type_info['permissions'] = $record['Privileges'];
$column_data[$record['Field']] = $type_info;
}
return $column_data;
}
}
Ensuite, modifiez la configuration de la base de données dans le fichier database.php de votre application pour utiliser ce nouveau pilote. Remplacez la valeur du paramètre type par PDO_MySQL :
'default' => array(
'type' => 'PDO_MySQL',
'connection' => array(
'dsn' => 'mysql:dbname=ma_base_de_donnees;host=serveur_local',
'username' => 'utilisateur',
'password' => 'mot_de_passe',
'persistent' => FALSE,
),
'table_prefix' => '',
'charset' => 'utf8mb4',
'caching' => FALSE,
),
Avec ces modifications, le framework Kohana 3.2 pourra interagir avec les bases de données MySQL via PDO sans générer l'exception liée à la méthode list_columns.