die Erweiterung PDO-Klasse
Unten ist die db-Verbindungs-Klasse, ich kam mit so weit, aber ich bin dabei es zu verbessern durch die Erweiterung die PDO-Klasse selbst,
<?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;
}
}
?>
erweiterten Klasse,
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;
}
}
Dies ist, wie ich die Klasse instanziieren,
# 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);
Aber ich habe Fehler, wenn ich Anrufe dieser erweiterten pdo-Klasse,
Warning: PDO::__construct() erwartet
parameter 4 to be array, string given
in C:\wamp\www\xx\class_database.php
auf der Linie xxFatal error: Call to a member function
setAttribute() on a non-object in
C:\wamp\www\xx\class_database.php auf
Zeile xx
Ich habe getan, einige online-Forschung, fand ich diese grundlegende Struktur der Erweiterung pdo aber ich verstehe nicht, es...
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);
}
}
Was ist $ds
n variable für? Wie kann ich mein $hostname
variable in den erweiterten pdo-Klasse?
Anderen Fragen:
Wie kann ich eine Methode für die Anzeige der Fehler in der erweiterten pdo-Klasse?
Wie kann ich die Verbindung schließen, in der erweiterten pdo-Klasse?
Ist es so schwierig, sich zu bewegen von mysqli auf pdo!
Dank.
- Zu schauen, was Sie geschrieben haben, Sie wirklich brauchen nicht zu verlängern, für das die PDO-Klasse. Sie werden nur machen es schwieriger, als es sein muss.
- ist die Erweiterung pdo ist eine schlechte Sache? Ich hatte eine unabhängige mysqli-Klasse vor aber mir wurde gesagt, besser die Erweiterung mysqli, so dachte ich, es muss das gleiche sein wie pdo??
- Sie brauchen nicht zu schreiben, die Konstruktor btw.
Du musst angemeldet sein, um einen Kommentar abzugeben.
$dsn ist der data source name. Es behandelt Ihr hostname für Sie. Verwenden Sie es wie folgt:
Mit der Linie
$this->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
Sie gesetzt haben-Ausnahmen werden ausgelöst, wenn Fehler auftreten (was ich mag), also auch in Ihrer erweiterten Klasse, die Sie behandeln können Fehler im exception-Handler. Wenn Sie hatte eine Methode namens " getAssoc in Ihrem erweiterten PDO-Klasse ist, dann würde es so Aussehen:Ich würde mich auf das konzentrieren, was die Klasse tun muss, anstatt zu versuchen, neu zu schreiben die PDO. Ich hatte die gleiche Idee, weil ich dachte, es würde vereinfachen und stream-line-code aber es funktioniert nicht. Sie am Ende verbringen mehr Zeit mit der Arbeit aus, wie indirekt-Schnittstelle mit der PDO.