Académique Documents
Professionnel Documents
Culture Documents
Les connexions sont établies en créant des instances de la classe de base de PDO.
Peu importe quel pilote vous voulez utiliser ; vous utilisez toujours le nom de la
classe PDO. Le constructeur accepte des paramètres pour spécifier la source de la
base de données (connue en tant que DSN) et optionnellement, le nom d'utilisateur
et le mot de passe (s'il y en a un).
<?php
$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
?>
S'il y a des erreurs de connexion, un objet PDOException est lancé. Vous pouvez
attraper cette exception si vous voulez gérer cette erreur, ou laisser le gestionnaire
global d'exception défini via la fonction set_exception_handler() (function.set-
exception-handler.html) la traiter.
<?php
try {
$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
foreach($dbh->query('SELECT * from FOO') as $row) {
print_r($row);
}
$dbh = null;
} catch (PDOException $e) {
print "Erreur !: " . $e->getMessage() . "<br/>";
die();
}
?>
Avertissement
mk:@MSITStore:D:\formations\ITTP\decembre19\php_enhanced_fr.chm::/res/pdo.co... 18/01/2020
Connexions et gestionnaire de connexion Page 2 of 9
Note: S'il existe encore d'autres références à cette instance PDO (par exemple,
à partir d'une instance PDOStatement ou d'autres variables référençant la même
instance PDO), celles-ci doivent également être supprimées (par exemple, en
affectant NULL à la variable qui référence le PDOStatement).
<?php
$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
// utiliser la connexion ici
$sth = $dbh->query('SELECT * FROM foo');
// et maintenant, fermez-la !
$sth = null;
$dbh = null;
?>
mk:@MSITStore:D:\formations\ITTP\decembre19\php_enhanced_fr.chm::/res/pdo.co... 18/01/2020
Connexions et gestionnaire de connexion Page 3 of 9
<?php
$dbh = new PDO
('mysql:host=localhost;dbname=test', $user, $pass, array(
PDO::ATTR_PERSISTENT => true
));
?>
Note:
Si vous souhaitez utiliser des connexions persistantes, vous devez utiliser la
valeur PDO::ATTR_PERSISTENT dans le tableau des options du pilote passé au
constructeur PDO. Si vous définissez cet attribut avec la méthode
PDO::setAttribute() (pdo.setattribute.html) après l'instanciation de l'objet, le pilote
n'utilisera pas les connexions persistantes.
Note:
Si vous utilisez le pilote PDO ODBC et que votre librairie ODBC prend en charge
le bassin de connexion ODBC (unixODBC et Windows le supportent tous les
deux ; peut être plus), alors il est recommandé de ne pas utiliser les connexions
persistantes PDO, mais plutôt laisser le bassin de connexion ODBC mettre en
cache les connexions. Le bassin de connexion ODBC est partagé avec les
autres modules dans le processus ; si PDO met en cache la connexion, alors
cette connexion ne sera jamais retournée par le bassin de connexion ODBC,
faisant que plusieurs connexions sont créées pour les autres modules.
mk:@MSITStore:D:\formations\ITTP\decembre19\php_enhanced_fr.chm::/res/pdo.co... 18/01/2020
Connexions et gestionnaire de connexion Page 4 of 9
will live even after the php script ends. The next php script that
will try to issue the same create temporary table statement, will
receive an error.
IMHO, this fact makes persistent connections quite useless.
Hello guys!
Has anyone used the ORACLE WALLET feature in PHP or Java?
https://docs.oracle.com/middleware/1213/wls/JDBCA/oraclewallet.htm#JD
BCA596
I would like to know how to implement it because I can not implement.
We use PDO + PHP in all applications and now there is this demand of
the DBA.
Thank you
If you want to keep connection after fork exit, you can kill with
SIGKILL forked process.
<?php
$dbh = new PDO('pgsql:host=localhost;dbname=test', $user, $pass);
$pid = pcntl_fork();
if($pid == 0){
// forked process 'll exit immediately
exit;
}
sleep(1);
$statement = $dbh->query('select 1');
var_dump($statement);
?>
Result: false
<?php
$dbh = new PDO('pgsql:host=localhost;dbname=test', $user, $pass);
$pid = pcntl_fork();
if($pid == 0){
// use sigkill to close process
register_shutdown_function(function(){
mk:@MSITStore:D:\formations\ITTP\decembre19\php_enhanced_fr.chm::/res/pdo.co... 18/01/2020
Connexions et gestionnaire de connexion Page 5 of 9
posix_kill(getmypid(), SIGKILL);
});
// forked process 'll exit immediately
exit;
}
sleep(1);
$statement = $dbh->query('select 1');
var_dump($statement);
?>
Result: object(PDOStatement)#3 (1) {
["queryString"]=>
string(8) "select 1"
}
As http://stackoverflow.com/questions/17630772/pdo-cannot-connect-
remote-mysql-server points out; sometimes when you want to connect to
an external server like this:
(http://stackoverflow.com/questions/17630772/pdo-cannot-connect-
remote-mysql-server points out; sometimes when you want to connect to
an external server like this:)
<?php
$conn = new PDO
('mysql:host=123.4.5.6;dbname=test_db;port=3306','username','password
');
mk:@MSITStore:D:\formations\ITTP\decembre19\php_enhanced_fr.chm::/res/pdo.co... 18/01/2020
Connexions et gestionnaire de connexion Page 6 of 9
?>
it will fail no matter what. However if you put a space between
mysql: and host like this:
<?php
$conn = new PDO('mysql:
host=123.4.5.6;dbname=test_db;port=3306','username','password');
?>
it will magically work. I'm not sure if this applies in all cases or
server setups. But I think it's worth mentioning in the docs.
mk:@MSITStore:D:\formations\ITTP\decembre19\php_enhanced_fr.chm::/res/pdo.co... 18/01/2020
Connexions et gestionnaire de connexion Page 7 of 9
<?php
$pdo = new PDO('pgsql:host=192.168.137.160;port=5432;dbname=platin',
'cappytoi', '1111');
sleep(5);
$stmt = $pdo->prepare('SELECT * FROM admin');
$stmt->execute();
$stmt->closeCursor();
$pdo = null;
sleep(60);
?>
What teh heck you say at this point? Still same? Here is what you
need to do to close that connection:
<?php
$pdo = new PDO('pgsql:host=192.168.137.160;port=5432;dbname=platin',
'cappytoi', '1111');
sleep(5);
$stmt = $pdo->prepare('SELECT * FROM admin');
$stmt->execute();
$stmt->closeCursor(); // this is not even required
$stmt = null; // doing this is mandatory for connection to get closed
$pdo = null;
sleep(60);
?>
PDO is just one of a kind because it saves you to depend on 3rd party
abstraction layers. But it becomes annoying to see there is no
implementation of a "disconnect" method even though there is a
request for it for 2 years. Developers underestimate the requirement
of such a method. First of all, doing $stmt = null everywhere is
annoying and what is most annoying is you cannot forcibly disconnect
even when you set $pdo = null. It might get cleared on script's
termination but this is not always possible because script
termination may delayed due to slow client connection etc.
Anyway here is how to disconnect forcibly using postgresql:
<?php
$pdo = new PDO('pgsql:host=192.168.137.160;port=5432;dbname=platin',
'cappytoi', '1111');
sleep(5);
$stmt = $pdo->prepare('SELECT * FROM admin');
$stmt->execute();
$pdo->query('SELECT pg_terminate_backend(pg_backend_pid());');
mk:@MSITStore:D:\formations\ITTP\decembre19\php_enhanced_fr.chm::/res/pdo.co... 18/01/2020
Connexions et gestionnaire de connexion Page 8 of 9
$pdo = null;
sleep(60);
?>
Following may be used for MYSQL: (not guaranteed)
KILL CONNECTION_ID()
If you are using PHP 5.4 and later, you can no longer use persistent
connections when you have your own database class that derives from
the native PDO object. If you do, you will get segmentation faults
during the PHP process shutdown.
Please see this bug report for more information:
https://bugs.php.net/bug.php?id=63176
Just thought I'd add in and give an explanation as to why you need to
use 127.0.0.1 if you have a different port number.
The mysql libraries will automatically use Unix sockets if the host
of "localhost" is used. To force TCP/IP you need to set an IP
address.
mk:@MSITStore:D:\formations\ITTP\decembre19\php_enhanced_fr.chm::/res/pdo.co... 18/01/2020
Connexions et gestionnaire de connexion Page 9 of 9
Note that you can specify a port number with "port=####", but this
port number will be ignored if the host is localhost. If you want to
connect to a local port other than the default, use host=127.0.0.1
instead of localhost.
mk:@MSITStore:D:\formations\ITTP\decembre19\php_enhanced_fr.chm::/res/pdo.co... 18/01/2020