Notas de estudio de PHPPDO lib.culog.cn 13 de noviembre de 2007 09:36 Autor: Liu Shui Meng Chun [Grande, Mediano, Pequeño]
■¿Qué es la DOP?
La extensión POD (objeto de datos PHP) se agregó en PHP5. En PHP6, PDO se usará de forma predeterminada para conectarse a la base de datos. Todas las extensiones que no sean PDO se eliminarán de la extensión en PHP6. Esta extensión proporciona la clase PDO integrada de PHP para acceder a la base de datos. Diferentes bases de datos utilizan el mismo nombre de método para resolver el problema de conexiones de bases de datos inconsistentes.
Lo configuré para el desarrollo en Windows.
■ El objetivo de PDO es proporcionar una API liviana, clara y conveniente que unifique las características comunes de varias bibliotecas RDBMS, pero no excluya características más avanzadas. Proporciona un mayor grado opcional de abstracción/compatibilidad a través de scripts PHP.
■Características de la DOP:
actuación. PDO aprendió desde el principio sobre los éxitos y fracasos de ampliar las bases de datos existentes. Debido a que el código de PDO es completamente nuevo, tenemos la oportunidad de rediseñar el rendimiento desde cero para aprovechar las últimas funciones de PHP 5. capacidad. PDO está diseñado para proporcionar una funcionalidad de base de datos común como base y, al mismo tiempo, proporcionar un fácil acceso a las características únicas de un RDBMS. Simple. PDO está diseñado para facilitarle el trabajo con bases de datos. La API no fuerza su camino en su código y deja claro lo que hace cada llamada de función. Extensible en tiempo de ejecución. La extensión PDO es modular, lo que le permite cargar controladores para el backend de su base de datos en tiempo de ejecución sin tener que volver a compilar o reinstalar todo el programa PHP. Por ejemplo, la extensión PDO_OCI implementa la API de la base de datos Oracle en lugar de la extensión PDO. También hay controladores para MySQL, PostgreSQL, ODBC y Firebird, y hay más en desarrollo.
■Instalar PDO
Lo que tengo aquí es una extensión PDO para desarrollo en WINDOWS. Si desea instalarla y configurarla en Linux, busque en otra parte.
Requisitos de versión:
Ya está incluido en el paquete del programa php5.1 y versiones posteriores;
Para php5.0.x, debe descargarlo de pecl.php.net y colocarlo en su biblioteca de extensiones, que es la carpeta ext de la carpeta donde se encuentra PHP;
El manual dice que las versiones anteriores a la 5.0 no pueden ejecutar extensiones PDO.
Configuración:
Modifique su archivo de configuración php.ini para que admita pdo (si no comprende php.ini, primero descubra que necesita modificar el php.ini que se muestra al llamar a su función phpinfo()).
Manojo
Elimine el punto y coma delante de extensión=php_pdo.dll. El punto y coma es el símbolo de comentario del archivo de configuración de PHP. Esta extensión es necesaria.
hay mas
;extensión=php_pdo.dll
;extensión=php_pdo_firebird.dll
;extensión=php_pdo_informix.dll
;extensión=php_pdo_mssql.dll
;extensión=php_pdo_mysql.dll
;extensión=php_pdo_oci.dll
;extensión=php_pdo_oci8.dll
;extensión=php_pdo_odbc.dll
;extensión=php_pdo_pgsql.dll
;extensión=php_pdo_sqlite.dll
La base de datos correspondiente a cada extensión es:
Nombre del controlador Bases de datos compatiblesPDO_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 y win32 ODBC)PDO_PGSQLPostgreSQLPDO_SQLITESQLite 3 y SQLite 2
Que base de datos quieres usar, solo pon la correspondiente Simplemente elimine el símbolo de comentario ";" antes de la expansión.
■Usando PDO
Supongo que ha instalado mysql. De lo contrario, busque una manera de instalarlo primero. El mío es mysql5.0.22, y otros que usan MySQL 4.0.26 también pueden usarlo.
★Conexión de base de datos:
Usamos el siguiente ejemplo para analizar la base de datos de conexión PDO,
<?php
$dbms='mysql'; // El tipo de base de datos Oracle usa ODI. Para los desarrolladores, si usan diferentes bases de datos, solo necesitan cambiar esto y no necesitan recordar tantas funciones.
$host='localhost';//Nombre del host de la base de datos
$dbName='prueba'; //Base de datos utilizada
$usuario='root'; //Nombre de usuario de conexión a la base de datos
$pass=''; //Contraseña correspondiente
$dsn="$dbms:host=$host;dbname=$dbName";
//
intentar{
$dbh=newPDO($dsn,$user,$pass);//Inicializar un objeto PDO significa crear el objeto de conexión a la base de datos $dbh
echo "Conexión exitosa<br/>";
/*También puedes realizar una operación de búsqueda
foreach($dbh->query('SELECT * from FOO')as$row){
print_r($row);//Puedes usar echo($GLOBAL) para ver estos valores.
}
*/
$dbh=nulo;
}catch(PDOException$e){
die("¡Error!: ".$e->getMessage()."<br/>");
}
// De forma predeterminada, esta no es una conexión larga. Si necesita una conexión larga a la base de datos, debe agregar un parámetro al final: array(PDO::ATTR_PERSISTENT => true).
$db=newPDO($dsn,$usuario,$pass,array(PDO::ATTR_PERSISTENT=>true))
;
★Consulta de base de datos:
Ya hemos realizado una consulta anterior y también podemos usar la siguiente consulta:
<?php
$db->setAttribute(PDO::ATTR_CASE,PDO::CASE_UPPER //Establecer atributos);
$rs=$db->query("SELECT * FROM foo");
$rs->setFetchMode(PDO::FETCH_ASSOC);
$result_arr=$rs->fetchAll();
print_r($resultado_arr);
?>
Debido a que el método setAttribute() se usa anteriormente, los dos parámetros se ingresan para forzar que el nombre del campo esté en mayúsculas. Los siguientes son los parámetros de PDO::setAttribute():
PDO::ATTR_CASE: Fuerza que el nombre de la columna esté en un formato, como se detalla a continuación (segundo parámetro):
PDO::CASE_LOWER: Fuerza que el nombre de la columna esté en minúsculas
. : :CASE_NATURAL: Los nombres de las columnas siguen la forma original
PDO::CASE_UPPER: Fuerza los nombres de las columnas a mayúsculas.
PDO::ATTR_ERRMODE: Mensaje de error
PDO::ERRMODE_SILENT: No muestra información de error, solo código de error
PDO::ERRMODE_WARNING:
Muestra error de advertencia.
PDO::ATTR_ORACLE_NULLS (válido no sólo para ORACLE, sino también para otras bases de datos): ) especifica el valor correspondiente en php para el valor NULL devuelto por la base de datos.
PDO::NULL_NATURAL: sin cambios.
PDO::NULL_EMPTY_STRING: la cadena vacía se convierte en NULL.
PDO::NULL_TO_STRING: NULL se convierte en una cadena vacía.
PDO::ATTR_STRINGIFY_FETCHES: convierte valores numéricos en cadenas al recuperar. Requiere bool.::ATTR_STATEMENT_CLASS
: establece una clase de declaración proporcionada por el usuario derivada de PDOStatement. No se puede usar con instancias de PDO persistentes (nombre de clase de cadena, matriz (constructor_args mixtos). ))
PDO::ATTR_AUTOCOMMIT (disponible en OCI, Firebird y MySQL): si se debe confirmar automáticamente cada declaración
PDO::MYSQL_ATTR_USE_BUFFERED_QUERY (disponible en MySQL): use consultas almacenadas en búfer.
$rs->setFetchMode(PDO::FETCH_ASSOC); en el ejemplo es PDOStatement::setFetchMode(), una declaración del tipo de retorno.
Hay los siguientes:
PDO::FETCH_ASSOC-- forma de matriz asociativa
PDO::FETCH_NUM -- Forma de matriz de índice numérico
PDO::FETCH_BOTH: ambos están disponibles en forma de matriz, que es el valor predeterminado
PDO::FETCH_OBJ: en forma de objeto, similar al mysql_fetch_object() anterior. Para obtener
más declaraciones de tipos de retorno (PDOStatement::nombre del método), consulte el manual.
★Insertar, actualizar, eliminar datos,
$db->exec("BORRAR DE `xxxx_menu` donde mid=43");
Para resumir brevemente las operaciones anteriores:
Las operaciones de consulta son principalmente PDO::query(), PDO::exec(), PDO::prepare().
PDO::query() se utiliza principalmente para operaciones que devuelven resultados registrados, especialmente operaciones SELECT.
PDO::exec() es principalmente para operaciones que no devuelven un conjunto de resultados, como INSERT, UPDATE, DELETE y otras operaciones. El resultado que devuelve es el número de columnas afectadas por la operación actual.
PDO::prepare() es principalmente una operación de preprocesamiento. Debe usar $rs->execute() para ejecutar la instrucción SQL en el preprocesamiento. Este método puede vincular parámetros y es bastante poderoso. No se puede explicar simplemente en este artículo. Todos pueden consultar manuales y otra documentación.
Las principales operaciones para obtener el conjunto de resultados son: PDOStatement::fetchColumn(), PDOStatement::fetch(), PDOStatement::fetchALL().
PDOStatement::fetchColumn() es un campo del primer registro especificado en el resultado de la recuperación. El valor predeterminado es el primer campo.
PDOStatement::fetch() se utiliza para obtener un registro.
PDOStatement::fetchAll() es reunir todos los conjuntos de registros en uno. Para obtener los resultados, puede establecer el tipo de conjunto de resultados requerido a través de PDOStatement::setFetchMode.
También hay dos operaciones circundantes, una es PDO::lastInsertId() y PDOStatement::rowCount(). PDO::lastInsertId() devuelve la última operación de inserción y el tipo de columna de clave principal es el último ID de incremento automático.
PDOStatement::rowCount() se utiliza principalmente para el conjunto de resultados afectados por las operaciones DELETE, INSERT y UPDATE de PDO::query() y PDO::prepare(), y no es válido para el método PDO::exec() y operaciones SELECCIONAR.
★Transacciones y envío automático
En este punto, se ha conectado a MySQL a través de PDO. Antes de realizar consultas, debe comprender cómo PDO gestiona las transacciones. Si no ha estado expuesto a transacciones antes, primero debe conocer las cuatro características de las transacciones: atomicidad, consistencia, aislamiento y durabilidad, es decir, ACID. En términos sencillos, para cualquier trabajo realizado dentro de una transacción, incluso si se realiza en etapas, existe una garantía de que el trabajo se aplicará de forma segura a la base de datos y no se verá afectado por solicitudes de otras conexiones mientras se envía el trabajo. . influencia. El trabajo transaccional se puede deshacer automáticamente si lo solicita (suponiendo que aún no lo haya confirmado), lo que facilita mucho el manejo de errores en los scripts.
Las transacciones generalmente se implementan acumulando un lote de cambios y haciéndolos efectivos al mismo tiempo. La ventaja de esto es que puede mejorar enormemente la eficiencia de estas actualizaciones. En otras palabras, las transacciones pueden hacer que los scripts sean más rápidos y potencialmente más robustos (aunque las transacciones deben usarse correctamente para obtener dichos beneficios).
Desafortunadamente, no todas las bases de datos admiten transacciones (Mysql5 admite transacciones, mysql4 no lo sé), por lo que cuando se abre la conexión por primera vez, PDO debe ejecutarse en el llamado modo "commit automático". El modo de confirmación automática significa que si la base de datos admite transacciones, cada consulta que ejecute tiene su propia transacción implícita, y si la base de datos no admite transacciones, cada consulta no tiene dicha transacción. Si necesita una transacción, debe utilizar el método PDO::beginTransaction() para iniciar una transacción. Si el controlador subyacente no admite transacciones, se generará una PDOException (independientemente de la configuración de manejo de errores: esta es siempre una condición de error fatal). Dentro de una transacción, puede utilizar PDO::commit() o PDO::rollBack() para finalizar la transacción, dependiendo de si el código que se ejecutó en la transacción fue exitoso.
Cuando finaliza el script, o cuando una conexión está a punto de cerrarse, si hay una transacción pendiente, PDO revertirá automáticamente la transacción. Esta es una medida de seguridad para ayudar a evitar inconsistencias si el script finaliza de manera anormal; si la transacción no se confirma explícitamente, se supone que habrá una inconsistencia en alguna parte, por lo que se realizará una reversión para preservar la seguridad de los datos.
//Ejemplo de http://www.ibm.com/developerworks/cn/db2/library/techarticles/dm-0505furlong/index.html
intentar{
$dbh=nuevo PDO('odbc:MUESTRA','db2inst1','ibmdb2',
matriz(PDO_ATTR_PERSISTENT=>verdadero));
echo"Conectadon";
$dbh->setAttribute(PDO_ATTR_ERRMODE,PDO_ERRMODE_EXCEPTION);
$dbh->beginTransaction();
$dbh->exec("insertar en el personal (id, primero, último) valores (23, 'Joe', 'Bloggs')");
$dbh->exec("insertar en cambio de salario (id, monto, fecha de cambio)
valores (23, 50000, AHORA())");
$dbh->commit();
}catch(Excepción $e){
$dbh->rollBack();
echo"Error: ".$e->getMessage();
}
En el ejemplo anterior, supongamos que creamos un conjunto de entradas para un nuevo empleado con un número de identificación, que es 23. Además de ingresar los datos básicos de la persona, también necesitamos registrar el salario del empleado. Es sencillo realizar ambas actualizaciones por separado, pero al incluir ambas actualizaciones en las llamadas a beginTransaction() y commit(), te aseguras de que nadie más pueda ver los cambios hasta que se completen. Si ocurre un error, el bloque catch puede revertir todos los cambios que han ocurrido desde el inicio de la transacción e imprimir un mensaje de error.
No es necesario realizar actualizaciones dentro de una transacción. También puede emitir consultas complejas para extraer datos y crear más actualizaciones y consultas utilizando esa información. Cuando una transacción está activa, se garantiza que otros no puedan realizar cambios mientras el trabajo está en progreso. En realidad, esto no es 100% correcto, pero es una buena introducción si no has oído hablar antes de las transacciones.
★ Declaraciones preparadas y procedimientos almacenados Muchas bases de datos más maduras admiten el concepto de declaraciones preparadas. ¿Qué son las declaraciones preparadas? Puede pensar en las declaraciones preparadas como una plantilla compilada del SQL que desea ejecutar, que se puede personalizar mediante parámetros variables. Las declaraciones preparadas proporcionan dos beneficios principales:
la consulta solo necesita analizarse (o prepararse) una vez, pero puede ejecutarse varias veces con los mismos o diferentes parámetros. Cuando una consulta está lista, la base de datos analiza, compila y optimiza el plan para ejecutar la consulta. Este proceso lleva más tiempo para consultas complejas y puede ralentizar significativamente su aplicación si necesita repetir la misma consulta varias veces con diferentes parámetros. Al utilizar declaraciones preparadas, puede evitar ciclos repetidos de análisis, compilación y optimización. En pocas palabras, las declaraciones preparadas utilizan menos recursos y, por lo tanto, se ejecutan más rápido.
Los parámetros proporcionados a las declaraciones preparadas no necesitan estar entre comillas; Si su aplicación utiliza exclusivamente declaraciones preparadas, puede estar seguro de que no se producirán intrusiones de SQL. (Sin embargo, todavía existe un riesgo si aún basa otras partes de la consulta en entradas que no son de confianza).
Las declaraciones preparadas son tan útiles que PDO en realidad infringe la regla establecida en el Objetivo 4: si el controlador no admite declaraciones preparadas, PDO emulará las declaraciones preparadas.
Ejemplo: ejemplo de aplicación PDO:
<?php
'
;//Tipo de base de datos Oracle usa ODI Para los desarrolladores, que usan diferentes bases de datos, siempre que cambie esto, no es necesario recordar tantas funciones.
nombre de host
$dbName='test';//Base de datos utilizada
$user='root';//Nombre de usuario de conexión de base de datos
$pass='';//Contraseña correspondiente
$dsn="$dbms:host=$host;dbname= $nombreBd";
clasedbextiendePDO{
función pública__construcción(){
intentar{
parent::__construct("$GLOBALS[dsn]",$GLOBALS['usuario'],$GLOBALS['pass']);
}catch(PDOException$e){
die("Error: ".$e->__toString()."<br/>");
}
}
consulta de función final pública ($ sql) {
intentar{
returnparent::query($this->setString($sql));
}catch(PDOException$e){
die("Error: ".$e->__toString()."<br/>");
}
}
privatefinalfunctionsetString($sql){
echo "Quiero procesar $sql";
devolver$sql;
}
}
$db=newdb();
$db->setAttribute(PDO::ATTR_CASE,PDO::CASE_UPPER);
foreach($db->query('SELECCIONAR * de xxxx_menu')as$fila){
print_r($fila);
}
$db->exec('BORRAR DE `xxxx_menu` donde mid=43');
?>