l'extension de la classe PDO
Ci-dessous est la connexion aux bases de classe, j'ai choisi jusqu'à présent, mais je vais l'améliorer en étendant la classe PDO lui-même,
<?php
class database
{
protected $connection = null;
#make a connection
public function __construct($hostname,$dbname,$username,$password)
{
try
{
# MySQL with PDO_MYSQL
$this->connection = new PDO("mysql:host=$hostname;dbname=$dbname", $username, $password);
$this->connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
catch (PDOException $e)
{
$this->connection = null;
die($e->getMessage());
}
}
#get the number of rows in a result
public function num_rows($query)
{
# create a prepared statement
$stmt = $this->connection->prepare($query);
if($stmt)
{
# execute query
$stmt->execute();
return $stmt->rowCount();
}
else
{
return self::get_error();
}
}
#display error
public function get_error()
{
$this->connection->errorInfo();
}
# closes the database connection when object is destroyed.
public function __destruct()
{
$this->connection = null;
}
}
?>
classe étendue,
class database extends PDO
{
#make a connection
public function __construct($hostname,$dbname,$username,$password)
{
parent::__construct($hostname,$dbname,$username,$password);
try
{
$this->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
catch (PDOException $e)
{
die($e->getMessage());
}
}
#get the number of rows in a result
public function num_rows($query)
{
# create a prepared statement
$stmt = parent::prepare($query);
if($stmt)
{
# execute query
$stmt->execute();
return $stmt->rowCount();
}
else
{
return self::get_error();
}
}
#display error
public function get_error()
{
$this->connection->errorInfo();
}
# closes the database connection when object is destroyed.
public function __destruct()
{
$this->connection = null;
}
}
C'est comment je instancier la classe,
# the host used to access DB
define('DB_HOST', 'localhost');
# the username used to access DB
define('DB_USER', 'root');
# the password for the username
define('DB_PASS', 'xxx');
# the name of your databse
define('DB_NAME', 'db_2011');
include 'class_database.php';
$connection = new database(DB_HOST,DB_NAME,DB_USER,DB_PASS);
$sql = "
SELECT *
FROM root_contacts_cfm
ORDER BY cnt_id DESC
";
$connection->num_rows($sql);
Mais j'ai des erreurs quand je l'appelle de cette extension de la classe pdo,
Avertissement: PDO::__construct() s'attend à ce
paramètre 4 array, string donné
dans C:\wamp\www\xx\class_database.php
sur la ligne xxErreur fatale: Appel d'une fonction membre
setAttribute() sur un non-objet dans
C:\wamp\www\xx\class_database.php sur
ligne xx
J'ai fait un peu de recherche en ligne, j'ai trouvé cette structure de base de l'extension pdo mais je ne comprends pas...
class myPDO extends PDO
{
public function __construct($dsn,
$username=null,
$password=null,
$driver_options=null)
{
parent::__construct($dsn, $username, $password, $driver_options);
}
public function query($query)
{
$result = parent::query($query);
//do other stuff you want to do here, then...
return($result);
}
}
Qu'est-ce que $ds
n variable? Comment puis-je passer mon $hostname
variable en étendue de la classe pdo?
Un autre questions:
Comment puis-je faire une méthode pour l'affichage de l'erreur dans l'étendue de la classe pdo?
Comment puis-je fermer la connexion dans l'étendue de la classe pdo?
Il est si difficile de passer de mysqli à pdo!
Grâce.
est l'extension pdo est une mauvaise chose? J'ai eu un indépendant de la classe mysqli avant mais on m'a dit mieux l'extension mysqli, donc je pense qu'il doit être le même que pdo??
Vous n'avez pas besoin de réécrire le constructeur btw.
OriginalL'auteur laukok | 2011-03-03
Vous devez vous connecter pour publier un commentaire.
$dsn est le nom de source de données. Il gère votre nom d'hôte pour vous. Vous l'utilisez comme ceci:
Avec la ligne
$this->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
Vous avez défini les exceptions soulevées lorsque des erreurs se produisent (que j'aime), donc dans votre classe, vous pouvez gérer les erreurs dans les gestionnaires d'exception. Si vous aviez une méthode appelée getAssoc dans votre extension de la classe PDO alors il devrait ressembler à ceci:merci pour l'edit, paul!
OriginalL'auteur Paul
Je voudrais me concentrer sur ce que les besoins de la classe à faire, plutôt que d'essayer de re écrire l'AOP. J'ai eu la même idée, car je pensais qu'il permettrait de simplifier et de flux en ligne le code mais il ne fonctionne pas. Vous finissez par passer plus de temps à trouver comment indirectement de l'interface avec l'AOP.
OriginalL'auteur graham