Notes d'étude PHPPDO lib.culog.cn 13 novembre 2007 09:36 Auteur : Liu Shui Meng Chun [Grand, Moyen, Petit]
■Qu'est-ce que l'AOP ?
L'extension POD (PHP Data Object) a été ajoutée en PHP5. En PHP6, PDO sera utilisé par défaut pour se connecter à la base de données. Toutes les extensions non-PDO seront supprimées de l'extension en PHP6. Cette extension fournit la classe PDO intégrée à PHP pour accéder à la base de données. Différentes bases de données utilisent le même nom de méthode pour résoudre le problème des connexions de base de données incohérentes.
Je l'ai configuré pour le développement sous Windows.
■L'objectif de PDO est de fournir une API légère, claire et pratique qui unifie les fonctionnalités communes de diverses bibliothèques SGBDR, mais n'exclut pas des fonctionnalités plus avancées. Fournit en option un plus grand degré d’abstraction/compatibilité via des scripts PHP.
■Caractéristiques du PDO :
performance. PDO a appris dès le début les succès et les échecs de la mise à l'échelle des bases de données existantes. Le code de PDO étant tout nouveau, nous avons la possibilité de repenser entièrement les performances pour tirer parti des dernières fonctionnalités de PHP 5. capacité. PDO est conçu pour fournir des fonctionnalités de base de données communes comme base tout en offrant un accès facile aux fonctionnalités uniques d'un SGBDR. Simple. PDO est conçu pour vous faciliter l’utilisation des bases de données. L'API ne force pas son chemin dans votre code et indique clairement ce que fait chaque appel de fonction. Extensible au moment de l'exécution. L'extension PDO est modulaire, vous permettant de charger les pilotes pour votre backend de base de données au moment de l'exécution sans avoir à recompiler ou réinstaller l'intégralité du programme PHP. Par exemple, l'extension PDO_OCI implémente l'API de base de données Oracle au lieu de l'extension PDO. Il existe également des pilotes pour MySQL, PostgreSQL, ODBC et Firebird, et d'autres sont en cours de développement.
■Installer PDO
Ce que j'ai ici est une extension PDO pour le développement sous WINDOWS. Si vous souhaitez l'installer et la configurer sous Linux, veuillez chercher ailleurs.
Exigences de version :
Il est déjà inclus dans le package de programme de php5.1 et des versions ultérieures ;
Pour php5.0.x, vous devez le télécharger depuis pecl.php.net et le placer dans votre bibliothèque d'extensions, qui est le dossier ext du dossier où se trouve PHP ;
Le manuel indique que les versions antérieures à 5.0 ne peuvent pas exécuter les extensions PDO.
Configuration:
Modifiez votre fichier de configuration php.ini pour qu'il supporte pdo (Si vous ne comprenez pas php.ini, sachez d'abord que vous devez modifier le php.ini affiché lors de l'appel de votre fonction phpinfo()).
Paquet
Supprimez le point-virgule devant extension=php_pdo.dll Le point-virgule est le symbole de commentaire du fichier de configuration php. Cette extension est nécessaire.
Il y a plus
;extension=php_pdo.dll
;extension=php_pdo_firebird.dll
;extension=php_pdo_informix.dll
;extension=php_pdo_mssql.dll
;extension=php_pdo_mysql.dll
;extension=php_pdo_oci.dll
;extension=php_pdo_oci8.dll
;extension=php_pdo_odbc.dll
;extension=php_pdo_pgsql.dll
;extension=php_pdo_sqlite.dll
La base de données correspondant à chaque extension est :
Nom du piloteBases de données prises en chargePDO_DBLIBFreeTDS / Microsoft SQL Server / SybasePDO_FIREBIRDFirebird/Interbase 6PDO_INFORMIXIBM Informix Dynamic ServerPDO_MYSQLMySQL 3.x/4.xPDO_OCIOracle Call InterfacePDO_ODBCODBC v3 (IBM DB2, unixODBC et win32 ODBC)PDO_PGSQLPostgreSQLPDO_SQLITESQLite 3 et ite 2
Quelle base de données vous souhaitez utiliser, il suffit de mettre le correspondant Supprimez simplement le symbole de commentaire ";" avant l'expansion.
■Utilisation de PDO
Je suppose ici que vous avez installé MySQL. Sinon, trouvez d'abord un moyen de l'installer. Le mien est mysql5.0.22, et d'autres utilisateurs de MySQL 4.0.26 peuvent également l'utiliser.
★Connexion à la base de données :
Nous utilisons l'exemple suivant pour analyser la base de données de connexion PDO,
<?php
$dbms='mysql'; //Le type de base de données Oracle utilise ODI Pour les développeurs, si vous utilisez différentes bases de données, il vous suffit de modifier cela et vous n'avez pas besoin de mémoriser autant de fonctions.
$host='localhost';//Nom d'hôte de la base de données
$dbName='test'; //Base de données utilisée
$user='root'; //Nom d'utilisateur de connexion à la base de données
$pass=''; //Mot de passe correspondant
$dsn="$dbms:host=$host;dbname=$dbName";
//
essayer{
$dbh=newPDO($dsn,$user,$pass);//Initialiser un objet PDO signifie créer l'objet de connexion à la base de données $dbh
echo "Connexion réussie<br/>";
/*Vous pouvez également effectuer une opération de recherche
foreach($dbh->query('SELECT * from FOO')as$row){
print_r($row);//Vous pouvez utiliser echo($GLOBAL);
}
*/
$dbh=nul ;
}catch(PDOException$e){
die("Erreur ! : ".$e->getMessage()."<br/>");
}
//Par défaut, ce n'est pas une longue connexion. Si vous avez besoin d'une longue connexion à la base de données, vous devez ajouter un paramètre à la fin : array(PDO::ATTR_PERSISTENT => true).
$db=newPDO($dsn,$user,$pass,array(PDO::ATTR_PERSISTENT=>true))
;
★ Requête de base de données :
Nous avons déjà effectué une requête ci-dessus, et nous pouvons également utiliser la requête suivante :
<?php
$db->setAttribute(PDO::ATTR_CASE,PDO::CASE_UPPER //Définir les attributs);
$rs=$db->query("SELECT * FROM foo");
$rs->setFetchMode(PDO::FETCH_ASSOC);
$result_arr=$rs->fetchAll();
print_r($result_arr);
?>
Étant donné que la méthode setAttribute() est utilisée ci-dessus, les deux paramètres sont placés pour forcer le nom du champ à être mis en majuscule. Voici les paramètres de PDO::setAttribute() :
PDO
::ATTR_CASE : force le nom de la colonne à être dans un format, comme détaillé ci-dessous (deuxième paramètre) :
PDO::CASE_LOWER : force le nom de la colonne à être en minuscules.
: :CASE_NATURAL : les noms de colonnes suivent la méthode d'origine.
PDO::CASE_UPPER : force les noms de colonnes à être mis en majuscules.
PDO::ATTR_ERRMODE : message d'erreur.
PDO::ERRMODE_SILENT : n'affiche pas les informations d'erreur, uniquement le code d'erreur.
PDO::
ERRMODE_WARNING : affiche une erreur d'avertissement.
PDO::ATTR_ORACLE_NULLS (valable non seulement pour ORACLE, mais aussi pour d'autres bases de données) : ) spécifie la valeur correspondante en php pour la valeur NULL renvoyée par la base de données.
PDO::NULL_NATURAL : inchangé.
PDO::NULL_EMPTY_STRING : la chaîne vide est convertie en NULL.
PDO::NULL_TO_STRING : NULL est converti en chaîne vide.
PDO::ATTR_STRINGIFY_FETCHES : convertit les valeurs numériques en chaînes lors de la récupération. Nécessite bool
::ATTR_STATEMENT_CLASS : définit la classe d'instructions fournie par l'utilisateur dérivée de PDOStatement. Ne peut pas être utilisée avec les instances PDO persistantes. )) .
PDO::ATTR_AUTOCOMMIT(disponible dans OCI, Firebird et MySQL) : s'il faut valider automatiquement chaque instruction
PDO::MYSQL_ATTR_USE_BUFFERED_QUERY(disponible dans MySQL) : utiliser des requêtes mises en mémoire tampon.
$rs->setFetchMode(PDO::FETCH_ASSOC); dans l'exemple est PDOStatement::setFetchMode(), une déclaration du type de retour.
Il y a les éléments suivants :
PDO::FETCH_ASSOC-- forme de tableau associatif
PDO::FETCH_NUM -- Forme de tableau d'index numérique
PDO::FETCH_BOTH -- Les deux sont disponibles sous forme de tableau, ce qui est la valeur par défaut
PDO::FETCH_OBJ -- sous la forme d'un objet, similaire au précédent mysql_fetch_object() Pour
plus de déclarations de type de retour (PDOStatement::method name), consultez le manuel.
★Insérer, mettre à jour, supprimer des données,
$db->exec("DELETE FROM `xxxx_menu` où mid=43");
Pour résumer brièvement les opérations ci-dessus :
Les opérations de requête sont principalement PDO::query(), PDO::exec(), PDO::prepare().
PDO::query() est principalement utilisé pour les opérations qui renvoient des résultats enregistrés, en particulier les opérations SELECT.
PDO::exec() est principalement destiné aux opérations qui ne renvoient pas de jeu de résultats, telles que INSERT, UPDATE, DELETE et d'autres opérations. Le résultat qu'il renvoie est le nombre de colonnes affectées par l'opération en cours.
PDO::prepare() est principalement une opération de prétraitement. Vous devez utiliser $rs->execute() pour exécuter l'instruction SQL lors du prétraitement. Cette méthode peut lier des paramètres et est assez puissante. Elle ne peut pas être expliquée simplement dans cet article. . Tout le monde Vous pouvez vous référer aux manuels et autres documentations.
Les principales opérations pour obtenir le jeu de résultats sont : PDOStatement::fetchColumn(), PDOStatement::fetch(), PDOStatement::fetchALL().
PDOStatement::fetchColumn() est un champ du premier enregistrement spécifié dans le résultat de la récupération. La valeur par défaut est le premier champ.
PDOStatement::fetch() est utilisé pour obtenir un enregistrement.
PDOStatement::fetchAll() consiste à regrouper tous les jeux d'enregistrements en un seul. Pour obtenir les résultats, vous pouvez définir le type du jeu de résultats requis via PDOStatement::setFetchMode.
Il existe également deux opérations environnantes, l'une est PDO::lastInsertId() et PDOStatement::rowCount(). PDO::lastInsertId() renvoie la dernière opération d'insertion et le type de colonne de clé primaire est le dernier ID d'auto-incrémentation.
PDOStatement::rowCount() est principalement utilisé pour le jeu de résultats affecté par les opérations DELETE, INSERT et UPDATE de PDO::query() et PDO::prepare(), et n'est pas valide pour la méthode PDO::exec() et opérations SELECT.
★Transactions et soumission automatique
À ce stade, vous êtes connecté à MySQL via PDO Avant d'émettre des requêtes, vous devez comprendre comment PDO gère les transactions. Si vous n'avez jamais été exposé à des transactions auparavant, vous devez d'abord connaître les quatre caractéristiques des transactions : atomicité, cohérence, isolement et durabilité, c'est-à-dire ACID. En termes simples, pour tout travail effectué dans le cadre d'une transaction, même s'il est effectué par étapes, il existe une garantie que le travail sera appliqué en toute sécurité à la base de données et ne sera pas affecté par les demandes d'autres connexions pendant la soumission du travail. . influence. Le travail transactionnel peut être automatiquement annulé sur demande (en supposant que vous ne l'ayez pas encore validé), ce qui facilite grandement la gestion des erreurs dans les scripts.
Les transactions sont généralement mises en œuvre en accumulant un lot de modifications et en les rendant effectives en même temps. L’avantage est que cela peut grandement améliorer l’efficacité de ces mises à jour. En d’autres termes, les transactions peuvent rendre les scripts plus rapides et potentiellement plus robustes (même si les transactions doivent être utilisées correctement pour bénéficier de tels avantages).
Malheureusement, toutes les bases de données ne prennent pas en charge les transactions (Mysql5 prend en charge les transactions, mysql4 je ne sais pas), donc lorsque la connexion est ouverte pour la première fois, PDO doit s'exécuter en mode "auto-commit". Le mode de validation automatique signifie que si la base de données prend en charge les transactions, chaque requête que vous exécutez possède sa propre transaction implicite, et si la base de données ne prend pas en charge les transactions, chaque requête ne comporte pas une telle transaction. Si vous avez besoin d'une transaction, vous devez utiliser la méthode PDO::beginTransaction() pour démarrer une transaction. Si le pilote sous-jacent ne prend pas en charge les transactions, une PDOException sera levée (quels que soient les paramètres de gestion des erreurs : il s'agit toujours d'une condition d'erreur fatale). Au sein d'une transaction, vous pouvez utiliser PDO::commit() ou PDO::rollBack() pour terminer la transaction, selon que le code exécuté dans la transaction a réussi.
Lorsque le script se termine ou lorsqu'une connexion est sur le point d'être fermée, s'il y a une transaction en cours, PDO annulera automatiquement la transaction. Il s'agit d'une mesure de sécurité permettant d'éviter les incohérences si le script se termine anormalement. Si la transaction n'est pas validée explicitement, on suppose qu'il y aura une incohérence quelque part, donc une restauration sera effectuée pour préserver la sécurité des données.
//Exemple tiré de http://www.ibm.com/developerworks/cn/db2/library/techarticles/dm-0505furlong/index.html
essayer{
$dbh=nouveau PDO('odbc:SAMPLE','db2inst1','ibmdb2',
tableau(PDO_ATTR_PERSISTENT=>true));
echo"Connectén";
$dbh->setAttribute(PDO_ATTR_ERRMODE,PDO_ERRMODE_EXCEPTION);
$dbh->beginTransaction();
$dbh->exec("insérer dans les valeurs du personnel (id, premier, dernier) (23, 'Joe', 'Bloggs')");
$dbh->exec("insérer dans le changement de salaire (id, montant, date de modification)
valeurs (23, 50000, MAINTENANT())");
$dbh->commit();
}attraper(Exception $e){
$dbh->rollBack();
echo"Échec : ".$e->getMessage();
}
Dans l'exemple ci-dessus, supposons que nous créions un ensemble d'entrées pour un nouvel employé avec un numéro d'identification, qui est 23. En plus de saisir les données de base de la personne, nous devons également enregistrer le salaire de l'employé. Il est simple d'effectuer les deux mises à jour séparément, mais en incluant les deux mises à jour dans les appels beginTransaction() et commit(), vous garantissez que personne d'autre ne peut voir les modifications tant qu'elles ne sont pas terminées. Si une erreur se produit, le bloc catch peut annuler toutes les modifications survenues depuis le début de la transaction et imprimer un message d'erreur.
Il n'est pas nécessaire d'effectuer des mises à jour au cours d'une transaction. Vous pouvez également émettre des requêtes complexes pour extraire des données et créer d'autres mises à jour et requêtes à l'aide de ces informations. Lorsqu'une transaction est active, il est garanti que d'autres ne pourront pas apporter de modifications pendant que le travail est en cours. En fait, ce n’est pas exact à 100 %, mais c’est une bonne introduction si vous n’avez jamais entendu parler de transactions auparavant.
★Instructions préparées et procédures stockées De nombreuses bases de données plus matures prennent en charge le concept d'instructions préparées. Que sont les déclarations préparées ? Vous pouvez considérer les instructions préparées comme un modèle compilé du code SQL que vous souhaitez exécuter, qui peut être personnalisé à l'aide de paramètres variables. Les instructions préparées offrent deux avantages majeurs :
la requête ne doit être analysée (ou préparée) qu'une seule fois, mais peut être exécutée plusieurs fois avec des paramètres identiques ou différents. Lorsqu'une requête est prête, la base de données analyse, compile et optimise le plan d'exécution de la requête. Ce processus prend plus de temps pour les requêtes complexes et peut ralentir considérablement votre application si vous devez répéter plusieurs fois la même requête avec des paramètres différents. En utilisant des instructions préparées, vous pouvez éviter les cycles répétés d’analyse/compilation/optimisation. En termes simples, les instructions préparées utilisent moins de ressources et s'exécutent donc plus rapidement.
Les paramètres fournis aux instructions préparées n'ont pas besoin d'être mis entre guillemets ; le pilote les gère. Si votre application utilise exclusivement des instructions préparées, vous pouvez être sûr qu'aucune intrusion SQL ne peut se produire. (Cependant, il existe toujours un risque si vous basez toujours d'autres parties de la requête sur des entrées non fiables).
Les instructions préparées sont si utiles que PDO enfreint la règle définie dans l'objectif 4 : si le pilote ne prend pas en charge les instructions préparées, PDO émulera les instructions préparées.
Exemple : Exemple d'application PDO :
<?php
'
;//Type de base de données Oracle utilise ODI Pour les développeurs utilisant différentes bases de données, tant que vous modifiez cela, vous n'avez pas besoin de mémoriser autant de fonctions.
nom d'hôte
$dbName='test';//Base de données utilisée
$user='root';//Nom d'utilisateur de connexion à la base de données
$pass='';//Mot de passe correspondant
$dsn="$dbms:host=$host;dbname= $nom_base de données" ;
classdbextendsPDO{
publicfunction__construct(){
essayer{
parent::__construct("$GLOBALS[dsn]",$GLOBALS['utilisateur'],$GLOBALS['pass']);
}catch(PDOException$e){
die("Erreur : ".$e->__toString()."<br/>");
}
}
publicfinalfunctionquery($sql){
essayer{
returnparent::query($this->setString($sql));
}catch(PDOException$e){
die("Erreur : ".$e->__toString()."<br/>");
}
}
privatefinalfunctionsetString($sql){
echo "Je veux traiter $sql";
retourner$sql;
}
}
$db=newdb();
$db->setAttribute(PDO::ATTR_CASE,PDO::CASE_UPPER);
foreach($db->query('SELECT * from xxxx_menu')as$row){
print_r($ligne);
}
$db->exec('DELETE FROM `xxxx_menu` où mid=43');
?>