introducción pdo

137
Introducción La extensión Objetos de Datos de PHP (PDO por sus siglás en inglés) define un interfaz ligera para poder acceder a bases de datos en PHP. Cada controlador de bases de datos que implemente la interfaz PDO puede exponer características específicas de la base de datos, como las funciones habituales de la extensión. Obsérvese que no se puede realizar ninguna de las funciones de la bases de datos utilizando la extensión PDO por sí misma; se debe utilizar un controlador de PDO específico de la base de datos para tener acceso a un servidor de bases de datos. PDO proporciona una capa de abstracción de acceso a datos, lo que significa que, independientemente de la base de datos que se esté utilizando, se usan las mismas funciones para realizar consultas y obtener datos. PDO noproporciona una abstracción de bases de datos; no reescribe SQL ni emula características ausentes. Se debería usar una capa de abstracción totalmente desarrollada si fuera necesaria tal capacidad. PDO viene con PHP 5.1, y está disponible como una extensión PECL para PHP 5.0; PDO requiere las características nuevas de OO del núcleo de PHP 5, por lo que no se ejecutará con versiones anteriores de PHP. Constantes predefinidas Estas constantes están definidas por esta extensión y estarán disponibles sólo cuando la extensión haya sido compilada con PHP, o bien sea cargada dinámicamente en ejecución. Advertencia PDO utiliza constantes de clase desde PHP 5.1. Las versiones anteriores usan constantes globales bajo la forma PDO_PARAM_BOOL. PDO::PARAM_BOOL (integer )

Upload: douglas-enrique-leal-pedreanez

Post on 08-Aug-2015

756 views

Category:

Documents


4 download

TRANSCRIPT

Page 1: Introducción pdo

Introducción

La extensión Objetos de Datos de PHP (PDO por sus siglás en inglés) define un interfaz

ligera para poder acceder a bases de datos en PHP. Cada controlador de bases de datos que

implemente la interfaz PDO puede exponer características específicas de la base de datos, como

las funciones habituales de la extensión. Obsérvese que no se puede realizar ninguna de las

funciones de la bases de datos utilizando la extensión PDO por sí misma; se debe utilizar

un controlador de PDO específico de la base de datos para tener acceso a un servidor de

bases de datos.

PDO proporciona una capa de abstracción de acceso a datos, lo que significa que,

independientemente de la base de datos que se esté utilizando, se usan las mismas funciones

para realizar consultas y obtener datos. PDO noproporciona una abstracción de bases de

datos; no reescribe SQL ni emula características ausentes. Se debería usar una capa de

abstracción totalmente desarrollada si fuera necesaria tal capacidad.

PDO viene con PHP 5.1, y está disponible como una extensión PECL para PHP 5.0; PDO

requiere las características nuevas de OO del núcleo de PHP 5, por lo que no se ejecutará con

versiones anteriores de PHP.

Constantes predefinidas

Estas constantes están definidas por esta extensión y estarán disponibles sólo cuando la

extensión haya sido compilada con PHP, o bien sea cargada dinámicamente en ejecución.

Advertencia

PDO utiliza constantes de clase desde PHP 5.1. Las versiones anteriores usan constantes

globales bajo la forma PDO_PARAM_BOOL.

PDO::PARAM_BOOL (integer)

Representa un tipo de dato booleano.

PDO::PARAM_NULL (integer)

Representa el tipo de dato NULL de SQL.

PDO::PARAM_INT (integer)

Representa el tipo de dato INTEGER de SQL .

PDO::PARAM_STR (integer)

Representa el tipo de dato CHAR, VARCHAR de SQL, u otro tipo de datos de cadena.

PDO::PARAM_LOB (integer)

Representa el tipo de dato LOB (objeto grande) de SQL.

PDO::PARAM_STMT (integer)

Representa un tipo de conjunto de registros. No está admitido actualmente por ningún

controlador.

PDO::PARAM_INPUT_OUTPUT (integer)

Page 2: Introducción pdo

Especifica que el parámetro es de entrada/salida (INOUT) para un procedimiento

almacenado. Se debe realizar un OR a nivel de bits con un tipo de datos

PDO::PARAM_* explícito.

PDO::FETCH_LAZY (integer)

Especifica que el método de obtención debe devolver cada fila como un objeto con los

nombres de las variables que se corresponden a los nombres de las columnas

devueltos en el conjunto de resultados.PDO::FETCH_LAZY crea los nombres de las

variables del objeto a medida que se acceden a ellas. No es válida dentro

de PDOStatement::fetchAll().

PDO::FETCH_ASSOC (integer)

Especifica que el método de obtención debe devolver cada fila como un array

indexado por los nombres de las columnas devueltos en el correspondiente conjunto

de resultados. Si éste contiene múltiples columnas con el mismo

nombre, PDO::FETCH_ASSOC devuelve un único valor por nombre de columna.

PDO::FETCH_NAMED (integer)

Especifica que el método de obtención debe devolver cada fila como un array

indexado por los nombres de las columnas devueltos en el correspondiente conjunto

de resultados. Si éste contiene múltiples columnas con el mismo

nombre, PDO::FETCH_NAMED devuelve un array de valores por nombre de columna.

PDO::FETCH_NUM (integer)

Especifica que el método de obtención debe devolver cada fila como un array

indexado por los números de columna devueltos en el correspondiente conjunto de

resultados, comenzando por la columna 0.

PDO::FETCH_BOTH (integer)

Especifica que el método de obtención debe devolver cada fila como un array

indexado tanto por los nombres como por los números de las columnas devueltos en

el correspondiente conjunto de resultados, comenzando por la columna 0.

PDO::FETCH_OBJ (integer)

Especifica que el método de obtención debe devolver cada fila como un objeto con los

nombres de sus propiedades correspondientes a los nombres de las columnas

devueltos en el conjunto de resultados.

PDO::FETCH_BOUND (integer)

Especifica que el método de obtención debe devolver TRUE y asignar los valores de

las columnas del conjunto de resultados a las variables de PHP a las cuales están

vinculadas con los

métodosPDOStatement::bindParam() o PDOStatement::bindColumn().

PDO::FETCH_COLUMN (integer)

Page 3: Introducción pdo

Especifica que el método de obtención debe devolver una única columna solicitada de

la siguiente fila del conjunto de resultados.

PDO::FETCH_CLASS (integer)

Especifica que el método de obtención debe devolver una nueva instancia de la clase

solicitada, haciendo corresponder las columnas con los nombres de las propiedades

de la clase.

Nota: El método mágico __set() se invoca si la propiedad no existe en la clase

solicitada.

PDO::FETCH_INTO (integer)

Especifica que el método de obtencion debe actualizar una instancia existente de la

clase solicitada, haciendo corresponder las columnas con los nombres de las

propiedades de la clase.

PDO::FETCH_FUNC (integer)

Permite personalizar completamente la forma en que los datos son tratados al vuelo

(únicamente válida dentro de PDOStatement::fetchAll()).

PDO::FETCH_GROUP (integer)

Grupo devuelto según valores. Usualmente combinada

con PDO::FETCH_COLUMN o PDO::FETCH_KEY_PAIR.

PDO::FETCH_UNIQUE (integer)

Obtener solamente los valores únicos.

PDO::FETCH_KEY_PAIR (integer)

Obtener un resultado de dos columnas como un array donde la primera columna es la

clave y la segunda el valor. Disponible desde PHP 5.2.3.

PDO::FETCH_CLASSTYPE (integer)

Determinar el nombre de la clase desde el valor de la primera columna.

PDO::FETCH_SERIALIZE (integer)

Igual que PDO::FETCH_INTO salvo que el objeto es proporcionado como una cadena

serializada. Disponible desde PHP 5.1.0.

PDO::FETCH_PROPS_LATE (integer)

Disponible desde PHP 5.2.0

PDO::ATTR_AUTOCOMMIT (integer)

Si este valor es FALSE, PDO intenta descativar la autoconsigna de forma que la

conexión comience una transacción.

PDO::ATTR_PREFETCH (integer)

Establecer el tamaño de la precarga permite obtener un equilibrio entre rapidez y uso

de memoria para la aplicación. No todas las combinaciones base de datos/controlador

Page 4: Introducción pdo

admiten establecer el tamaño de la precarga. Un valor más grande de precarga da

como resultado un aumento del rendimiento a costa de un mayor uso de memoria.

PDO::ATTR_TIMEOUT (integer)

Establece el valor del tiempo de espera, en segundos, para las comunicaciones con la

base de datos.

PDO::ATTR_ERRMODE (integer)

Véase la sección Errores y su manejo para obtener más información sobre este

atributo.

PDO::ATTR_SERVER_VERSION (integer)

Este es un atributo de sólo lectura; devolverá información sobre la versión del servidor

de bases de datos al que está conectado PDO.

PDO::ATTR_CLIENT_VERSION (integer)

Este es un atributo de sólo lectura; devolverá información sobre la versión de las

bibliotecas cliente que el controlador de PDO está usando.

PDO::ATTR_SERVER_INFO (integer)

Este es un atributo de sólo lectura; devolverá alguna metainformación sobre el servidor

de bases de datos al que está conectado PDO.

PDO::ATTR_CONNECTION_STATUS (integer)

PDO::ATTR_CASE (integer)

Forzar a los nombres de las columnas al uso de mayúsculas/minúsculas especificado

por las constantesPDO::CASE_*.

PDO::ATTR_CURSOR_NAME (integer)

Obtener o establecer el nombre a usar para un cursor. Es más útil cuando se utilizan

cursores desplazables y actualizacioines posicionadas.

PDO::ATTR_CURSOR (integer)

Selecciona el tipo de cursor. PDO actualmente

admite PDO::CURSOR_FWDONLY y PDO::CURSOR_SCROLL. Cíñase

a PDO::CURSOR_FWDONLY a menos que sepa que necesite un cursor desplazable.

PDO::ATTR_DRIVER_NAME (string)

Devuelve el nombre del controlador.

Ejemplo #1 Usar PDO::ATTR_DRIVER_NAME

<?php

if ($db->getAttribute(PDO::ATTR_DRIVER_NAME) == 'mysql') {

  echo "Ejecutándose sobre mysql; hacer algo específico de mysql aquí\n";

}

?>

PDO::ATTR_ORACLE_NULLS (integer)

Page 5: Introducción pdo

Convertir cadenas vacías a valores NULL de SQL en la obtención de datos.

PDO::ATTR_PERSISTENT (integer)

Solicitar una conexión persistente, en vez de crear una nueva conexión.

Véase Conexiones y su administración para obtener más información sobre este

atributo.

PDO::ATTR_STATEMENT_CLASS (integer)

PDO::ATTR_FETCH_CATALOG_NAMES (integer)

Anteponer el nombre del catálogo contenido a cada nombre de columna devuelto en el

conjunto de resultados. El nombre del catálogo y el nombre de columna están

separados por el carácter punto (.). El soporte de este atributo es a nivel del

controlador; podría no estar admitido por el controlador que usted utilice.

PDO::ATTR_FETCH_TABLE_NAMES (integer)

Anteponer el nombre de la tabla contenida a cada nombre de columna devuelto en el

conjunto de resultados. El nombre de la tabla y el nombre de columna están

separados por el carácter punto (.). El soporte de este atributo es a nivel del

controlador; podría no estar admitido por el controlador que usted utilice.

PDO::ATTR_STRINGIFY_FETCHES (integer)

PDO::ATTR_MAX_COLUMN_LEN (integer)

PDO::ATTR_DEFAULT_FETCH_MODE (integer)

Disponible desde PHP 5.2.0.

PDO::ATTR_EMULATE_PREPARES (integer)

Disponible desde PHP 5.1.3.

PDO::ERRMODE_SILENT (integer)

No emitir ningún error o excepción si ocurrieran. El desarrollador es responsable de

comprobar explícitamente los errores. Este es el modo predeterminado. Véase Errores

y su manejo para obtener más información sobre este atributo.

PDO::ERRMODE_WARNING (integer)

Emitir un mensaje de tipo E_WARNING de PHP si ocurre algún error. Véase Errores y

su manejo para obtener más información sobre este atributo.

PDO::ERRMODE_EXCEPTION (integer)

Lanzar una excepción de tipo PDOException si ocurre algún error. Véase Errores y su

manejo para obtener más información sobre este atributo.

PDO::CASE_NATURAL (integer)

Dejar los nombres de las columnas tal como son devueltas por el controlador de la

base de datos.

PDO::CASE_LOWER (integer)

Forzar a los nombres de las columnas a estar en minúsculas.

Page 6: Introducción pdo

PDO::CASE_UPPER (integer)

Fuerza a los nombres de las columnas a estar en mayúsculas.

PDO::NULL_NATURAL (integer)

PDO::NULL_EMPTY_STRING (integer)

PDO::NULL_TO_STRING (integer)

PDO::FETCH_ORI_NEXT (integer)

Obtener la siguiente fila del conjunto de resultados. Únicamente válida para cursores

desplazables.

PDO::FETCH_ORI_PRIOR (integer)

Obtener la fila anterior del conjunto de resultados. Únicamente válida para cursores

desplazables.

PDO::FETCH_ORI_FIRST (integer)

Obtener la primera fila del conjunto de resultados. Únicamente válida para cursores

desplazables.

PDO::FETCH_ORI_LAST (integer)

Obtener la última fila del conjunto de resultados. Únicamente válida para cursores

desplazables.

PDO::FETCH_ORI_ABS (integer)

Obtener la fila solicitada mediante el número de fila del conjunto de resultados.

Únicamente válida para cursores desplazables.

PDO::FETCH_ORI_REL (integer)

Obtener la fila solicitada mediante la posición relativa de la posición actual del cursor

del conjunto de resultados. Únicamente válida para cursores desplazables.

PDO::CURSOR_FWDONLY (integer)

Crear un objeto PDOStatement con un cursor de sólo avance. Este es la elección del

cursor predeterminada, ya que es el patrón de acceso a datos más rápido y común en

PHP.

PDO::CURSOR_SCROLL (integer)

Crear un objeto PDOStatement con un cursor desplazable. Pase las

constantes PDO::FETCH_ORI_*para controlar las filas obtenidas del conjunto de

resultados.

PDO::ERR_NONE (string)

Corresponde al SQLSTATE '00000', el cual significa que la sentencia SQL fue

ejecutada con éxito, sin errores ni advertencias. Esta constante sirve para la

comprobación cómoda de PDO::errorCode() oPDOStatement::errorCode() para

determinar si ha ocurrido algún error. En cualquier caso, usualmente se sabrá si este

Page 7: Introducción pdo

es el caso examinando el código devuelto por el método que provocó la condición de

error.

PDO::PARAM_EVT_ALLOC (integer)

Evento de asignación

PDO::PARAM_EVT_FREE (integer)

Evento de desasigncación

PDO::PARAM_EVT_EXEC_PRE (integer)

Evento provocado antes de la ejecución de una sentencia preparada.

PDO::PARAM_EVT_EXEC_POST (integer)

Evento provocado después de la ejecución de una sentencia preparada.

PDO::PARAM_EVT_FETCH_PRE (integer)

Evento provocado antes de la obtención de un resultado de un conjunto de resultados.

PDO::PARAM_EVT_FETCH_POST (integer)

Evento provocado después de la obtención de un resultado de un conjunto de

resultados.

PDO::PARAM_EVT_NORMALIZE (integer)

Evento provocado durante el resistro de un parámetro vinculado, permitiendo al

controlador normalizar el nombre del parámetro.

   add a noteUser Contributed Notes Constantes predefinidas - [2 notes]

up

down

0

sam at xnet dot tk

5 hours ago

It should be noted that PDO::FETCH_CLASS will call the constructor *after* setting the

values (or calling __set).

up

down

0

Axeia

2 years ago

If you're reading in information from an array to use in a prepared statement you may

find the following function useful.

<?php

Page 8: Introducción pdo

function getPDOConstantType( $var )

{

  if( is_int( $var ) )

    return PDO::PARAM_INT;

  if( is_bool( $var ) )

    return PDO::PARAM_BOOL;

  if( is_null( $var ) )

    return PDO::PARAM_NULL;

  //Default  

  return PDO::PARAM_STR;

}

?>

Conexiones y su administración

Las conexiones se establecen creando instancias de la clase base PDO. No importa el

controlador que se utilice; siempre se usará el nombre de la clase PDO. El constructor acepta

parámetros para especificar el origen de datos (conocido como DSN) y, opcionalmente, el

nombre de usuario y la contraseña (si la hubiera).

Ejemplo #1 Conectarse a MySQL

<?php

$gbd = new PDO('mysql:host=localhost;dbname=test', $usuario, $contraseña);

?>

Si hubieran errores de conexión, se lanzará un objeto de tipo PDOException. Se puede

capturar la excepción si fuera necesario manejar la condición del error, o se podría optar por

dejarla en manos de un gestor de excepciones global de una aplicación configurado

mediante set_exception_handler().

Ejemplo #2 Manejo de errores de conexión

<?php

try {

    $gbd = new PDO('mysql:host=localhost;dbname=test', $usuario, $contraseña);

    foreach($gbd->query('SELECT * from FOO') as $fila) {

        print_r($fila);

    }

    $gbd = null;

Page 9: Introducción pdo

} catch (PDOException $e) {

    print "¡Error!: " . $e->getMessage() . "<br/>";

    die();

}

?>

Advertencia

Si la aplicación no captura la excepción lanzada por el constructor de PDO, la acción

predeterminada que toma el motor zend es la de finalizar el script y mostrar información de

rastreo. Esta información probablemente revelará todos los detalles de la conexión a la base de

datos, incluyendo el nombre de usuario y la contraseña. Es su responsabilidad capturar esta

excepción, ya sea explícitamente (con una sentenciacatch) o implícitamente por medio

de set_exception_handler().

Una vez realizada con éxito una conexión a la base de datos, será devuelta una instancia de la

clase PDO al script. La conexión permanecerá activa durante el tiempo de vida del objeto PDO.

Para cerrar la conexión, es necesario destruir el objeto asegurándose de que todas las referencias

a él existentes sean eliminadas (esto se puede hacer asignando NULL a la variable que contiene

el objeto). Si no se realiza explícitamente, PHP cerrará automáticamente la conexión cuando el

script finalice.

Ejemplo #3 Cerrar una conexión

<?php

$gbd = new PDO('mysql:host=localhost;dbname=test', $usuario, $contraseña);

// Use la conexión aquí

// ya se ha terminado; la cerramos

$gbd = null;

?>

Muchas aplicaciones web se beneficiarán del uso de conexiones persistentes a servidores de

bases de datos. Las conexiones persistentes no son cerradas al final del script, sino que son

almacenadas en caché y reutilizadas cuando otro script solicite una conexión que use las mismas

credenciales. La caché de conexiones persistentes permite evitar la carga adicional de establecer

una nueva conexión cada vez que un script necesite comunicarse con la base de datos, dando

como resultado una aplicación web más rápida.

Ejemplo #4 Conexiones persistentes

<?php

$gbd = new PDO('mysql:host=localhost;dbname=test', $usuario, $contraseña, array(

    PDO::ATTR_PERSISTENT => true

Page 10: Introducción pdo

));

?>

Nota:

Si se quiere usar conexiones persistentes, se deberá establecer PDO::ATTR_PERSISTENT en

las opciones del array del controlador pasado al constructor de PDO. Si este atributo se

establece con PDO::setAttribute()después de la instanciación del objeto, el controlador no

utilizará conexiones persistentes.

Nota:

Si se usa el controlador PDO y las bibliotecas ODBC admiten el agrupamiento de conexiones

ODBC (unixODBC y Windows lo hacen; podrían haber más), se recomienda no utilizar las

conexiones persistentes de PDO, y, en su lugar, dejar el almacenamiento en caché de

conexiones a la capa del agrupamiento de conexiones de ODBC. El agrupamiento de

conexiones de ODBC se comparte con otros módulos en el proceso; si se le indica a PDO que

almacene en caché la conexión, entonces dicha conexión nunca será devuelta al agrupamiento

de conexiones de ODBC, dando como resultado la creación de conexiones adicionales para

servir a los demás módulos.

Transacciones y 'auto-commit' Constantes predefinidas

[edit] Last updated: Fri, 25 Jan 2013

 

   add a noteUser Contributed Notes Conexiones y su administración - [6 notes]

up

down

2

jak dot spalding at gmail dot com

1 year ago

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.

up

down

1

Page 11: Introducción pdo

neville at whitespacers dot com

3 years ago

To avoid exposing your connection details should you fail to remember to catch any

exception thrown by the PDO constructor you can use the following class to implicitly

change the exception handler temporarily.

<?php

Class SafePDO extends PDO {

 

        public static function exception_handler($exception) {

            // Output the exception details

            die('Uncaught exception: ', $exception->getMessage());

        }

 

        public

function __construct($dsn, $username='', $password='', $driver_options=array()) {

            // Temporarily change the PHP exception handler while we . . .

            set_exception_handler(array(__CLASS__, 'exception_handler'));

            // . . . create a PDO object

            parent::__construct($dsn, $username, $password, $driver_options);

            // Change the exception handler back to whatever it was before

            restore_exception_handler();

        }

}

// Connect to the database with defined constants

$dbh = new SafePDO(PDO_DSN, PDO_USER, PDO_PASSWORD);

?>

up

down

0

Page 12: Introducción pdo

alvaro at demogracia dot com

1 year ago

On connection errors, the PDO constructor seems to do two things no matter your

PDO::ATTR_ERRMODE setting:

1. Trigger a warning

2. Throw a PDOException

If you set the PDO::ATTR_ERRMODE parameter, it will only take effect on further

operations.

up

down

-1

angela

2 years ago

I spent hours today trying to get my portable wamp to update a database, using

localhost:800 and port 3307 for mysql. For it to work I needed to adjust the connect()

instruction as described:

$dsn = "mysql:host=127.0.0.1;port=3307;dbname=mydatabase";

up

down

0

ekkart at ekkart dot de

2 years ago

In order to set the encoding of the database connection, use the exec function:

<?php

try {

    $dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);

    $dbh->exec("SET CHARACTER SET utf8");

    $dbh = null;

} catch (PDOException $e) {

    print "Error!: " . $e->getMessage() . "<br/>";

    die();

}

?>

up

down

Page 13: Introducción pdo

-1

dan dot franklin at pearson dot com

4 years ago

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.

Transacciones y 'auto-commit'

Una vez realizada una conexión a través de PDO, es necesario comprender cómo PDO gestiona

las transacciones antes de comenzar a realizar consultas. Si no se han manejado anteriormente

transacciones, estas ofrecen cuatro características principales: Atomicidad, Consistencia,

Aislamiento y Durabilidad (ACID por sus siglas en inglés). En términos sencillos, cualquier

trabajo llevado a cabo en una transacción, incluso si se hace por etapas, se garantiza que será

aplicado a la base de datos de forma segura, y sin interferencia de otras conexiones, cuando sea

consignado ('commit'). El trabajo transaccional puede también ser deshecho automáticamente

bajo petición (siempre y cuando no se haya consignado), lo que hace más sencillo el manejo de

errores en los scripts.

Las transacciones son implementadas típicamente para hacer que el lote de cambios se apliquen

a la vez; esto tiene el buen efecto secundario de mejorar drásticamente la eficiencia de las

actualizaciones. En otras palabras, las transacciones pueden hacer los scripts más rápidos y

potencialmente más robustos (aún así es necesario usarlas correctamente para obtener ese

beneficio).

Desafortunadamente, no todas las bases de datos admiten transacciones, por lo que PDO

necesita ser ejecutado en lo es conocido como el modo "auto-commit" cuando se abra por

primera vez la conexión. El modo auto-commit significa que toda consulta que se ejecute tiene

su propia transacción implícita, si la base de datos lo admite, o ninguna transacción si la base de

datos no las admite. Si fuera necesario el uso de transacciones, se debe usar el

método PDO::beginTransaction() para iniciar una. Si el controlador subyacente no admite

transacciones, se lanzará una PDOException (independientemente de la configuración del

manejo de errores: esto es siempre una condición de error serio). Una vez que se esté en una

transacción, se puede usarPDO::commit() o PDO::rollBack() para finalizarla, dependiendo del

éxito del código que se ejecute durante la transacción.

Advertencia

PDO sólo comprueba las capacidades de la transacción al nivel del controlador. Si una cierta

condición en tiempo de ejecución implica que las transacciones no estén

Page 14: Introducción pdo

disponibles, PDO::beginTransaction() seguirá devolviendo TRUE sin ninún error si el

servidor de bases de datos acepta la solicitud de iniciar una transacción.

Un ejemplo de esto podría ser el intentar usar transacciones en tablas MyISAM en una base de

datos MySQL.

Cuando el script finaliza o cuando una conexión está a punto de ser cerrada, si existe una

transacción pendiente, PDO la revertirá automáticamente. Esto es una medida de seguridad que

ayuda a evitar inconsistencia en los casos donde el script finaliza inesperadamente (si no

consignó la transacción, se asume que algo salió mal, con lo cual se realiza la reversión para la

seguridad de los datos).

Advertencia

La reversión automática sólo ocurre si se inicia una transacción a través

dePDO::beginTransaction(). Si se ejecuta manualmente una consulta que inicie una

transacción, PDO no tiene forma de conocer algo acerca de ésta y, por tanto, no puede revertirla

si algo sale mal.

Ejemplo #1 Ejecución de un lote en una transacción

En el siguiente ejemplo, se asume que se ha creado un conjunto de entradas para un nuevo

empleado, al cual se le ha asignado el número de ID 23. Además de introducir los datos básicos

de una persona, también es necesario registrar su sueldo. Es bastante simple hacer dos

actualizaciones independientes, pero encerrándolas en las

llamadas PDO::beginTransaction() y PDO::commit(), se garantiza que nadie más será capaz

de ver los cambios hasta que se hayan completado. Si algo sale mal, el bloque catch revierte los

cambios realizados desde que se creó la transacción, y luego imprime un mensaje de error.

<?php

try {

  $gbd = new PDO('odbc:SAMPLE', 'db2inst1', 'ibmdb2', 

      array(PDO::ATTR_PERSISTENT => true));

  echo "Conectado\n";

} catch (Exception $e) {

  die("No se pudo conectar: " . $e->getMessage());

}

try {  

  $gbd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

  $gbd->beginTransaction();

  $gbd->exec("insert into staff (id, first, last) values (23, 'Joe', 'Bloggs')");

  $gbd->exec("insert into salarychange (id, amount, changedate) 

Page 15: Introducción pdo

      values (23, 50000, NOW())");

  $gbd->commit();

  

} catch (Exception $e) {

  $gbd->rollBack();

  echo "Fallo: " . $e->getMessage();

}

?>

No hay límite en la realización de actualizaciones en una transacción; también es posible

ejecutar consultas complejas para extraer datos, y posiblemente usar esa información para

construir más actualizaciones y consultas; mientras que la transacción esté activa, se garantiza

que nadie más puede realizar cambios mientras se esté en mitad del trabajo. Para más

información sobre transacciones, consulte la documentación proporcionada por su servidor de

base de datos.

   add a noteUser Contributed Notes Transacciones y 'auto-commit' - [2 notes]

up

down

2

pasamio at gmail dot com

3 months ago

Typically data definition language clauses (DDL) will trigger the database engine to

automatically commit:

http://dev.mysql.com/doc/refman/5.0/en/implicit-commit.html

Many other databases (e.g. Oracle) will implicitly commit before and after running DDL

statements.

up

down

-1

josh dot ribakoff at gmail dot com

2 years ago

PDO seems to differ from the other mysql libraries in that it will revert to auto-commit

mode if you are issuing certain types of queries on certain drivers (Ex. DROP TABLE)

Page 16: Introducción pdo

Sentencias preparadas y procedimientos almacenados

Muchas de las bases de datos más maduras admiten el concepto de sentencias preparadas. Estas

pueden definirse como un tipo de plantillas compiladas para SQL que las aplicaciones quieren

ejecutar, que pueden ser personalizadas usando parámetros de variables. Las sentencias

preparadas ofrecen dos grandes beneficios:

La consulta sólo necesita ser analizada (o preparada) una vez, pero puede ser ejecutada

múltiples veces con los mismos o diferentes parámetros. Cuando la consulta es preparada, la

base de datos analizará, compilará y optimizará su plan para ejecutarla. Para consultas

complejas, este proceso puede tomar suficiente tiempo como para que ralentice notablemente

una aplicación si fuera necesario repetir la misma consulta muchas veces con los mismos

parámetros. Usando una sentencia preparada, la aplicación evita repetir el ciclo de

análisis/compilación/optimización. Esto significa que las sentencias preparadas usan menos

recursos y se ejecutan más rápidamente.

Los parámetros para las sentencias preparadas no necesitan estar entrecomillados; el controlador

automáticamente se encarga de esto. Si una aplicación usa exclusivamente sentencias

preparadas, el desarrollador puede estar seguro de que no ocurrirán inyecciones SQL (sin

embargo, si otras partes de la consulta se construyen con datos de entrada sin escapar, las

inyecciones SQL pueden ocurrir).

Las sentencias preparadas son tan útiles que son la única característica que PDO emulará para

los controladores que no las admitan. Esto asegura que una aplicación sea capaz de usar el

mismo paradigma de acceso a datos independientemente de las capacidades de la base de datos.

Ejemplo #1 Inserciones reiteradas usando sentencias preparadas

Este ejemplo realiza dos consultas de tipo INSERT sustituyendo name y value por los valores

correspondientes.

<?php

$sentencia = $gbd->prepare("INSERT INTO REGISTRY (name, value) VALUES (:nam

e, :value)");

$sentencia->bindParam(':name', $nombre);

$sentencia->bindParam(':value', $valor);

// insertar una fila

$nombre = 'uno';

$vavalorlue = 1;

$sentencia->execute();

// insertar otra fila con diferentes valores

$nombre = 'dos';

Page 17: Introducción pdo

$valor = 2;

$stmt->execute();

?>

Ejemplo #2 Inserciones reiteradas usando sentencias preparadas

Este ejemplo realiza dos consultas de tipo INSERT sustituyendo name y value por el

parámetro de sustitución ? posicional.

<?php

$sentencia = $gbd->prepare("INSERT INTO REGISTRY (name, value) VALUES (?, ?)

");

$sentencia->bindParam(1, $nombre);

$sentencia->bindParam(2, $valor);

// insertar una fila

$nombre = 'uno';

$valor = 1;

$sentencia->execute();

// insertar otra fila con diferentes valores

$nombre = 'dos';

$valor = 2;

$sentencia->execute();

?>

Ejemplo #3 Obtener datos usando sentencias preparadas

Este ejemplo obtiene datos basándose en un valor de clave proporcionado por un formulario.

Los datos de usuario son automáticamente entrecomillados, con lo cual no hay riesgo de un

ataque por inyección SQL.

<?php

$sentencia = $gbd->prepare("SELECT * FROM REGISTRY where name = ?");

if ($sentencia->execute(array($_GET['name']))) {

  while ($fila = $sentencia->fetch()) {

    print_r($fila);

  }

}

?>

Si el controlador de la base de datos lo admite, una aplicación podría también vincular

parámetros para salida y para entrada. Los parámetros de salida son típicamente usados para

recuperar valores de procedimientos almacenados. Los parámetros de salida son ligeramente

Page 18: Introducción pdo

más complejos de usar que los de entrada, de manera que el desarrollador debe saber lo grande

que podría ser un parámetro dado cuando se vincula. Si el valor resulta ser más grande que el

tamaño que indica, se emitirá un error.

Ejemplo #4 Llamar a un procedimiento almacenado con un parámetro de salida

<?php

$sentencia = $gbd->prepare("CALL sp_returns_string(?)");

$sentencia->bindParam(1, $valor_devuleto, PDO::PARAM_STR, 4000); 

// llamar al procedimiento almacenado

$sentencia->execute();

print "El procedimiento devolvió $valor_devuleto\n";

?>

Los desarrolladores podrían también especificar parámetros que contienen valores tanto de

entrada como de salida; la sintaxis es similar a la de los parámetros de salida. En el siguiente

ejemplo, la cadena 'hola' es pasada al procedimiento almacenado, y cuando éste finaliza, 'hola'

es reemplazada con el valor de retorno del procedimiento.

Ejemplo #5 Llamar a un procedimiento almacenado con un parámetro de

entrada/salida

<?php

$sentencia = $gbd->prepare("CALL sp_takes_string_returns_string(?)");

$valor = 'hola';

$sentencia->bindParam(1, $valor, PDO::PARAM_STR|

PDO::PARAM_INPUT_OUTPUT, 4000); 

// llamar al procedimiento almacenado

$sentencia->execute();

print "procedure returned $valor\n";

?>

Ejemplo #6 Uso inválido de un parámetro de sustitución

<?php

$sentencia = $gbd->prepare("SELECT * FROM REGISTRY where name LIKE '%?%'");

$sentencia->execute(array($_GET['name']));

// los parámetros de sustitución deben usarse en el lugar del valor completo

$sentencia = $gbd->prepare("SELECT * FROM REGISTRY where name LIKE ?");

Page 19: Introducción pdo

$sentencia->execute(array("%$_GET[name]%"));

?>

Errores y su manejo Transacciones y 'auto-commit'

[edit] Last updated: Fri, 25 Jan 2013

 

   add a noteUser Contributed Notes Sentencias preparadas y procedimientos

almacenados - [5 notes]

up

down

7

adam at pyramidpower dot com dot au

2 years ago

Note that when using name parameters with bindParam, the name itself, cannot

contain a dash '-'. 

example:

<?php

$stmt = $dbh->prepare ("INSERT INTO user (firstname, surname) VALUES (:f-

name, :s-name)");

$stmt -> bindParam(':f-name', 'John');

$stmt -> bindParam(':s-name', 'Smith');

$stmt -> execute();

?>

The dashes in 'f-name' and 's-name' should be replaced with an underscore or no dash

at all.

See http://bugs.php.net/43130

Adam

up

down

1

Page 20: Introducción pdo

oldmoscow dot mail dot ru

2 years ago

Note for MySQL: to use input/output parameters for stored procedures with PDO use

PDO.Query() statement. 

For example: 

<?php 

$dbh->query("CAST

SomeStoredProcedure($someInParameter1, $someInParameter2,

@someOutParameter)"); 

$dbh->query("SELECT @someOutParameter"); 

?> 

Or, if you want very much to use PDO.Prepare(), insert "SELECT

@someOutParameter" in your stored procedure and then use: 

<?php 

$stmt = $dbh->prepare("CAST SomeStoredProcedure(?, ?)"); 

$stmt ->execute(array($someInParameter1, $someInParameter2)); 

?>

up

down

1

Anonymous

2 years ago

Note for MySQL: to use input/output parameters for stored procedures with PDO use

PDO.Query() statement. 

For example: 

<?php 

$dbh->query("CAST

SomeStoredProcedure($someInParameter1, $someInParameter2,

@someOutParameter)"); 

$dbh->query("SELECT @someOutParameter"); 

?> 

Or, if you want very much to use PDO.Prepare(), insert "SELECT

Page 21: Introducción pdo

@someOutParameter" in your stored procedure and then use: 

<?php 

$stmt = $dbh->prepare("CAST SomeStoredProcedure(?, ?)"); 

$stmt ->execute(array($someInParameter1, $someInParameter2)); 

?>

up

down

0

mackwic at gmail dot com

3 years ago

You have to make attention to the parameters send to the method.

We can imagine that a request like that can work:

<?php 

$query = 'SELECT ? FROM ? WHERE id = ?';

?>

But in fact, it's a hijack of prepared query, which MUST be used *ONLY* to change the

condition (here the last '?' ).

You do not send my_table.my_row or my_scheme.my_table because this parameters

are essentials to optimize the query before execution.

Other thing: prepared query can not be serialized to reuse it some time later. For that

you can use a mask (http://fr2.php.net/singleton)

A prepared query is temporary.

up

down

-4

frame at dynamiccreated dot de

4 months ago

Keep in mind, after creating a table on same driver instance you should re-create your

prepared statement too. 

If you will not do you will get a nice message "database schema has changed" with

error code "00000" which indicates that is not an error but it is - at least working with

SQlite no data is returned on SELECT-clause.

Page 22: Introducción pdo

Errores y su manejo

PDO ofrece tres estrategias diferentes de manejar errores, para adaptarse a su estilo de

desarrollo de aplicaciones.

PDO::ERRMODE_SILENT

Este es el modo predeterminado. PDO simplemente establecerá él mismo el código de error para

su inspección usando los métodos PDO::errorCode() y PDO::errorInfo() tanto en objetos de

sentencias como de bases de datos. Si el error resultó de una llamada sobre un objeto de

sentencia, se deberá invocar al

método PDOStatement::errorCode() o PDOStatement::errorInfo() sobre dicho objeto. Si el

error resultó de una llamada sobre un objeto de bases de datos, se deberá invocar, en su lugar, a

los métodos del objeto de bases de datos.

PDO::ERRMODE_WARNING

Además de establecer el código de error, PDO emitirá un mensaje E_WARNING tradicional.

Esta configuración es útil durante la depuración o las pruebas, si lo que se quiere es ver qué

problemas han ocurrido, sin interrumpir el flujo de la aplicación.

PDO::ERRMODE_EXCEPTION

Además de establecer el código de error, el PDO lanzará una excepción de

tipo PDOException y establecerá sus propiedades para reflejar el error y la información del

mismo. Esta configuración también es útil durante la depuración, ya que, de hecho, señalará el

lugar del error del script, apuntando a áreas pontencialmente problemáticas del código

(recuerde: las transacciones son automáticamente revertidas si la excepción causa que finalice el

script).

El modo 'Exception' también es útil porque se puede estructurar el manejo de errores con más

claridad que con el estilo tradicional de advertencias de PHP, y con menos código/anidación que

con la ejecución en modo silencioso y comprobando explícitamente el valor devuelto de cada

llamada a la base de datos.

Véase la referencia de Excepciones para más información sobre Excepciones en PHP.

PDO utiliza el estándar de cadenas de códigos de error SQLSTATE de SQL-92; cada

controlador de PDO es responsable de hacer que correspondan su códigos nativos con los

códigos SQLSTATE apropiados. El métodoPDO::errorCode() devuelve un único código

SQLSTATE. Si fuera necesaria más información específica sobre el error, PDO también ofrece

el método PDO::errorInfo(), que devuelve un array que contiene el código SQLSTATE, el

código de error específico del controlador, y la cadena de error específica.

Ejemplo #1 Crear una instancia de PDO y establecer el modo de error

Page 23: Introducción pdo

<?php

$dsn = 'mysql:dbname=testdb;host=127.0.0.1';

$usuario = 'usuario';

$contraseña = 'contraseña';

try {

    $gbd = new PDO($dsn, $usuario, $contraseña);

    $gbd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

} catch (PDOException $e) {

    echo 'Falló la conexión: ' . $e->getMessage();

}

?>

Objetos grandes (LOBs)

En algún punto de una aplicación, podría ser necesario almacenar datos "grandes" en la base de

datos. Grande típicamente significa "alrededor de 4kb o más", aunque algunas bases de datos

pueden manejar fácilmente hasta 32kb antes de que los datos se consideren "grandes". Los

LOBs (acrónimo de 'Large Objects') pueden ser de texto o binarios. PDO permite trabajar con

este tipo de datos grandes usando el código del tipoPDO::PARAM_LOB en llamadas

a PDOStatement::bindParam() o PDOStatement::bindColumn(). PDO::PARAM_LOBin

dica a PDO que haga corresponder los datos como un flujo, por lo que se pueden manipular

usando la API de flujos de PHP.

Ejemplo #1 Mostrar una imagen desde una base de datos

Este ejemplo vincula un LOB a una variable llamada $lob, y luego lo envía al navegador

usando fpassthru(). Ya que el LOB está representado como un flujo, se pueden usar funciones

tales como fgets(), fread() ystream_get_contents() para manejarlo.

<?php

$bd = new PDO('odbc:SAMPLE', 'db2inst1', 'ibmdb2');

$sentencia = $bd->prepare("select contenttype, imagedata from images where id=?");

$sentencia->execute(array($_GET['id']));

$sentencia->bindColumn(1, $tipo, PDO::PARAM_STR, 256);

$sentencia->bindColumn(2, $lob, PDO::PARAM_LOB);

$sentencia->fetch(PDO::FETCH_BOUND);

header("Content-Type: $tipo");

Page 24: Introducción pdo

fpassthru($lob);

?>

Ejemplo #2 Insertar una imagen en una base de datos

Este ejemplo abre un fichero y pasa el gestor del fichero a PDO para insertarlo como un LOB.

PDO hará todo lo posible para enviar el contenido del fichero a la base de datos de la manera

más eficiente.

<?php

$bd = new PDO('odbc:SAMPLE', 'db2inst1', 'ibmdb2');

$sentencia = $bd->prepare("insert into images (id, contenttype, imagedata) values (?, 

?, ?)");

$id = get_new_id(); // alguna función para asignar un nuevo ID

// se asume que se está ejecutando como parte de un formulario de subidas de fichero

s

// Se puede encontrar más información en la documentación de PHP

$fp = fopen($_FILES['file']['tmp_name'], 'rb');

$sentencia->bindParam(1, $id);

$sentencia->bindParam(2, $_FILES['file']['type']);

$sentencia->bindParam(3, $fp, PDO::PARAM_LOB);

$bd->beginTransaction();

$sentencia->execute();

$bd->commit();

?>

Ejemplo #3 Insertar una imagen en una base de datos: Oracle

Oracle requiere una sintaxis ligeramente diferente para insertar un LOB desde un fichero.

También es esencial que se realice la inserción bajo una transacción, si no, el LOB recién

insertado será consignado con una longitud cero como parte de la consigna implícita que ocurre

cuando la consulta se ejecuta:

<?php

$bd = new PDO('oci:', 'scott', 'tiger');

$sentencia = $bd->prepare("insert into images (id, contenttype, imagedata) " .

"VALUES (?, ?, EMPTY_BLOB()) RETURNING imagedata INTO ?");

$id = get_new_id(); // alguna función para asignar un nuevo ID

Page 25: Introducción pdo

// se asume que se está ejecutando como parte de un formulario de subidas de fichero

s

// Se puede encontrar más información en la documentación de PHP

$fp = fopen($_FILES['file']['tmp_name'], 'rb');

$sentencia->bindParam(1, $id);

$sentencia->bindParam(2, $_FILES['file']['type']);

$sentencia->bindParam(3, $fp, PDO::PARAM_LOB);

$sentencia->beginTransaction();

$sentencia->execute();

$sentencia->commit();

?>

PDO Errores y su manejo

[edit] Last updated: Fri, 25 Jan 2013

 

   add a noteUser Contributed Notes Objetos grandes (LOBs) - [5 notes]

up

down

1

diogoko at gmail dot com

3 years ago

PDOStatement's methods bindParam and bindValue also work with strings, as in: 

<?php 

  $data = file_get_contents($filename); 

  $stmt->bindValue(1, $data, PDO::PARAM_LOB); 

  //... 

?> 

This was the only way I could make it work with PostgreSQL.

up

Page 26: Introducción pdo

down

0

xorinox at gmx dot ch

2 years ago

I find it easier to use stream_get_contens to fetch the data of a lob using the file

handle. 

<?php 

$stmt = $pdo->con->prepare( 'select * from filetable' ); 

$stmt->execute(); 

$res = $stmt->fetchAll( PDO::FETCH_ASSOC ); 

for( $i=0; $i<count($res); $i++ ){ 

  $filename = "C:/tmp/".$res[$i]['FILE_ID'].'.xml'; 

  $content = stream_get_contents( $res[$i]['DATA_FILE'] ); 

  file_put_contents( $filename, $content ); 

?>

up

down

0

Jeremy Cook

2 years ago

There seems to be a bug that affects example 1 above. PDO::PARAM_LOB when

used with pdo::bindColumn() is supposed to return a stream but it returns a string.

Passing this string to fpassthru() then triggers an error with the message 'supplied

argument is not a valid stream resource'. This has been reported in bug #40913. The

work around is to do the following: 

<?php 

$stmt = $db->prepare("select contenttype, imagedata from images where id=?"); 

$stmt->execute(array($_GET['id'])); 

$stmt->bindColumn(1, $type, PDO::PARAM_STR, 256); 

$stmt->bindColumn(2, $lob, PDO::PARAM_LOB); 

$stmt->fetch(PDO::FETCH_BOUND); 

header("Content-Type: $type"); 

Page 27: Introducción pdo

echo($lob); 

?> 

Since the browser is expecting an image after the call to header() writing the string

representation of the binary output with echo() has the same affect as calling

fpassthru().

up

down

0

http://matts.org/

3 years ago

A big gotcha exists for Oracle users.

You have to save CLOB objects using PDO::PARAM_STR, not PDO::PARAM_LOB.

But you MUST send the 4th argument, usually strlen($subject) or you get a LONG

error.

up

down

0

knl at bitflop dot com

4 years ago

I spend a lot of time trying to get this to work, but no matter what I did PDO corrupted

my data.

I finally discovered that I had been using:

$pdo->exec('SET CHARACTER SET utf8');

in the TRY part of my connection script.

This off course doesn't work when you feed binary input to PDO using the parameter

lob.

La clase PDO

(PHP 5 >= 5.1.0, PECL pdo >= 0.1.0)

Page 28: Introducción pdo

Introducción

Representa una conexión entre PHP y un servidor de bases de datos.

Sinopsis de la Clase

PDO {

__construct ( string $dsn [, string $username [, string $password [, array $driver_option

s ]]] )

bool beginTransaction ( void )

bool commit ( void )

mixed errorCode ( void )

array errorInfo ( void )

int exec ( string $statement )

mixed getAttribute ( int $attribute )

static array getAvailableDrivers ( void )

bool inTransaction ( void )

string lastInsertId ([ string $name = NULL ] )

PDOStatement prepare ( string $statement [, array $driver_options = array() ] )

PDOStatement query ( string $statement )

string quote ( string $string [, int $parameter_type = PDO::PARAM_STR ] )

bool rollBack ( void )

bool setAttribute ( int $attribute , mixed $value )

}

Tabla de contenidos

PDO::beginTransaction — Inicia una transacción

PDO::commit — Consigna una transacción

PDO::__construct — Crea una instancia de PDO que representa una conexión a una base de

datos

PDO::errorCode — Obtiene un SQLSTATE asociado con la última operación en el manejador

de la base de datos

PDO::errorInfo — Obtiene información extendida del error asociado con la última operación

del manejador de la base de datos

PDO::exec — Ejecuta una sentencia SQL y devuelve el número de filas afectadas

PDO::getAttribute — Devuelve un atributo de la conexión a la base de datos

PDO::getAvailableDrivers — Devuelve un array con los controladores de PDO disponibles

PDO::inTransaction — Comprueba si una transacción está activa

PDO::lastInsertId — Devuelve el ID de la última fila o secuencia insertada

PDO::prepare — Prepara una sentencia para su ejecución y devuelve un objeto sentencia

Page 29: Introducción pdo

PDO::query — Ejecuta una sentencia SQL, devolviendo un conjunto de resultados como un

objeto PDOStatement

PDO::quote — Entrecomilla una cadena de caracteres para usarla en una consulta

PDO::rollBack — Revierte una transacción

PDO::setAttribute — Establece un atributo

PDO::beginTransaction Objetos grandes (LOBs)

[edit] Last updated: Fri, 25 Jan 2013

 

   add a noteUser Contributed Notes PDO - [6 notes]

up

down

1

RockMeAmadeus

2 years ago

PDO::getAvailableDrivers is the only PDO static method so it needs a double colon.

The other PDO methods are used by an object, so they should use the -> syntax.

   * PDO->beginTransaction — Initiates a transaction

    * PDO->commit — Commits a transaction

    * PDO->__construct — Creates a PDO instance representing a connection to a

database

    * PDO->errorCode — Fetch the SQLSTATE associated with the last operation on

the database handle

    * PDO->errorInfo — Fetch extended error information associated with the last

operation on the database handle

    * PDO->exec — Execute an SQL statement and return the number of affected rows

    * PDO->getAttribute — Retrieve a database connection attribute

    * PDO::getAvailableDrivers — Return an array of available PDO drivers

    * PDO->lastInsertId — Returns the ID of the last inserted row or sequence value

    * PDO->prepare — Prepares a statement for execution and returns a statement

object

    * PDO->query — Executes an SQL statement, returning a result set as a

PDOStatement object

    * PDO->quote — Quotes a string for use in a query.

Page 30: Introducción pdo

    * PDO->rollBack — Rolls back a transaction

    * PDO->setAttribute — Set an attribute

up

down

3

schizo_mind at hotmail dot com

4 years ago

<?php 

class PDOConfig extends PDO { 

    

    private $engine; 

    private $host; 

    private $database; 

    private $user; 

    private $pass; 

    

    public function __construct(){ 

        $this->engine = 'mysql'; 

        $this->host = 'localhost'; 

        $this->database = ''; 

        $this->user = 'root'; 

        $this->pass = ''; 

        $dns = $this->engine.':dbname='.$this->database.";host=".$this->host; 

        parent::__construct( $dns, $this->user, $this->pass ); 

    } 

?>

up

down

0

Megaloman

3 years ago

"And storing username/password inside class is not a very good idea for production

code."

Good idea is to store database connection settings in *.ini files but you have to restrict

access to them. For example this way:

Page 31: Introducción pdo

my_setting.ini:

[database]

driver = mysql

host = localhost

;port = 3306

schema = db_schema

username = user

password = secret

Database connection:

<?php

class MyPDO extends PDO

{

    public function __construct($file = 'my_setting.ini')

    {

        if (!$settings = parse_ini_file($file, TRUE)) throw new exception('Unable to open ' .

$file . '.');

        

        $dns = $settings['database']['driver'] .

        ':host=' . $settings['database']['host'] .

        ((!empty($settings['database']['port'])) ? (';port=' . $settings['database']['port']) :'') .

        ';dbname=' . $settings['database']['schema'];

        

        parent::__construct($dns, $settings['database']['username'], $settings['database']

['password']);

    }

}

?>

Database connection parameters are accessible via human readable ini file for those

who screams even if they see one PHP/HTML/any_other command.

up

down

0

kcleung at kcleung dot no-ip dot org

2 years ago

Page 32: Introducción pdo

Here is an singleton PDO example:

###### config.ini ######

db_driver=mysql

db_user=root

db_password=924892xp

[dsn]

host=localhost

port=3306

dbname=localhost

[db_options]

PDO::MYSQL_ATTR_INIT_COMMAND=set names utf8

[db_attributes]

ATTR_ERRMODE=ERRMODE_EXCEPTION

############

<?php class Database {

    private static $link = null ;

    private static function getLink ( ) {

        if ( self :: $link ) {

            return self :: $link ;

        }

        $ini = _BASE_DIR . "config.ini" ;

        $parse = parse_ini_file ( $ini , true ) ;

        $driver = $parse [ "db_driver" ] ;

        $dsn = "${driver}:" ;

        $user = $parse [ "db_user" ] ;

        $password = $parse [ "db_password" ] ;

        $options = $parse [ "db_options" ] ;

        $attributes = $parse [ "db_attributes" ] ;

Page 33: Introducción pdo

        foreach ( $parse [ "dsn" ] as $k => $v ) {

            $dsn .= "${k}=${v};" ;

        }

        self :: $link = new PDO ( $dsn, $user, $password, $options ) ;

        foreach ( $attributes as $k => $v ) {

            self :: $link -> setAttribute ( constant ( "PDO::{$k}" )

                , constant ( "PDO::{$v}" ) ) ;

        }

        return self :: $link ;

    }

    public static function __callStatic ( $name, $args ) {

        $callback = array ( self :: getLink ( ), $name ) ;

        return call_user_func_array ( $callback , $args ) ;

    }

} ?>

<?php // examples

$stmt = Database :: prepare ( "SELECT 'something' ;" ) ;

$stmt -> execute ( ) ;

var_dump ( $stmt -> fetchAll ( ) ) ;

$stmt -> closeCursor ( ) ;

?>

up

down

-1

williambarry007 at gmail dot com

1 year ago

PDO and Dependency Injection

Dependency injection is good for testing.  But for anyone wanting various data mapper

objects to have a database connection, dependency injection can make other model

code very messy because database objects have to be instantiated all over the place

and given to the data mapper objects.

Page 34: Introducción pdo

The code below is a good way to maintain dependency injection while keeping clean

and minimal model code.

<?php

class DataMapper

{

    public static $db;

    

    public static function init($db)

    {

        self::$db = $db;

    }

}

class VendorMapper extends DataMapper

{

    public static function add($vendor)

    {

        $st = self::$db->prepare(

            "insert into vendors set

            first_name = :first_name,

            last_name = :last_name"

        );

        $st->execute(array(

            ':first_name' => $vendor->first_name,

            ':last_name' => $vendor->last_name

        ));

    }

}

// In your bootstrap

$db = new PDO(...);

DataMapper::init($db);

// In your model logic

Page 35: Introducción pdo

$vendor = new Vendor('John', 'Doe');

VendorMapper::add($vendor);

?>

up

down

-1

anrdaemon at freemail dot ru

4 years ago

Keep in mind, you MUST NOT use 'root' user in your applications, unless your

application designed to do a database maintenance.

And storing username/password inside class is not a very good idea for production

code. You would need to edit the actual working code to change settings, which is bad.

La clase PDOStatement

(PHP 5 >= 5.1.0, PECL pdo >= 1.0.0)

Introducción

Representa una sentencia preparada y, después de la ejecución de la instrucción, un conjuntos

de resultados asociado.

Sinopsis de la Clase

PDOStatement implements Traversable {

/* Propiedades */

readonly string $ queryString ;

/* Métodos */

bool bindColumn ( mixed $column , mixed &$param [, int $type [, int $maxlen [, mixed 

$driverdata]]] )

bool bindParam ( mixed $parameter , mixed &$variable [, int $data_type =

PDO::PARAM_STR [, int$length [, mixed $driver_options ]]] )

bool bindValue ( mixed $parameter , mixed $value [, int $data_type =

PDO::PARAM_STR ] )

bool closeCursor ( void )

int columnCount ( void )

bool debugDumpParams ( void )

string errorCode ( void )

array errorInfo ( void )

bool execute ([ array $input_parameters ] )

Page 36: Introducción pdo

mixed fetch ([ int $fetch_style [, int $cursor_orientation =

PDO::FETCH_ORI_NEXT [, int$cursor_offset = 0 ]]] )

array fetchAll ([ int $fetch_style [, mixed $fetch_argument [, array $ctor_args =

array() ]]] )

string fetchColumn ([ int $column_number = 0 ] )

mixed fetchObject ([ string $class_name = "stdClass" [, array $ctor_args ]] )

mixed getAttribute ( int $attribute )

array getColumnMeta ( int $column )

bool nextRowset ( void )

int rowCount ( void )

bool setAttribute ( int $attribute , mixed $value )

bool setFetchMode ( int $mode )

}

Propiedades

queryString

La cadena de consulta utilizada.

Tabla de contenidos

PDOStatement::bindColumn — Vincula una columna a una variable de PHP

PDOStatement::bindParam — Vincula un parámetro al nombre de variable especificado

PDOStatement::bindValue — Vincula un valor a un parámetro

PDOStatement::closeCursor — Cierra un cursor, habilitando a la sentencia para que sea

ejecutada otra vez

PDOStatement::columnCount — Devuelve el número de columnas de un conjunto de

resultados

PDOStatement::debugDumpParams — Vuelca un comando preparado de SQL

PDOStatement::errorCode — Obtiene el SQLSTATE asociado con la última operación del

gestor de sentencia

PDOStatement::errorInfo — Obtiene información ampliada del error asociado con la última

operación del gestor de sentencia

PDOStatement::execute — Ejecuta una sentencia preparada

PDOStatement::fetch — Obtiene la siguiente fila de un conjunto de resultados

PDOStatement::fetchAll — Devuelve un array que contiene todas las filas del conjunto de

resultados

PDOStatement::fetchColumn — Devuelve una única columna de la siguiente fila de un

conjunto de resultados

PDOStatement::fetchObject — Obtiene la siguiente fila y la devuelve como un objeto

PDOStatement::getAttribute — Recupera un atributo de sentencia

Page 37: Introducción pdo

PDOStatement::getColumnMeta — Devuelve metadatos de una columna de un conjunto de

resultados

PDOStatement::nextRowset — Avanza hasta el siguiente conjunto de filas de un gestor de

sentencia multiconjunto de filas

PDOStatement::rowCount — Devuelve el número de filas afectadas por la última sentencia

SQL

PDOStatement::setAttribute — Establece un atributo de sentencia

PDOStatement::setFetchMode — Establece el modo de obtención para esta sentencia

   add a noteUser Contributed Notes PDOStatement - [2 notes]

up

down

0

Dmitri Snytkine

1 year ago

It looks like cloning PDOStatement object does not make any sense because while

clone($sth) will not generate any errors, the returned object is not a new object but a

reference to original PDOStatement object $sth.

up

down

0

rosko at zeta dot org dot au

3 years ago

There are many references around for returning a refcursor from a pgSQL function

using pg_query. All essentially boil down to executing the following single statement (or

some variation of it):

 begin; select yourFunction(params...); fetch all in cursorname; commit;

In PDO, this doesn't work because PDO won't allow multiple statements submitted as a

single statement (due to SQL injection detection). Instead, try this or similar:

<?php

$sql = 'select yourFunction(params...)';

$db = new PDO('pgsql:dbname=yourDBname');

Page 38: Introducción pdo

$db->beginTransaction();

$cmd = $db->prepare($sql);

if ($cmd->execute()) {

  if ($query = $db->query('fetch all in cursorname')) {

    ...processing...

    $query->closeCursor();

    $cmd->closeCursor();

  }

}

$db->commit();

?>

La clase PDOException

(PHP 5 >= 5.1.0)

Introducción

Representa un error generado por PDO. No se debería lanzar una PDOException desde el

código. VéaseExcepciones para más información acerca de las excepciones en PHP.

Sinopsis de la Clase

PDOException extends RuntimeException {

/* Propiedades */

public array $ errorInfo  ;

protected string $ message  ;

protected string $ code  ;

/* Métodos heredados */

final public string Exception::getMessage ( void )

final public Exception Exception::getPrevious ( void )

final public mixed Exception::getCode ( void )

final public string Exception::getFile ( void )

final public int Exception::getLine ( void )

final public array Exception::getTrace ( void )

final public string Exception::getTraceAsString ( void )

public string Exception::__toString ( void )

final private void Exception::__clone ( void )

}

Propiedades

errorInfo

Corresponde a PDO::errorInfo() o PDOStatement::errorInfo()

message

Page 39: Introducción pdo

Mensaje de error textual. Exception::getMessage() para acceder a él.

code

Código de error de SQLSTATE. Utilice Exception::getCode() para acceder a él.

Controladores de PDO PDOStatement::setFetchMode

[edit] Last updated: Fri, 25 Jan 2013

 

   add a noteUser Contributed Notes PDOException - [3 notes]

up

down

0

Marco01_809 &#34;at&#34; web &#34;dot&#34; de

2 years ago

This is a PDOException Error handler for Using/Debugging in Web Browser.

<?php

echo '<html><head><title>PHP PDO Tests</title></head><body>';

// Try the following code:

try {

    $db = new PDO('sqlite:database.sdb'); // Create a new PDO Object

    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // Set

Errorhandling to Exception

    $db->query("BlaBlaBla"); // Query something wrong

    $db = null; // "Disconnect"

}

catch (PDOException $err) {

    // Catch Expcetions from the above code for our Exception Handling

    $trace = '<table border="0">';

    foreach ($err->getTrace() as $a => $b) {

        foreach ($b as $c => $d) {

            if ($c == 'args') {

Page 40: Introducción pdo

                foreach ($d as $e => $f) {

                    $trace .= '<tr><td><b>' . strval($a) . '#</b></td><td

align="right"><u>args:</u></td> <td><u>' . $e . '</u>:</td><td><i>' . $f . '</i></td></tr>';

                }

            } else {

                $trace .= '<tr><td><b>' . strval($a) . '#</b></td><td

align="right"><u>' . $c .'</u>:</td><td></td><td><i>' . $d . '</i></td>';

            }

        }

    }

    $trace .= '</table>';

    echo '<br /><br /><br /><font face="Verdana"><center><fieldset style="width: 66%;

border: 4px solid white; background: black;"><legend><b>[</b>PHP PDO Error

' . strval($err->getCode()) . '<b>]</b></legend> <table border="0"><tr><td

align="right"><b><u>Message:</u></b></td><td><i>' . $err-

>getMessage() . '</i></td></tr><tr><td

align="right"><b><u>Code:</u></b></td><td><i>' . strval($err-

>getCode()) . '</i></td></tr><tr><td

align="right"><b><u>File:</u></b></td><td><i>' . $err->getFile() . '</i></td></tr><tr><td

align="right"><b><u>Line:</u></b></td><td><i>' . strval($err-

>getLine()) . '</i></td></tr><tr><td align="right"><b><u>Trace:</u></b></td><td><br

/><br />' . $trace . '</td></tr></table></fieldset></center></font>';

}

echo '</body></html>';

?>

up

down

0

samuelelliot+php dot net at gmail dot com

2 years ago

PDOException has two methods for retrieving information about an error. When

interpreting the PDOException I run into a problem, the error code that is provided by

getCode() is meaningless.  I have come up with a method to make both the error code

and message more usable.

A bad username or password would normally provide the following: 

Page 41: Introducción pdo

CODE : 0 

Message : "SQLSTATE[28000] [1045] Access denied for user 'user'@'example.com'

(using password: YES)" 

Using my extended exception class provides: 

CODE: "28000" 

Message: "Access denied for user 'user'@'example.com' (using password: YES)" 

<?php 

class pdoDbException extends PDOException { 

    public function __construct(PDOException $e) { 

        if(strstr($e->getMessage(), 'SQLSTATE[')) { 

            preg_match('/SQLSTATE\[(\w+)\] \[(\w+)\] (.*)/', $e->getMessage(), $matches); 

            $this->code = ($matches[1] == 'HT000' ? $matches[2] : $matches[1]); 

            $this->message = $matches[3]; 

        } 

    } 

?> 

To walk threw the method; first the beginning of the message is checked for the

SQLSTATE text.  If the text is present, message is then parsed to pull the ANSI code,

the SQL specific code, and the message.  The parsed values are stored in there

respective variables.  The error code variable stores the ANSI code, unless ANSI is

'HT000' (unmapped error code) then SQL specific code is used. 

Using this class is easy; when interacting with PDO use a try catch set of blocks, as

follows: 

<?php 

try { 

    $pdo = new PDO($dns, $username, $password, $options); 

} catch (PDOException $e) { 

    throw new pdoDbException($e); 

Page 42: Introducción pdo

?> 

Now you can use the normal error methods to retrieve the real error code and

message. 

<?php 

echo $err->getCode(); // Outputs: "28000" 

echo $err->getMessage(); // Outputs: "Access denied for user 'user'@'example.com'

(using password: YES)" 

?> 

If you decide to use this code, be aware that the error code is a string (as apposed to

PHP standard errors which are integers) as some error codes are alphanumeric.

up

down

0

Typer85 at gmail dot com

3 years ago

Here is something interesting regarding a PDOException and it involves some of the

annoyances that can be associated with PHP's dynamic nature.

PDOException extends from RuntimeException, which in return extends from

Exception. As such, it has access to the $code Protected Class Variable, which

represents the Exception's code as an Integer (duh!) and can be accessed externally

using the Exception::getCode Method.

Here is the interesting part. PDOException actually redefines $code as a String and not

an Integer because for its case, $code actually contains the Exception's SQL State,

which is composed of characters and numbers.

It is actually documented in the manual that $code is a String and not an Integer but it

might not be immedietley clear because it is hidden by the fact that

PDOException::getCode is documented to return an Integer and not a String!

Some developers like to catch a PDOException and rethrow it as a different Exception

if they wrap their database calls in an external library. For example, consider the

Page 43: Introducción pdo

following code:

<?php

try {

    $PDO = new PDO( '...' ); // PDO Driver DSN. Throws A PDOException.

}

catch( PDOException $Exception ) {

    // PHP Fatal Error. Second Argument Has To Be An Integer, But

PDOException::getCode Returns A

    // String.

    throw new MyDatabaseException( $Exception->getMessage( ) , $Exception-

>getCode( ) );

}

?>

Be careful in that you have to typecast the value returned by PDOException::getCode

to an Integer BEFORE you pass it as an Argument to your Exception's Constructor.

The following will work:

<?php

try {

    $PDO = new PDO( '...' ); // PDO Driver DSN. Throws A PDOException.

}

catch( PDOException $Exception ) {

    // Note The Typecast To An Integer!

    throw new MyDatabaseException( $Exception->getMessage( ) , (int)$Exception-

>getCode( ) );

}

?>

Hope this will save some developers some frustrating hours from an otherwise

enjoyable job :)

Page 44: Introducción pdo

Good Luck,

Funciones de CUBRID (PDO_CUBRID)

Introducción

PDO_CUBRID es un controlador que implementa la interfaz de Objetos de Datos de PHP

(PDO) para habilitar el acceso desde PHP a bases de datos de CUBRID.

Nota:

Por ahora, la versión actual de PDO_CUBRID no admite conexiones persistentes.

Instalación

Para construir la extensión PDO_CUBRID, CUBRID DBMS debe estar instalado en el mismo

sistema donde se ejecute PHP. PDO_CUBRID es una extensión »   PECL , por lo que se han de

seguir las instrucciones dadas enInstalación de extensiones PECL para instalar la extensión

PDO_CUBRID. Ejecute el comando configure para indicar la ubicación del directorio base de

CUBRID de la siguiente manera:

$ ./configure --with-pdo-cubrid=/path/to/CUBRID[,shared]

El valor predeterminado del comando configure es el de la variable de entorno de CUBRID.

Actualmente, no hay ninguna DLL disponible para esta extensión PECL. Véase también la

sección Compilar en Windows . Para información detallada sobre la instalación manual en

Linux y Windows, por favor lea build-guide.html en el paquete PECL CUBRID para obtener

referencias.

Características

Características de PDO_CUBRID

Característica Descripción

Cursores

desplazables

PDO_CUBRID admite cursores desplazables. El tipo de cursor predeterminado es de sólo

avance, y se puede usar el parámetro driver_options de PDO::prepare() para cambiar el tipo de

cursor.

Tiempo de esperaPDO_CUBRID admite la configuracion del tiempo de espera de las ejecuciones de sentencias

SQL; Se puede utilizar PDO::setAttribute() para establecer el valor del tiempo de espera.

Autocommit_mode y

transacciones

PDO_CUBRID admite autocommit_mode y transacciones, y autocommit_mode está

deshabilitado por omisión. Se puede usar PDO::setAttribute() para cambiar su estado.

Si se usa PDO::beginTransaction() para iniciar una transacción, se desactivará

autocommit_mode automaticamente y PDO::rollBack(). Obsérvese que antes de deshabilitar

Page 45: Introducción pdo

Características de PDO_CUBRID

Característica Descripción

autocommit_mode, cualquier trabajo pendiente es consignado automáticamente.

Sentencias SQL

múltiples

PDO_CUBRID admite sentencias SQL múltiples. Las sentencias SQL múltiples están

serparadas por puntos y comas (;)

Información del

esquema

PDO_CUBRID implementa la función PDO::cubrid_schema() para obtener la información del

esquema.

LOBs

PDO_CUBRID admite los tipos de datos BLOB/CLOB. El tipo LOB en PDO es representado

como un flujo, por lo que pueden insertarse LOBs vinculando un flujo, y obtener LOBs leyendo

de un flujo devuelto por CUBRID PDO. Por ejemplo:

Ejemplo #1 Insertar LOBs en CUBRID PDO

<?php

$fp = fopen('lob_test.png', 'rb');

$sent_sql = "INSERT INTO lob_test(name, content) VALUES('lob_test.png', ?)";

$sentencia = $dbh->prepare($sent_sql);

$ret = $sentencia->bindParam(1, $fp, PDO::PARAM_LOB);

$ret = $sentencia->execute();

?>

Ejemplo #2 Obtener LOBs en CUBRID PDO

<?php

$sent_sql = "SELECT content FROM lob_test WHERE name='lob_test.png'";

$sentencia = $dbh->prepare($sent_sql);

$sentencia->execute();

$resultado = $sentencia->fetch(PDO::FETCH_NUM);

header("Content-Type: image/png");

fpassthru($resultado[0]);

?>

Metadatos de

columna

La función PDOStatement::getColumnMeta() de CUBRID PDO devolverá un array

Page 46: Introducción pdo

Características de PDO_CUBRID

Característica Descripción

asociativo que contiene los siguientes valores:

type

name

table

def

precision

scale

not_null

auto_increment

unique_key

multiple_key

primary_key

foreign_key

reverse_index

reverse_unique

Constantes predefinidas

Estas constantes están definidas por este controlador, y estarán disponibles sólo cuando la

extensión haya sido compilada con PHP, o bien sea cargada dinámicamente en ejecución.

Además, estas constantes específicas del controlador deberían ser utilizadas sólo si está usando

este controlador. Usar atributos específicos del controlador con otro controlador podría resultar

en un comportamiento inesperado. PDO::getAttribute() puede ser empleado para obtener el

atributo PDO_ATTR_DRIVER_NAME para verificar el controlador, si el código puede

ejecutarse con múltiples controladores.

Las siguientes constantes se puden usar al establecer el atributo de la base de datos. Se puede

pasar aPDO::getAttribute() o a PDO::setAttribute().

Banderas de atributo de PDO::CUBRID

Constante Descripción

PDO::CUBRID_ATTR_ISOLATION_LEVELNivel de aislamiento de las transacciones

para la conexión de la base de datos.

PDO::CUBRID_ATTR_LOCK_TIMEOUT Tiempo de espera de las transacciones en

Page 47: Introducción pdo

Banderas de atributo de PDO::CUBRID

Constante Descripción

segundos.

PDO::CUBRID_ATTR_MAX_STRING_LENGTH

Sólo lectura. La longitud máxima de

cadena para los diversos tipos de datos

bit, varbit, char, varchar, nchar, nchar al

utilizar la API de CUBRID PDO.

Las siguientes constantes se puden usar al estableder el nivel de aislamiento de las

transacciones. Se pueden pasar a PDO::getAttribute() o ser devueltas

por PDO::setAttribute().

Banderas de nivel de aislamiento de PDO::CUBRID

Constante Descripción

PDO::TRAN_COMMIT_CLASS_UNCOMMIT_INSTANCE

El nivel de aislamiento más

bajo (1). Podría ocurrir una

lectura sucia, no repetible o

fantasma para la tupla, y puede

ocurrir también una lectura no

repetible para la tabla.

PDO::TRAN_COMMIT_CLASS_COMMIT_INSTANCE

Un nivel relativamente bajo de

aislamiento (2). No ocurre una

lectura sucia, pero podría

ocurrir una lectura no repetible

o fantasma.

PDO::TRAN_REP_CLASS_UNCOMMIT_INSTANCE

El nivel predeterminado de

aislamiento de CUBRID (3).

Podría ocurrir una lectura

sucia, no repetible o fantasma

para la tupla, pero se garantiza

una lectura repetible para la

tabla.

PDO::TRAN_REP_CLASS_COMMIT_INSTANCE Un nivel relativamente bajo de

Page 48: Introducción pdo

Banderas de nivel de aislamiento de PDO::CUBRID

Constante Descripción

aislamiento (4). No ocurre una

lectura sucia, pero sí podría

ocurrir una lectura no repetible

o fantasma.

PDO::TRAN_REP_CLASS_REP_INSTANCE

Un nivel de aislamiento

relativamente alto (5). No

ocurre una lectura sucia o no

repetible, pero sí podría ocurrir

una lectura fantasma.

PDO::TRAN_SERIALIZABLE

El nivel de aislamiento más

alto (6). No ocurren los

problemas concernientes a la

concurrencia (p.ej. lectura

sucia, no repetible, fantasma,

etc.).

Las siguientes constantes se pueden usar al obtener la información del esquema. Se pueden

pasar aPDO::cubrid_schema().

Banderas de esquema de PDO::CUBRID

Constante Descripción

PDO::CUBRID_SCH_TABLEObtener el nombre y el tipo de tabla de

CUBRID.

PDO::CUBRID_SCH_VIEWObtener el nombre y el tipo de vista de

CUBRID.

PDO::CUBRID_SCH_QUERY_SPECObtener la definición de la consulta de la

vista.

PDO::CUBRID_SCH_ATTRIBUTEObtener los atributos de la columnas de la

tabla.

PDO::CUBRID_SCH_TABLE_ATTRIBUTE Obtener los atributos de la tabla.

Page 49: Introducción pdo

Banderas de esquema de PDO::CUBRID

Constante Descripción

PDO::CUBRID_SCH_METHOD

Obtener el método de instancia. El método

de instancia es un método invocado por

una instancia de clase. Se usa más a

menudo que el método de la clase, ya que

se ejecutan más operaciones en la

instancia.

PDO::CUBRID_SCH_TABLE_METHOD

Obtener el método de la clase. El método

de la clase es un método invocado por un

objeto de clase. Se usa normalmente para

crear una nueva instancia de clase o para

inicializarla. También se usa para acceder o

actualizar los atributos de la clase.

PDO::CUBRID_SCH_METHOD_FILEObtener la información del fichero donde

el método de la tabla está definido.

PDO::CUBRID_SCH_SUPER_TABLEObtener el nombre y el tipo de la tabla

desde la que se heredan atributos.

PDO::CUBRID_SCH_SUB_TABLEObtener el nombre y el tipo de la tabla que

hereda los atributos desde esta tabla.

PDO::CUBRID_SCH_CONSTRAINT Obtener las restricciones de la tabla.

PDO::CUBRID_SCH_TRIGGER Obtener los disparadores de la tabla.

PDO::CUBRID_SCH_TABLE_PRIVILEGEObtener la información de privilegios de la

tabla.

PDO::CUBRID_SCH_COL_PRIVILEGEObtener la información de los privilegios

de la columna.

PDO::CUBRID_SCH_DIRECT_SUPER_TABLE Obtener la super tabla directa de la tabla.

PDO::CUBRID_SCH_PRIMARY_KEY Obtener la clave primaria de la tabla.

Page 50: Introducción pdo

Banderas de esquema de PDO::CUBRID

Constante Descripción

PDO::CUBRID_SCH_IMPORTED_KEYS Obtener las claves importadas de la tabla.

PDO::CUBRID_SCH_EXPORTED_KEYS Obtener las claves exportadas de la tabla.

PDO::CUBRID_SCH_CROSS_REFERENCEObtener la relación de referencia de las

tablas a remolque.

Tabla de contenidos

DSN de PDO_CUBRID — Conectar con bases de datos de CUBRID

PDO::cubrid_schema — Obtiene la información del esquema solicitada

Funciones de Microsoft SQL Server y Sybase (PDO_DBLIB)

Introducción

Advertencia

Esta extensión es EXPERIMENTAL. Esto significa que el comportamiento de esta extensión,

los nombres de sus funciones y todo lo documentado sobre esta extensión, puede cambiar en

una futura edición de PHP sin previo aviso. El uso de esta extensión queda bajo su propia

responsabilidad.

PDO_DBLIB es un controlador que implementa la interfaz de objetos de datos de PHP

(PDO) para habilitar el acceso desde PHP a bases de datos de Microsoft SQL Server y Sybase a

través de la biblioteca FreeTDS.

Esta ya extensión no está disponible para Windows con PHP 5.3 o posterior.

En Windows, se debería de usar SqlSrv, un controlador alternativo para MS SQL que está

disponible desde Microsoft: »   http://msdn.microsoft.com/en-us/sqlserver/ff657782.aspx   .

Si no fuera posible usar SqlSrv, se puede utilizar el controlador PDO_ODBC para conectarse a

bases de datos de Microsoft SQL Server y Sybase, ya que la biblioteca Windows DB-LIB nativa

está anticuado, no es seguro con subprocesos y Microsoft ya no le proporciona soporte.

Tabla de contenidos

PDO_DBLIB DSN — Conectarse a bases de datos de Microsoft SQL Server y Sybase

PDO_DBLIB DSN PDO::cubrid_schema

Page 51: Introducción pdo

[edit] Last updated: Fri, 25 Jan 2013

 

   add a noteUser Contributed Notes MS SQL Server (PDO) - [14 notes]

up

down

0

twilson at tridiumtech dot com

3 years ago

Hopefully this will help someone who is having problems connecting to MSSQL. I was

having a heck of a time trying to get my dev server to connect to a remote MSSQL

2005 box.

When using PDO like so:

<?php

$mssql = new PDO('dblib:host=<host>;dbname=<dbname>','<user>','<password>');

?>

I was receiving the message:

Adaptive Server is unavailable or does not exist

And mssql_connect() simply told me "Could not connect to server"

I tried everything, different configuration options for FreeTDS/PHP, different versions,

etc. But the answer was one line in php.ini:

mssql.secure_connection = Off

This line, which defaults to Off, needs to be ON if you are using NT authentication:

mssql.secure_connection = On

Here is my build:

FreeTDS-0.82 configured like:

./configure --with-tdsver=8.0 --enable-msdblib --with-gnu-ld

Page 52: Introducción pdo

PHP 5.2.11 configured like:

./configure --with-mssql=/usr/local --with-pdo-dblib=/usr/local [other options]

Running on Apache/2.2.13 (Unix / Linux)

Feel free to email me if you need help as I've spent 20+ hours reading and fiddling with

this issue, so I'm very familiar with it now.

Peace,

Tom

up

down

0

ian at helastel dot com

6 months ago

For people with issues inserting UTF-8 / Unicode data using DBLIB, you can't do this

natively - but you can workaround the problem by converting the data first.

e.g. inserting into a nvarchar column with collation Latin1_General_CI_AS

...

$res = $db->prepare($sql);

$res->bindValue(':value', iconv('UTF-8', 'ISO8859-1', $value);

...

up

down

0

TomF

1 year ago

Note that you must connect with an MS SQL user - FreeTDS does not seem to like

active directory linked users.

up

down

0

meltir at meltir dot com

2 years ago

Page 53: Introducción pdo

Keep in mind the limitation sql server imposes on clients using the connection methods

that dblib uses:

no ntext column values can be transmitted, you will get an insightfull '4004' error when

trying.

The full text of the error is:

Unicode data in a Unicode-only collation or ntext data cannot be sent to clients using

DB-Library (such as ISQL) or ODBC version 3.7 or earlier.

For more info on errors that mssql might throw at you, please see:

http://msdn.microsoft.com/en-us/library/aa937595%28v=SQL.80%29.aspx

up

down

0

xwisdom at gmail dot com

2 years ago

Here's how to call a stored procedure from MS SQL Server: 

<?php 

$return = null; 

$param1 = 'value1'; 

$param2 = 'value2'; 

$ds = $db->prepare('{? = call ?,?}'); 

$ds->bindParam(1, $return, PDO::PARAM_INT | PDO::PARAM_INPUT_OUTPUT,4); 

$ds->bindParam(2, $param1, PDO::PARAM_INT | PDO::PARAM_INPUT_OUTPUT,4); 

$ds->bindParam(3, $param2, PDO::PARAM_INT | PDO::PARAM_INPUT_OUTPUT,4); 

$ds->execute(); 

?>

up

down

0

dpassey at everettsd dot org

3 years ago

Page 54: Introducción pdo

For PDO MSSQL connection issues, ensure that you have the updated version of

ntwdblib.dll (currently 8.00.194 as of this post).  Overwrite the existing (old) file or place

it in the Windows system32 folder.  The version that ships with PHP 5.2.X does not

work.  This is a well known issue apparently, but I had a really hard time finding

information on this issue until I was able to lock in a file name.  I hope that this helps

someone.

up

down

0

tris+php at tfconsulting dot com dot au

3 years ago

If you are struggling with 

'Unicode data in a Unicode-only collation or ntext data cannot be sent to clients using

DB-Library (such as ISQL) or ODBC version 3.7 or earlier.'

when trying to do 'SELECT *' queries:

Obviously the best way to deal with this is change your unicode fields to the ascii

equivalent (ntext > text), but if that is not an option here is an implementation based on

the info athttp://www.rochester.edu/IT/web/WebHelp/mssql/limitations.html which

checks the data types of the fields and casts them as neccesary.

<?php

class mssql {

    private static $statement=null;

    private static $typemap=array(

        'ntext' => 'text',

        'bigint' => 'real',

        'decimal' => 'real',

        'float' => 'real',

        'numeric' => 'real'

    );

    

    public static function all_fields($table) {

        if(self::$statement==null) {

            $db=pdodb::instance(); // or however you get your global instance

            $query="SELECT COLUMN_NAME, DATA_TYPE FROM

Page 55: Introducción pdo

INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME=?";

            self::$statement=$db->prepare($query);

        }

        

        self::$statement->execute(array($table));

        

        $fields=array();

        $need_cast=false;

        while($field=self::$statement->fetch()) {

            $field_quoted=self::quote_field($field['COLUMN_NAME']);

            if(isset(self::$typemap[$field['DATA_TYPE']])) {

                $fields[]='CAST('.$field_quoted.' AS '.self::$typemap[$field['DATA_TYPE']].')

AS '.$field_quoted;

                $need_cast=true;

            } else $fields[]=$field_quoted;

        }

        return ($need_cast) ? implode(', ',$fields) : '*';

    }

    

    public static function quote_field($field) {

        $pos=strpos($field,' ');

        return ($pos===false) ? $field : '['.$field.']';

    }

}

$db=pdodb:instance(); // singleton PDO instance 

$stmt=$db->prepare('SELECT '.mssql::all_fields('My_Table').' FROM My_Table');

$stmt->execute();

...

?>

Essentially mssql::all_fields($table) returns '*' if it can, otherwise the fields listed with

the relevant casts in place e.g. 'NoteIdent, Owner, CAST(Note AS text) AS Note'

up

down

0

Bryan

Page 56: Introducción pdo

4 years ago

To enable the mssql PDO driver under windows you need to:

1) uncomment the "extension=php_pdo_mssql.dll" line from php.ini

2) copy ntwdblib.dll into the directory where you have installed php

up

down

0

mrshelly at hotmail dot com

4 years ago

to connect MS SQL2005(DE) sample code:

notice: 

if u used MSSQL 2005 EXPRESS, must set the instence name 'SQLEXPRESS'

just like 

$hostname='127.0.0.1\SQLEXPRESS';

<?php

  try {

    $hostname = "host";            //host

    $dbname = "dbname";            //db name

    $username = "user";            // username like 'sa'

    $pw = "pass";                // password for the user

    $dbh = new PDO ("mssql:host=$hostname;dbname=$dbname","$username","$pw");

  } catch (PDOException $e) {

    echo "Failed to get DB handle: " . $e->getMessage() . "\n";

    exit;

  }

  $stmt = $dbh->prepare("SELECT * FROM table");

  $stmt->execute();

  while ($row = $stmt->fetch()) {

    print_r($row);

  }

  unset($dbh); unset($stmt);

?>

up

Page 57: Introducción pdo

down

0

Steve H

6 years ago

To connect to SQL Server 2005 Express on Windows, do it like this:

$pdo = new PDO ('mssql:host=localhost,1433;dbname=[redacted]', '[redacted]',

'[redacted]');

localhost

localhost\SQLEXPRESS

localhost\1433

localhost:1433

will not work on Windows.

localhost,1433

does work.

YMMV on other OS's; try each.

Also make sure your TCP/IP Properties -> IP Addresses are correct under SQL Server

Configuration Manager.

up

down

0

support at converters dot ru

7 years ago

If You work with MSSQL Server 7.0/2000/... under Windows and use non latin

Encoding then better To use PDO_MSSQL until PDO_ODBC bugs will be fixed

(MSSQL ext far more stable and usabe for PHP versions <=5.1.2).

If your MSSQL connection use strings in OEM encoding (cp866 for russian charset) 

1. Run Microsoft Server/Client Network Utility on work PC and UNCHECK "DBLibrary

options"/"Automatic ANSI to OEM conversion"

Page 58: Introducción pdo

2. Restart Web server if needed.

up

down

0

graham1 dot simpson at hsbcib dot com

7 years ago

There is currently little sybase related PDO docs out there. The ones that I found often

mention a spec for a dsn that is invalid. Here's how I am currently connecting to sybase

ASE:

1. Compile up freetds http://www.freetds.org on top of open client;

2. Add the PDO and PD_DBLIB modules to php 5 as per the documentation; Note: I'm

currently using the PDO-beta and PDO_DBLIB-beta;

3. Check mods installed ok using "pear list" and "php -m";

The documentation often says to use "sybase:" as your DSN, this doesn't work. Use

"dblib:" instead. Here's an example:

<?php

  try {

    $hostname = "myhost";

    $port = 10060;

    $dbname = "tempdb";

    $username = "dbuser";

    $pw = "password";

    $dbh = new PDO ("dblib:host=$hostname:

$port;dbname=$dbname","$username","$pw");

  } catch (PDOException $e) {

    echo "Failed to get DB handle: " . $e->getMessage() . "\n";

    exit;

  }

  $stmt = $dbh->prepare("select name from master..sysdatabases where name =

db_name()");

  $stmt->execute();

  while ($row = $stmt->fetch()) {

    print_r($row);

Page 59: Introducción pdo

  }

  unset($dbh); unset($stmt);

?>

Hope this helps.

up

down

-1

Matej

2 years ago

How to use mssql pdo on PHP 5.3 on IIS 7 (Windows Server 2008)

1. Installation of MSSQL driver for PHP:

Download Microsoft Drivers for PHP for SQL Server Microsoft Drivers for PHP for SQL

Server - SQLSRV20.EXE - http://www.microsoft.com/downloads/en/details.aspx

?FamilyID=80e44913-24b4-4113-8807-caae6cf2ca05)

Copy php_sqlsrv_53_ts_vc9.dll and php_pdo_sqlsrv_53_ts_vc9.dll to php extension

directory

2. configure php.ini to work with MSSQL PDO

extension=php_sqlsrv_53_ts_vc9.dll

extension=php_pdo_sqlsrv_53_ts_vc9.dll

3. configure  configuration

            'connectionString' =>

'sqlsrv:server=hostname_or_ip;Database=database_name;',

Funciones de Firebird/Interbase (PDO_FIREBIRD)

Introducción

PDO_FIREBIRD es un controlador que imlementa la interfaz de Objetos de datos de PHP

(PDO) para habilitar el acceso desde PHP a bases de datos de Firebird e Interbase.

Instalación

Use --with-pdo-firebird[=DIR] para instalar la extensión PDO Firebird, donde [=DIR] es el

directorio base de intalación de Firebird.

$ ./configure --with-pdo-firebird

Constantes predefinidas

Page 60: Introducción pdo

Estas constantes están definidas por este controlador, y estarán disponibles sólo cuando la

extensión haya sido compilada con PHP, o bien sea cargada dinámicamente en ejecución.

Además, estas constantes específicas del controlador deberían ser utilizadas sólo si está usando

este controlador. Usar atributos específicos del controlador con otro controlador podría resultar

en un comportamiento inesperado. PDO::getAttribute() puede ser empleado para obtener el

atributo PDO_ATTR_DRIVER_NAME para verificar el controlador, si el código puede

ejecutarse con múltiples controladores.

PDO::FB_ATTR_DATE_FORMAT (integer)

Establece el formato de fecha.

Disponible desde PHP 5.3.0.

PDO::FB_ATTR_TIME_FORMAT (integer)

Establece el formato de hora.

Disponible desde PHP 5.3.0.

PDO::FB_ATTR_TIMESTAMP_FORMAT (integer)

Establece el formato de marca de tiempo.

Disponible desde PHP 5.3.0.

Tabla de contenidos

PDO_FIREBIRD DSN — Conectarse a bases de datos de Firebird e Interbase

PDO_FIREBIRD DSN PDO_DBLIB DSN

[edit] Last updated: Fri, 25 Jan 2013

 

   add a noteUser Contributed Notes Firebird/Interbase (PDO) - [6 notes]

up

down

1

ritsaert at continuit dot nl

7 years ago

The connection string for a firebird PDO connection is different than described above. It

is something like:

$DB = new PDO("firebird:dbname=T:\\Klimreg.GDB", "SYSDBA", "masterkey");

Page 61: Introducción pdo

after dbname= the default connection string for Interbase and Firebird databases is

used as presented to either gds32.dll or fbclient.dll.

up

down

0

confik at gmail dot com

1 year ago

Here's the quick guide how to compile pdo_firebird and run tests for the ubuntu:

1) setup firebird superclassic:

$ sudo apt-get install firebird2.5-superclassic firebird2.5-dev

firebird2.5-examples

superclassic is the server itself (if in doubt, read

this:http://www.firebirdsql.org/file/documentation/reference_manuals/user_manuals/

html/qsg25-classic-or-super.html), dev package contains headers to

compile pdo stuff, examples contains example db, i used it to run

tests in it.

Set up credentials for the server (see the link lower).

Get employee.fdb as written here

http://www.firebirdsql.org/manual/ubusetup.html to a some known and

writable path by your user (which tests will be run on).

2) make sure to compile php with following flags, you'll need interbase too (some

tests in pdo_firebird/tests need it)

./configure  --enable-pdo --with-pdo-firebird --with-interbase

make

3) Run tests with environment variables that can be found in

ext/pdo_firebird/tests/common.phpt, I ran it like this:

$ PDO_FIREBIRD_TEST_DSN='firebird:dbname=/var/lib/firebird/2.5/data/

employee.fdb'

PDO_FIREBIRD_TEST_USER='SYSDBA' PDO_FIREBIRD_TEST_PASS='masterkey'

TEST_PHP_EXECUTABLE=auto php -n ./run-tests.php ext/pdo_firebird

You're done!

up

down

0

mark-php at vectrex dot org dot uk

Page 62: Introducción pdo

5 years ago

If you have a database alias on the server "localhost" called "test.fdb", you can do:

$conn = new PDO("firebird:dbname=localhost:test.fdb",

                'SYSDBA','letmein');

Note that as of the time of writing, the Firebird driver doesn't correctly throw an

exception on connection error

http://bugs.php.net/bug.php?id=41522

up

down

0

Darren

6 years ago

After much trial and error i found out you should use the following to connect to a

firebird database:

<?php

  $db = new PDO ("firebird:dbname=localhost:C:\\path\\to\\database\\

MyDatabase.FDB","username", "password");

?>

NOTE: in the 1st part of the connection string there can be NO spaces else you will get

NULL.

The string provided on this site does not work and will give no error only NULL.

up

down

0

thomas at last-it dot de

6 years ago

if youre dsn syntax is wrong, see ritsaert's comment, there maybe no errormessage!

up

down

-1

Anonymous

3 months ago

After two days of trouble with no visibile issues, when rebooting the system two popups

come up:

Page 63: Introducción pdo

PHP Startup: Unable to load dynamic library

'c:/wamp/bin/php/php.5.3.13/ext/php_interbase.dll' - %1 non è un'applicazione di Win32

valida.

PHP Startup: Unable to load dynamic library

'c:/wamp/bin/php/php.5.3.13/ext/php_pdo_firebird.dll' - %1 non è un'applicazione di

Win32 valida.

I've just re-installed wampserver (http://www.wampserver.com/en/) and all seems run

well.

To see if your Firebird PDO driver runs well:

<?php 

 foreach(PDO::getAvailableDrivers() as $driver) {

  echo $driver.'<br />';

}?>

Funciones de IBM (PDO_IBM)

Introducción

PDO_IBM es un controlador que implementa la interfaz de Objetos de datos de PHP

(PDO) para habilitar el acceso desde PHP a bases de datos de IBM.

Instalación

Para construir la extensión PDO_IBM, DB2 Client v9.1 o posterior debe estar instalado en el

mismo sistema que PHP. DB2 Client se puede descargar Desde el »   Sitio de desarrollo de

aplicaciones de IBM.

Nota: Nota

DB2 Client v9.1 o posterior da soporte al acceso directo de DB2 para servidores Linux, UNIX,

y Windows v8 y v9.1.

DB2 Client v9.1 también da soporte para el acceso a DB2 UDB para i5 y DB2 UDB para

servidores z/OS utilizando la adquisición por separada del producto »   DB2 Connect .

PDO_IBM es una extensión »   PECL , por lo que siga las instrucciones en Instalación de

extensiones PECL para instalar la extensión PDO_IBM. Ejecute el comando configure para

que apunte a la ubicación de los ficheros de cabecera y a las bibliotecas de DB2 como sigue:

bash$ ./configure --with-pdo-ibm=/path/to/sqllib[,shared]

El valor predeterminado de configure es la variables de entorno DB2DIR.

Page 64: Introducción pdo

Tabla de contenidos

DSN de PDO_IBM — Conectarse a bases de datos de IBM

Funciones de Informix (PDO_INFORMIX)

Introducción

PDO_INFORMIX es un controlador que implementa la interfaz de Objetos de datos de PHP

(PDO) para habilitar el acceso desde PHP a bases de datos de Informix.

Instalación

Para construir la extensión PDO_INFORMIX, Informix Client SDK 2.81 UC1 o superior debe

estar instalado en el mismo sistema que PHP. Informix Client SDK está disponible desde

el »   Sitio de soporte de Informix de IBM .

PDO_INFORMIX es una extensión »   PECL , por lo que siga las instrucciones en Instalación

de extensiones PECLpara instalar la extensión PDO_INFORMIX. Ejecute el

comando configure para que apunte a la ubicación de los ficheros de cabecera y las bibliotecas

de Informix Client SDK como sigue:

bash$ ./configure --with-pdo-informix=/path/to/SDK[,shared]

El valor predetermiando de configure es la variable de entorno INFORMIXDIR.

Cursores desplazables

PDO_INFORMIX admite los cursores desplazables; sin embargo, estos no están habilitados de

forma predeterminada. Para habilitar el soporte de cursores desplazables, se debe

establecerENABLESCROLLABLECURSORS=1 en los ajustes de conexión de ODBC

correspondientes en odbc.ini, o pasar la cláusula EnableScrollableCursors=1 en la cadena

de conexión de DSN.

Tabla de contenidos

DSN de PDO_INFORMIX — Conectarse a bases de datos de Informix

DSN de PDO_INFORMIX DSN de PDO_IBM

[edit] Last updated: Fri, 25 Jan 2013

 

   add a noteUser Contributed Notes Informix (PDO) - [5 notes]

up

down

0

rdutan at aplext dot com

Page 65: Introducción pdo

10 months ago

tip: in fedora 16 you must set INFORMIXDIR  in /etc/sysconfig/httpd

example:

INFORMIXDIR=/home/informix

export INFORMIXDIR

up

down

0

dan at mutagenix dot org

3 years ago

I've just built PHP 5.2.11 with pdo_informix support on Slackware 13.0.  I had to use

the following options in order to disable pdo from being compiled in (notice the

difference in the --without-pdo-sqlite option from previous post):

--disable-pdo option --without-pdo-sqlite option

I also could not use the --with-sigchild option which caused problems with phpize.

This fixed the informix -11001 error that I was getting.  I was also getting an informix -

23101 error (something about locale mismatches), but it was because I was not

completely removing the compiled in pdo support.

I then had to;

rm -rf /usr/lib/php/.channels

pear update-channels

pecl install --alldeps pdo_informix pdo_mysql pdo_sqlite.

There were other, smaller issues, but that is the lion's share.

up

down

0

cwgraven at gmail dot com

4 years ago

I noticed that SQLite is installed by php by default...oh and it happens to use PDO. So

dont forget to use --without-sqlite.

Page 66: Introducción pdo

My successful config looks like this:

./configure --with-mysql --with-apxs=/usr/local/apache/bin/apxs --with-curl --with-xsl --

disable-pdo --without-sqlite

up

down

0

dbeecher at tekops dot com

4 years ago

Solved the issue with PHP 5.2.4 and others.

The embedded PDO in php since 5.1+ is INCOMPATIBLE with the latest PDO_MYSQL

and PDO_INFORMIX, etc.  I just spent 2 days working on this.  This solution works on

numerous versions of Linux I've tried as well as SunOS and HPUX.

The basic issue, getting this message when running PHP with PDO and trying

to get PDO_INFORMIX working, but having a version conflict:

"PHP Fatal error: PDO: driver informix requires PDO API version 20060409;

this is PDO version 20060511 in Unknown on line 0"

The "embedded" PDO that is within PHP since version 5.1 CONFLICTS with the

PDO the  PEAR/PECL modules are expecting.

1) Rebuild PHP with no pdo (--disable-pdo) (and you can't have

  any stuff like --with-mysql-pdo, either)

2) Then use PEAR/PECL to install PDO:  pear install pdo

3) then use PEAR/PECL to install PDO_INFORMIX:

              pear install --alldeps pdo_informix

4) make sure your php.ini extensions_dir points to the directory

   where these are placed

5) then add these references to php.ini:

    extensions=pdo.so

    extensions=pdo_informix.so

    extensions=pdo_mysql.so (etc.)

6) run php -v now and you should not see any errors.

Page 67: Introducción pdo

7) run "pear list" and "pecl list" to see the installed modules

8) run php -i |egrep "pdo|PDO" to see:

php -i |egrep "pdo|PDO"

Configure Command =>  './configure'  '--disable-pdo'

'--with-apxs2=/usr/local/apache2/bin/apxs' '--with-openssl=/usr'

'--enable-force-cgi-redirect' '--with-gd' '--with-jpeg-dir=/usr/lib'

'--with-zlib' '--enable-bcmath' '--enable-mbstring=all' '--with-curl'

PDO

PDO support => enabled

PDO drivers => mysql, informix

pdo_informix

pdo_informix support => enabled

pdo_mysql

PDO Driver for MySQL, client library version => 5.0.51a

I would have tried the embedded PDO and then also --with-informix-pdo=shared but as

an earlier post here showed, the --with-informix... is unknown.  Please correct my

mistake if I am mistyping it.

GOOD LUCK!

David

up

down

0

alan dot acosta at gps dot com dot co

5 years ago

Take care, with php-5.2.4 --with-pdo-informix=shared,/home/informix

 doesn't work, just says: 

Notice: Following unknown configure options were used:

--with-pdo-informix=shared,/home/informix

Funciones de MySQL (PDO_MYSQL)

Introducción

Page 68: Introducción pdo

PDO_MYSQL es un controlador que implementa la interfaz de Objetos de Datos de PHP

(PDO) para permitir el acceso de PHP a bases de datos de MySQL 3.x, 4.x y 5.x.

PDO_MYSQL aprovechará el soporte nativo de sentencias preparadas presente en MySQL 4.1

y superior. Si se utiliza una versión anterior de las bibliotecas cliente de MySQL, PDO las

emulará.

Advertencia

Algunos tipos de tablas (motores de almacenamiento) de MySQL no admiten transacciones.

Cuando se escribe código de base de datos transaccional usando un tipo de tabla que no soporta

transacciones, MySQL aparentará que se inició una transacción éxito. Además, cualquier

consulta DDL ejecutada consignará implícitamente cualquier transacción pendiente.

Instalación

Utilice --with-pdo-mysql[=DIR] para instalar la extensión PDO MySQL, donde la

opción [=DIR] es el directorio base de la instalación de MySQL. Si a [=DIR] se le

pasa mysqlnd, entonces será utilizado el controlador nativo de MySQL.

Opcionalmente, --with-mysql-sock[=DIR] establece la ubicación del puntero del socket de

unix de MySQL para todas las extensiones de MySQL, incluyendo PDO_MYSQL. Si no se

especifica, se buscará en las ubicaciones predeterminadas.

Opcionalmente, --with-zlib-dir[=DIR] se utiliza para establecer la ruta para el prefijo de

instalación de libz.

$ ./configure --with-pdo-mysql --with-mysql-sock=/var/mysql/mysql.sock

El soporte para SSL se habilita mediante las constantes de PDO_MySQL apropiadas, lo cual

es equivalente a llamar a la »   función mysql_ssl_set() de la API en C de MySQL .

Asimismo, SSL no se puede habilitar conPDO::setAttribute, debido a que la conexión ya

existe. Véase también la documentación de MySQL sobre»   conectarse a MySQL con SSL .

Historial de cambios

Versión Descripción

5.4.0 Ya no se da soporte a las librerías cliente de MySQL 4.1 y anteriores.

5.3.9 Agregado el soporte para SSL con mysqlnd y OpenSSL.

5.3.7 Agregado el soporte para SSL con libmysql y OpenSSL.

Constantes predefinidas

Estas constantes están definidas por este controlador, y estarán disponibles sólo cuando la

extensión haya sido compilada con PHP, o bien sea cargada dinámicamente en ejecución.

Además, estas constantes específicas del controlador deberían ser utilizadas sólo si está usando

este controlador. Usar atributos específicos del controlador con otro controlador podría resultar

Page 69: Introducción pdo

en un comportamiento inesperado. PDO::getAttribute() puede ser empleado para obtener el

atributo PDO_ATTR_DRIVER_NAME para verificar el controlador, si el código puede

ejecutarse con múltiples controladores.

MYSQL_ATTR_USE_BUFFERED_QUERY (integer)

Si este atributo es definido como TRUE en PDOStatement, el controlador de MySQL

usará las versiones de la API de MySQL guardadas en el búfer. Si se está escribiendo

código portable, en su lugar se debería usar PDOStatement::fetchAll().

Ejemplo #1 Forzar consultas para que sean guardadas en el búfer en mysql

<?php

if ($bs->getAttribute(PDO::ATTR_DRIVER_NAME) == 'mysql') {

    $sentencia = $bs->prepare('select * from foo',

        array(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true));

} else {

    die("mi aplicación sólo funciona con mysql; debería usar \$sentencia->fetchAll() en s

u lugar");

}

?>

MYSQL_ATTR_LOCAL_INFILE (integer)

Activa LOAD LOCAL INFILE.

Se ha de tener en cuenta que esta constante se puede usar solamente en el

array driver_optionscuando se construye un nuevo gestor de base de datos.

MYSQL_ATTR_INIT_COMMAND (integer)

Comando a ejecutar cuando se conecta al servidor MySQL. Al reconectar se volverá a ejecutar

automáticamente.

Se ha de tener en cuenta que esta constante se puede usar solamente en el

array driver_optionscuando se construye un nuevo gestor de base de datos.

MYSQL_ATTR_READ_DEFAULT_FILE (integer)

Lee las opciones desde el fichero indicado en lugar de my.cnf. Si se usa mysqlnd, esta opción

no está disponible debido a que mysqlnd no lee los fichero de configuración de mysql.

MYSQL_ATTR_READ_DEFAULT_GROUP (integer)

Opciones de lectura del grupo indicado desde my.cnf o desde el fichero especificado

conMYSQL_READ_DEFAULT_FILE. Si se usa mysqlnd, esta opción no está disponible

debido a que mysqlnd no lee los ficheros de configuración de mysql.

MYSQL_ATTR_MAX_BUFFER_SIZE (integer)

Tamaño máximo del búfer. Lo predeterminado es MiB. Esta constante no está admitida cuando

se compila para mysqlnd.

MYSQL_ATTR_DIRECT_QUERY (integer)

Page 70: Introducción pdo

Realiza consultas directas, no usa setencias preparadas.

MYSQL_ATTR_FOUND_ROWS (integer)

Devuelve el número de filas encontradas (coindicentes), no el número de filas modificadas.

MYSQL_ATTR_IGNORE_SPACE (integer)

Permite espacios después de los nombres de función. Hace de todos los nombres de función

palabras reservadas.

MYSQL_ATTR_COMPRESS (integer)

Activa la compresión de comunicación de red. Esta constante no está admitida cuando se

compila para mysqlnd.

MYSQL_ATTR_SSL_CA (integer)

La ruta al fichero de la autoridad certificadora SSL.

Existe a partir de PHP 5.3.7.

MYSQL_ATTR_SSL_CAPATH (integer)

La ruta al directorio que contiene los certificados AC SSL autorizados, los cuales están

almacenados en formato PEM.

Existe a partir de PHP 5.3.7.

MYSQL_ATTR_SSL_CERT (integer)

La ruta al fichero del certificado SSL.

Existe a partir de PHP 5.3.7.

MYSQL_ATTR_CIPHER (integer)

Una lista de uno o más cifradores permisibles a usar para la encriptación SSL, en un formato

entendido por OpenSSL. Por ejemplo: DHE-RSA-AES256-SHA:AES128-SHA

Existe a partir de PHP 5.3.7.

MYSQL_ATTR_KEY (integer)

La ruta al fichero de la clave SSL.

Existe a partir de PHP 5.3.7.

Configuración en tiempo de ejecución

El comportamiento de estas funciones se ve afectado por la configuración de php.ini.

Opciones de configuración de PDO_MYSQL

Nombre Por defecto Cambiable

pdo_mysql.default_socket "/tmp/mysql.sock" PHP_INI_SYSTEM

pdo_mysql.debug NULL PHP_INI_SYSTEM

Para más detalles y definiciones de los modos de PHP_INI_*, vea Dónde se puede realizar

un ajuste de configuración.

Page 71: Introducción pdo

He aquí una breve explicación de las directivas de configuración.

pdo_mysql.default_socket string

Establece un socket de dominio Unix. Este valor se puede establecer en tiempo de compilación

si un socket de dominio se encuentra en la configuración. Este ajuste ini es sólo de Unix.

pdo_mysql.debug boolean

Activa la depuración de PDO_MYSQL. Este ajuste solo está disponible cuando PDO_MYSQL

está compilado para mysqlnd y en el modo de depuración de PDO.

Tabla de contenidos

PDO_MYSQL DSN — Conectarse a bases de datos de MySQL

PDO_MYSQL DSN DSN de PDO_INFORMIX

[edit] Last updated: Fri, 25 Jan 2013

 

   add a noteUser Contributed Notes MySQL (PDO) - [11 notes]

up

down

1

david at manifestwebdesign dot com

1 year ago

The SSL options are silently ignored in PHP 5.3.8, see https://bugs.php.net/bug.php?

id=55870

Looks like it's addressed upstream, I just want to save others the hour and a half I just

wasted :)

up

down

1

curt at webmasterbond dot com

1 year ago

Today's PHP snapshot now has SSL support for PDO. Follow the directions here

(http://dev.mysql.com/doc/refman/5.0/en/secure-create-certs.html ) to set up MySQL

and then use the following connection options:

<?php

$pdo = new PDO(

Page 72: Introducción pdo

    'mysql:host=hostname;dbname=ssldb',

    'username',

    'password',

    array(

        PDO::MYSQL_ATTR_SSL_KEY    =>'/path/to/client-key.pem',

        PDO::MYSQL_ATTR_SSL_CERT=>'/path/to/client-cert.pem',

        PDO::MYSQL_ATTR_SSL_CA    =>'/path/to/ca-cert.pem'

    )

);

?>

up

down

1

brian at diamondsea dot com

4 years ago

SQLSTATE[HY000]: General error: 2014 Cannot execute queries while other

unbuffered queries are active. ...

After spending hours trying to track down why we were getting this error on a new

server, after the same code ran fine on other servers, we found the problem to be an

old MySQL _client_ library running on our web server, and a latest-version MySQL

_server_ running on the database server's box.

Upgraded the MySQL client on the web server to the current revision and the problem

went away.

up

down

1

konrads dot smelkovs at gmail dot com

5 years ago

A note for the eager:

There is no way how to get returned row count from an executed prepared statement

without fetching the rows.

up

down

1

davey at php dot net

Page 73: Introducción pdo

5 years ago

To use "PDO::MYSQL_ATTR_USE_BUFFERED_QUERY" you should call

PDO::setAttribute("PDO::MYSQL_ATTR_USE_BUFFERED_QUERY", true);

It will not work when passed into PDO::prepare()

- Davey

up

down

1

dibakar at talash dot net

6 years ago

PDO is much better option for calling procedures, views or triggers of mysql 5.x

versions from PHP instead of using mysqli extension. Following is a simple demo script

which can  help anybody on how to call and use mysql procedures through php

try {

        $dbh = new PDO('mysql:host=xxx;port=xxx;dbname=xxx', 'xxx', 'xxx',

array( PDO::ATTR_PERSISTENT => false));

        $stmt = $dbh->prepare("CALL getname()");

        // call the stored procedure

        $stmt->execute();

        echo "<B>outputting...</B><BR>";

        while ($rs = $stmt->fetch(PDO::FETCH_OBJ)) {

            echo "output: ".$rs->name."<BR>";

        }

        echo "<BR><B>".date("r")."</B>";

    

    } catch (PDOException $e) {

        print "Error!: " . $e->getMessage() . "<br/>";

        die();

    }

up

down

Page 74: Introducción pdo

0

miller_kurt_e at yahoo dot com

4 years ago

SQLSTATE[HY000]: General error: 2014 Cannot execute queries while other

unbuffered queries are active. ... 

This one can be a royal pain to deal with.  Never stack statements to be executed in

one go.  Nobody ever mentions this possibility in all the posts I've seen dealing with

this error. 

This example is a Zend Framework example but the theory is the same. 

As in: 

<?php 

$sql = <<<____SQL 

     CREATE TABLE IF NOT EXISTS `ticket_hist` ( 

       `tid` int(11) NOT NULL, 

       `trqform` varchar(40) NOT NULL, 

       `trsform` varchar(40) NOT NULL, 

       `tgen` datetime NOT NULL, 

       `tterm` datetime, 

       `tstatus` tinyint(1) NOT NULL 

     ) ENGINE=ARCHIVE COMMENT='ticket archive'; 

     CREATE TABLE IF NOT EXISTS `request_hist` ( 

       `rqid` int(11) NOT NULL, 

       `rqtid` int(11) NOT NULL, 

       `rqsid` int(11) NOT NULL, 

       `rqdate` datetime NOT NULL, 

       `rqcode` tinyint(1) NOT NULL, 

       `rssid` int(11) NOT NULL, 

       `rsdate` datetime, 

       `rscode` tinyint(1) 

     ) ENGINE=ARCHIVE COMMENT='request archive'; 

     CREATE TABLE IF NOT EXISTS `relay_hist` ( 

       `rqid` int(5) NOT NULL, 

       `sdesc` varchar(40) NOT NULL, 

Page 75: Introducción pdo

       `rqemail` varchar(40) NOT NULL, 

       `sid` int(11) NOT NULL, 

       `rlsid` int(11) NOT NULL, 

       `dcode` varchar(5) NOT NULL 

     ) ENGINE=ARCHIVE COMMENT='relay archive'; 

____SQL; 

$result = $this->db->getConnection()->exec($sql); 

?> 

This will run fine but PDO will balk with the 'unbuffered' error if you follow this with

another query. 

Instead do: 

<?php 

$sql = <<<____SQL 

     CREATE TABLE IF NOT EXISTS `ticket_hist` ( 

       `tid` int(11) NOT NULL, 

       `trqform` varchar(40) NOT NULL, 

       `trsform` varchar(40) NOT NULL, 

       `tgen` datetime NOT NULL, 

       `tterm` datetime, 

       `tstatus` tinyint(1) NOT NULL 

     ) ENGINE=ARCHIVE COMMENT='ticket archive'; 

____SQL; 

$result = $this->db->getConnection()->exec($sql); 

$sql = <<<____SQL 

     CREATE TABLE IF NOT EXISTS `request_hist` ( 

       `rqid` int(11) NOT NULL, 

       `rqtid` int(11) NOT NULL, 

       `rqsid` int(11) NOT NULL, 

       `rqdate` datetime NOT NULL, 

       `rqcode` tinyint(1) NOT NULL, 

       `rssid` int(11) NOT NULL, 

       `rsdate` datetime, 

       `rscode` tinyint(1) 

Page 76: Introducción pdo

     ) ENGINE=ARCHIVE COMMENT='request archive'; 

____SQL; 

$result = $this->db->getConnection()->exec($sql); 

$sql = <<<____SQL 

     CREATE TABLE IF NOT EXISTS `relay_hist` ( 

       `rqid` int(5) NOT NULL, 

       `sdesc` varchar(40) NOT NULL, 

       `rqemail` varchar(40) NOT NULL, 

       `sid` int(11) NOT NULL, 

       `rlsid` int(11) NOT NULL, 

       `dcode` varchar(5) NOT NULL 

     ) ENGINE=ARCHIVE COMMENT='relay archive'; 

____SQL; 

$result = $this->db->getConnection()->exec($sql); 

?> 

Chopping it into individual queries fixes the problem.

up

down

0

practicegoodtheory at gmail dot com

4 years ago

On Windows, with Apache, it would not load php_pdo_mysql.dll until I put libmysql.dll in

Apache's dll path (e.g. apache/bin)

up

down

0

rmottey at gmail dot com

5 years ago

I have been getting the error below when performing multiple queries within a single

page.

Setting the attribute below did not seem to work for me.

So building on previous example i am initilizing my stmt  variable on every query and a

fetch all into an array. Seems to be working for me.

Page 77: Introducción pdo

Error:

PDO Error 1.1: Array ( [0] => xxx[1] => yyy[2] => Lost connection to MySQL server

during query )

Fix:

(PDO::setAttribute("PDO::MYSQL_ATTR_USE_BUFFERED_QUERY", true);)

<?

try {

        $dbh = new PDO('mysql:host=xxx;port=xxx;dbname=xxx', 'xxx', 'xxx',

array( PDO::ATTR_PERSISTENT => false));

 $stmt = $dbh->prepare("CALL getname()");

        // call the stored procedure

        $stmt->execute();

      // fetch all rows into an array.

       $rows = $stmt->fetchAll();

       foreach ($rows as $rs) 

    {

          $id = $rs['id'];

         }

//initilise the statement

unset($stmt);

$stmt = $dbh->prepare("call secondprocedure(?);");

$stmt->bindValue(1, $id);

if ( ! $stmt->execute() )

{

    echo "PDO Error 1.1:\n";

    print_r($stmt->errorInfo());

    exit;

}

unset($stmt);

} catch (PDOException $e) {

        print "Error!: " . $e->getMessage() . "<br/>";

Page 78: Introducción pdo

        die();

    }

?>

up

down

-1

marty at excudo dot net

5 years ago

Davey wrote:

> To use "PDO::MYSQL_ATTR_USE_BUFFERED_QUERY" you should call

> PDO::setAttribute("PDO::MYSQL_ATTR_USE_BUFFERED_QUERY", true);

>

>It will not work when passed into PDO::prepare()

>

> - Davey

Almost correct. It should be:

PDO::setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true);

so, without the quotes.

otherwise it still won't work :)

up

down

-2

bratwizard at yahoo dot com

5 years ago

> konrads dot smelkovs at gmail dot com

> 18-Jul-2007 03:39

> A note for the eager:

>> There is no way how to get returned row count from an executed prepared

statement without fetching the rows.

Sure there is, just do something like this:

if ($sth = $pdo->prepare($sql)) {

    $sth->execute($values);

Page 79: Introducción pdo

    $sth->fetch();

    // get count of rows in result set

   if ($sth_rc = $this->getDataset()->query('SELECT FOUND_ROWS()')) {

        $row_count = $sth_rc->fetchColumn(0);

        }

    }

Funciones de Microsoft SQL Server (PDO_SQLSRV)

Introducción

PDO_SQLSRV es un controlador que implementa la interfaz de Objetos de Datos de PHP

(PDO) para habilitar el acceso desde PHP a bases de datos de MS SQL Server (comenzando

con SQL Server 2005) y de SQL Azure.

Instalación

La extesnión PDO_SQLSRV se habilitada añadiendo el fichero DLL apropiado al directorio de

extensiones de PHP y la entrada correspondiente al fichero php.ini. La descarga de

PDO_SQLSRV viene con ocho ficheros de controlador, cuatro de los cuales son para dar

soporte a PDO. Si se está ejecutando PHP como no seguro con subprocesos (PHP 5.3), use el

fichero php_pdo_sqlsrv_53_nts.dll. (Debería de usarse una versión no segura con subprocesos si

se utiliza IIS como servidor web). Si se está ejecutando PHP como seguro con subprocesos, use

el fichero php_pdo_sqlsrv_53_ts.dll. De manera similar para PHP 5.4, use

php_pdo_sqlsrv_54_nts.dll o php_pdo_sqlsrv_54_ts.dll, dependiendo de si la instalación de

PHP no es o es segura con subprocesos.

La versión más reciente del controlador está disponible aquí: »   Descarga de SQLSRV 3.0 . Si

fuera necesario dar soporte paraor PHP 5.2 y/o PHP compilado con VC6, use la versión 2.0 del

controlador: »   Descarga de SQLSRV 2.0 .

Para más información sobre los requisitos del sistema, véase »   Requisitos del sistema de

SQLSRV.

La extensión PDO_SQLSRV solamente es compatible con PHP ejecutándose bajo Windows.

Para Linux, véaseODBC y »   Microsoft's SQL Server ODBC Driver para Linux .

Constantes predefinidas

Estas constantes están definidas por este controlador, y estarán disponibles sólo cuando la

extensión haya sido compilada con PHP, o bien sea cargada dinámicamente en ejecución.

Además, estas constantes específicas del controlador deberían ser utilizadas sólo si está usando

este controlador. Usar atributos específicos del controlador con otro controlador podría resultar

en un comportamiento inesperado. PDO::getAttribute() puede ser empleado para obtener el

Page 80: Introducción pdo

atributo PDO_ATTR_DRIVER_NAME para verificar el controlador, si el código puede

ejecutarse con múltiples controladores.

PDO::SQLSRV_TXN_READ_UNCOMMITTED (integer)

Esta constante es un valor aceptable para la clave TransactionIsolation del DSN de

SQLSRV. Esta constante establece el nivel de aislamiento para la conexión a Read

Uncommitted.

PDO::SQLSRV_TXN_READ_COMMITTED (integer)

Esta constante es un valor aceptable para la clave TransactionIsolation del DSN de

SQLSRV. Esta constante establece el nivel de aislamiento para la conexión a Read

Committed.

PDO::SQLSRV_TXN_REPEATABLE_READ (integer)

Esta constante es un valor aceptable para la clave TransactionIsolation del DSN de

SQLSRV. Esta constante establece el nivel de aislamiento para la conexión a

Repeateable Read.

PDO::SQLSRV_TXN_SNAPSHOT (integer)

Esta constante es un valor aceptable para la clave TransactionIsolation del DSN de

SQLSRV. Esta constante establece el nivel de aislamiento para la conexión a

Snapshot.

PDO::SQLSRV_TXN_SERIALIZABLE (integer)

Esta constante es un valor aceptable para la clave TransactionIsolation del DSN de

SQLSRV. Esta constante establece el nivel de aislamiento para la conexión a

Serializable.

PDO::SQLSRV_ENCODING_BINARY (integer)

Specifies that data is sent/retrieved as a raw byte stream to/from the server without

performing encoding or translation. This constant can be passed to

PDOStatement::setAttribute, PDO::prepare, PDOStatement::bindColumn, and

PDOStatement::bindParam.

PDO::SQLSRV_ENCODING_SYSTEM (integer)

Specifies that data is sent/retrieved to/from the server as 8-bit characters as specified

in the code page of the Windows locale that is set on the system. Any multi-byte

characters or characters that do not map into this code page are substituted with a

single byte question mark (?) character. This constant can be passed to

PDOStatement::setAttribute, PDO::setAttribute, PDO::prepare,

PDOStatement::bindColumn, and PDOStatement::bindParam.

PDO::SQLSRV_ENCODING_UTF8 (integer)

Specifies that data is sent/retrieved to/from the server in UTF-8 encoding. This is the

default encoding. This constant can be passed to PDOStatement::setAttribute,

Page 81: Introducción pdo

PDO::setAttribute, PDO::prepare, PDOStatement::bindColumn, and

PDOStatement::bindParam.

PDO::SQLSRV_ENCODING_DEFAULT (integer)

Specifies that data is sent/retrieved to/from the server according to

PDO::SQLSRV_ENCODING_SYSTEM if specified during connection. The connection's

encoding is used if specified in a prepare statement. This constant can be passed to

PDOStatement::setAttribute, PDO::setAttribute, PDO::prepare,

PDOStatement::bindColumn, and PDOStatement::bindParam.

PDO::SQLSRV_ATTR_QUERY_TIMEOUT (integer)

A non-negative integer representing the timeout period, in seconds. Zero (0) is the

default and means no timeout. This constant can be passed to

PDOStatement::setAttribute, PDO::setAttribute, and PDO::prepare.

PDO::SQLSRV_ATTR_DIRECT_QUERY (integer)

Indicates that a query should be executed directly, without being prepared. This

constant can be passed to PDO::setAttribute, and PDO::prepare. For more information,

see »   Direct and Prepared Statement Execution .

Tabla de contenidos

DSN de PDO_SQLSRV — Conectar a bases de datos de MS SQL Server y de SQL Azure

Funciones de Oracle (PDO_OCI)

Introducción

Advertencia

Esta extensión es EXPERIMENTAL. Esto significa que el comportamiento de esta extensión,

los nombres de sus funciones y todo lo documentado sobre esta extensión, puede cambiar en

una futura edición de PHP sin previo aviso. El uso de esta extensión queda bajo su propia

responsabilidad.

PDO_OCI es un controlador que implementa la interfaz de Objetos de Datos de PHP

(PDO) para habilitar el acceso desde PHP a bases de datos de Oracle a través de la biblioteca

OCI.

Instalación

Utilice --with-pdo-oci[=DIR] para instalar la extensión PDO Oracle OCI, donde el

opcional [=DIR] es el directorio base de la instalación de Oracle. [=DIR] por defecto es la

variable de entorno $ORACLE_HOME.

Utilice --with-pdo-oci=instantclient,prefijo,versión para un cliente de la Instancia

Oracle SDK, donde prefijo y versión se configuran.

// Usando $ORACLE_HOME

$ ./configure --with-pdo-oci

Page 82: Introducción pdo

// Usando OCI para Linux con la versión 10.2.0.3 con un prefijo /usr

$ ./configure --with-pdo-oci=instantclient,/usr,10.2.0.3

Tabla de contenidos

DSN de PDO_OCI — Conectar a bases de datos de Oracle

DSN de PDO_OCI DSN de PDO_SQLSRV

[edit] Last updated: Fri, 25 Jan 2013

 

   add a noteUser Contributed Notes Oracle (PDO) - [10 notes]

up

down

0

php at ideacode dot com

1 year ago

If you're getting the "I'm too dumb to find oci.h" error, try creating a variety of paths. 

One variety uses just the major and minor of your OIC version (eg, 11.2 for 11.2.0.2)

and another variety uses client64 as well as client.

Something like this (for 11.2.0.2):

ln -s /usr/include/oracle/11.2.0.2/ /usr/include/oracle/11.2

ln -s /usr/include/oracle/11.2/client /usr/include/oracle/11.2/client64

ln -s /usr/lib/oracle/11.2.0.2/ /usr/lib/oracle/11.2

ln -s /usr/lib/oracle/11.2/client /usr/lib/oracle/11.2/client64

This should cover your bases for 64-bit systems, as well as PHP patched to use the

major.minor version number only.  See also PHP bug #44989.

up

down

0

redlorry919 at gmail dot com

1 year ago

Take note of the note at the top, this really is an experimental extension. I had a

problem trying to read data from Oracle which resulted in some strange behaviour in

Page 83: Introducción pdo

PHP. i.e. foreach loops not ending, with no error messages. I also managed to get the

data from Oracle into an array in PHP, but then couldn't return the array from a

function. 

After pulling my hair out for a day, it turned out to be a CLOB column in Oracle that

caused the strange behaviour in PHP. I assume this extension doesn't fully support

them. 

Instead I've typecast it within the SQL to a VARCHAR2 which seems to resolve it: 

SELECT CAST(columnx AS VARCHAR2(4000)) AS columnx ... 

It might help someone else having similar issues.

up

down

0

geompse at gmail dot com

2 years ago

Notice the red block at the beginning of this page... pdo_oci is HIGHLY experimental.

Even though it is under dev from 2004, it lakes today support for things that _do_

matters :

 - bind a varchar2 of 3500 chars 

 - get selected metas

 - left join with blobs/clobs

 - etc.

For the story, since we use pdo_pgsql in our software, I thought it would be viable to

use pdo_oci for running under Oracle. After a long battle, I finally won :

1) If requested driver has a non-experimental pdo version available, use it.

2) else (well, for pdo_oci at least), use an abstraction layer of your own.

3) you're done.

What I did in more details...

2 "main" classes for being compliant with "$obj instanceof PDO" or such :

Page 84: Introducción pdo

 - class PhpDb extends PDO

 - class PhpDbStatement extends PDOStatement

2 "abstract" classes that defines what PDO actually does :

 - abstract class PhpDbAbstract

 - abstract class PhpDbAbstractStatement

And at last for each driver, 2 classes doing the abstraction :

 - class PhpDbDriverOracle extends PhpDbAbstract

 - class PhpDbDriverOracleStatement extends PhpDbAbstractStatement

"main" classes are accessed from your script, simply replace "new PDO" with "new

PhpDb".

"abstract" classes are mainly there for the documentation :p

"driver" classes do the job in background, they are instances by the main classes.

My PhpDb will be in an open source project sooner or later, search google or mail me !

up

down

0

av01 at bugfix dot cc

2 years ago

In order to get this compiled on my CentOS 5.4 x86_64 box, I had to do some extra

settings that might be useful for others:

Install oracle-instantclient11.2-basic and oracle-instantclient11.2-devel RPMs from

Oracle

Create some symbolic links because configure contains some outdated assumptions

about path names and doesn't care about 64-bit systems:

ln -s /usr/lib/oracle/11.2/client64 /usr/lib/oracle/11.2/client

ln -s /usr/include/oracle/11.2/client64  /usr/lib/oracle/11.2/client/include

Add the following to your configure command:

--with-pdo-oci=shared,instantclient,/usr,11.2

up

down

0

sixd at php dot net

Page 85: Introducción pdo

3 years ago

From the PHP 5.3 UPGRADING file:

- The PDO_OCI php_pdo_oci8.dll library (for use with Oracle version 8 client

  libraries) is no longer being built [with PHP 5.3]. Instead, use php_pdo_oci.dll (note no

  '8') with Oracle 10 or 11 client libraries. Connection to other database

  versions is still supported.

up

down

0

fernando dot wendt at gmail dot com

4 years ago

To enable PDO support on PHP for Oracle Instant Client 11.1.x, you should follow the

syntax above in the compile command, just as pointed by

Andrew http://bugs.php.net/bug.php?id=39312,taking by default you have installed the

OIC at /usr/lib/oracle (instant client and sdk at subfolder):

./configure --with-oci8=shared,instantclient,/usr/lib/oracle

--with-pdo-oci=instantclient,/usr/lib/oracle,11.1

Just saying your release version from the Oracle OIC.

It compiles fine then.

Best regards.

up

down

0

ken at xpressconnex dot com

4 years ago

Wow, cursade.  That's a lot of typing to use the lite client.

Try this:

$db = '//hostname/servicename'; //e.g. '//192.168.1.1/orcl'

$user = 'username';

$pass = 'password';

Page 86: Introducción pdo

$conn = new PDO($db,$user,$pass);

up

down

0

moc.aciremi@yvelj

6 years ago

A Statement of Warning:

PDO::oci does not support REF CURSORS.

This is mentioned nowhere (until now!) on this page. 

And now you know!

If you want ref cursors avoid PDO for now. 

My Reference for this claim:

http://www.oracle.com/technology/pub/articles/

php_experts/otn_pdo_oracle5.html

GREAT article, excellent piece, really. It's not clear to me 

how old this document is, but it must have some dust on it, 

given it's references to "PHP5.1 ...' which is a little way off yet' "

... as of 2006-06-01, PHP5.1 has been with us for quite some time.

up

down

0

cursade at hotmail dot com

6 years ago

if oracle and oracle instant client has been installed,

without db in the same host

For UNIX/LINUX,set $LD_LIBRARY_PATH

appent your instant client path  and  client/lib path to it,

For windows set PATH like this

Page 87: Introducción pdo

After set the path ,set TNS_ADMIN everioment ,point to 

where  tnsnames.ora located.

Then,you can use service name to connect to your Database

Test coding

<?php

$param = $_POST;

$db_username = "youusername";

$db_password = "yourpassword";

$db = "oci:dbname=yoursid";

$conn = new PDO($db,$db_username,$db_password);

$name = $param['module'];

$file = $param['file'];

$stmt = $conn->exec("INSERT INTO AL_MODULE (AL_MODULENAME,

AL_MODULEFILE) VALUES ('$name', '$file')");

?>

up

down

0

cursade at hotmail dot com

6 years ago

If instant client has been installed but the full oracle client

not yet ,you can use pdo to connect to oracle database

like following coding:

<?php

$tns = "  

(DESCRIPTION =

    (ADDRESS_LIST =

      (ADDRESS = (PROTOCOL = TCP)(HOST = yourip)(PORT = 1521))

    )

    (CONNECT_DATA =

      (SERVICE_NAME = orcl)

Page 88: Introducción pdo

    )

  )

       ";

$db_username = "youname";

$db_password = "yourpassword";

try{

    $conn = new PDO("oci:dbname=".$tns,$db_username,$db_password);

}catch(PDOException $e){

    echo ($e->getMessage());

}

?>

Funciones de ODBC y DB2 (PDO_ODBC)

Introducción

PDO_ODBC es un controlador que implementa la interfaz de Objetos de datos de PHP

(PDO) para habilitar el acceso desde PHP a bases de datos a través de contorladores ODBC o

de la biblioteca IBM DB2 Call Level Interface (DB2 CLI). PDO_ODBC admite actualmente

tres "sabores" diferentes de controladores de bases de datos:

ibm-db2

Da soporte para el acceso a servidores de IBM DB2 Universal Database, Cloudscape, y Apache

a través del cliente gratuito DB2.

unixODBC

Da soporte para el acceso a servidores de bases de datos a través del administrador de gestores

de unixODBC y de los controladores de ODBC proppietarios de bases de datos.

generic

Ofrece una opción de compilación para los administradores de gestores de ODBC que no están

admitidos explícitamente pore PDO_ODBC.

En Windows, PDO_ODBC está construido dentor del núcleo de PHP de manera

predeterminada. Está vinculado con Windows ODBC Driver Manager, por lo que PHP puede

conectarse a cualquier base de datos catalogada en un DSN de sistema, y es el controlador

recomendado para conectarse a bases de datos de Microsoft SQL Server.

Instalación

PDO_ODBC en sistemas UNIX

A partir de PHP 5.1, PDO_ODBC está incluido en los ficheros fuente de PHP. Se puede

compilar la extensión PDO_ODBC como un módulo estático o compartido usando los

siguientes comandosconfigure.

Page 89: Introducción pdo

ibm_db2

./configure --with-pdo-odbc=ibm-db2,/opt/IBM/db2/V8.1/

Para contruir PDO_ODBC con el sabor ibm-db2, se han de tener instaladas previamente las

cabeceras de desarrollo de aplicaciones de DB2 en la misma máquina en la que se compile

PDO_ODBC. Las cabeceras de desarrollo de aplicaciones de DB2 son una opción instalable en

los servidores de DB2, y también están disponibles como parte de DB2 Application

Development Client, disponible para descargar gratuitamente desde el »   sitio de soporte  de

IBM DB2 Universal Database.

Si no se proporciona una ubicación para las bibliotecas y cabeceras de DB2 al

comando configure, PDO_ODBC usará como valor predeterminado /home/db2inst1/sqllib.

unixODBC

./configure --with-pdo-odbc=unixODBC,/usr/local

Si no se proporciona una ubicación para las bibliotecas y cabecerasd de unixODBC al

comandoconfigure, PDO_ODBC usará como valor predetermiando /usr/local.

generic

./configure --with-pdo-odbc=generic,/usr/local,libname,ldflags,cflags

Configuración en tiempo de ejecución

El comportamiento de estas funciones se ve afectado por la configuración de php.ini.

Opciones de configuración de PDO_ODBC

NombrePor

defectoCambiable Historial de cambios

pdo_odbc.connection_pooling "strict" PHP_INI_ALL Disponible desde PHP 5.1.0.

pdo_odbc.db2_instance_name NULL PHP_INI_SYSTEM

Disponible desde PHP 5.1.1. Esta

característica

obsoleta será eliminada con certeza

en el futuro.

Para más detalles y definiciones de los modos de PHP_INI_*, vea Dónde se puede realizar

un ajuste de configuración.

He aquí una breve explicación de las directivas de configuración.

pdo_odbc.connection_pooling string

Si agrupar conexiones de ODBC. Se puede usar "strict", "relaxed" o "off" (que es igual

a ""). El parámetro describe cómo de estricta debería ser el administrador de conexiones cuando

coincidan los parámetros de conexión con conexiones existentes en la agrupación. strict es el

valor predetermiando recomendado, y dará como resultado en el uso de conexiones

Page 90: Introducción pdo

almacenadas en caché solamente cuando todos los parámetros de conexión coincidan

exactamente. relaxed dará como resultado el uso de conexiones almacenadas en caché cuando

se utilicen parámetros de conexión similares. Esto puede resultar en el aumento del uso de la

caché, con el riesgo de perder información de conexión entre (por ejemplo) hosts virtuales.

Este ajuste solamente se puede cambiar desde el fichero php.ini, y afecta al proceso completo;

cualquier otro módulo dentro del proceso que utilice las mismas bibliotescas de ODBC también

se verá afectado, incluyendo la Extensión ODBC Unificada.

Advertencia

relaxed no debería usarse en servidores compartidos, por razones de seguridad.

Sugerencia

Deje este ajuste a la configuración strict predeterminada a menos que tenga una buena razón

para cambiarlo.

pdo_odbc.db2_instance_name string

Si se compila PDO_ODBC usando el sabor db2, este ajuste establece el valor de la variable de

entorno DB2INSTANCE en sistemas operativos Linux y UNIX al nombre especificado de la

instancia de DB2. También habilita PDO_ODBC para resolver la ubicación de las bibliotecas de

DB2 y realizar conexiones catalogadas a bases de datos DB2.

Este ajuste solamente se puede cambiar desde el fichero php.ini, y afecta al proceso completo;

cualquier otro módulo dentro del proceso que utilice las mismas bibliotescas de ODBC también

se verá afectado, incluyendo la Extensión ODBC Unificada.

Este ajuste no tiene efecto en Windows.

Tabla de contenidos

DSN de PDO_ODBC — Conectarse a bases de datos de ODBC o de DB2

DSN de PDO_ODBC DSN de PDO_OCI

[edit] Last updated: Fri, 25 Jan 2013

 

   add a noteUser Contributed Notes ODBC y DB2 (PDO) - [4 notes]

up

down

1

harry dot forum at p-boss dot com

2 years ago

Page 91: Introducción pdo

MSSQL - PHP on Apache - Linux Redhat

When using php 5.2.10 please beaware of this error:

http://bugs.php.net/bug.php?id=42068

Standard odbc_connect will not work, you must use pdo_odbc

Connecting to MSSQL using pdo odbc - walkthrough.. 

1. Download and configure FreeTDS with-unixodbc

./configure --prefix=/opt/SYSfreetds --with-unixodbc

make;make test; make install

2. install php-odbc and unixODBC

         php-odbc-5.2.10-1.x86_64.rpm

         unixODBC.x86_64.x86x64

3. Setup ODBC links

a)

Create a tds.driver file with the following contents

  [FreeTDS]

  Description     = v0.63 with protocol v8.0

  Driver          = /opt/SYSfreetds/lib/libtdsodbc.so

Register the ODBC driver - the tds.driver file

  odbcinst -i -d -f tds.driver

b)

Creating a tds.datasource file - ODBC Data Source with contents:

Page 92: Introducción pdo

  [SOURCENAME]

  Driver=FreeTDS

  Description=Test MS SQL Database with FreeTDS

  Trace=No

  Server=BobTheServer

  Port=1433

  TDS Version=8.0

  Database=youDBname

Register the ODBC data source

  odbcinst -i -s -f tds.datasource

Beware that the odbc.ini file will be installed in the current users home directory. This

may need to be used if you are using a webserver as the apache home directory could

be different.

Ensure .odbc.ini is in apaches home directory, possibly "/var/www"

4. Test the ODBC link on the command line

  isql -v SOURCENAME 'username' 'password'

  +---------------------------------------+

  | Connected!                            |

  |                                       |

  | sql-statement                         |

  | help [tablename]                      |

  | quit                                  |

  |                                       |

  +---------------------------------------+

 SQL>

5. Edit /etc/php.ini

  Make sure the following is set:

     mssql.secure_connection = On

Page 93: Introducción pdo

 

6. Restart apache gracefully

7. PHP to run:

  <?

  $dbh= new PDO('odbc:SOURCENAME', 'username', 'password');

  $stmt = $dbh->prepare("$query");

  $stmt->execute();

  while ($row = $stmt->fetch()) {

      print_r($row);

  }

  unset($dbh); unset($stmt);

  ?>

Trouble-shooting:

Please try strace/ truss if you encounter issues. It could be you are referencing wrong

libraries somewhere.

Ensure you have restarted apache once the odbc files are in place

up

down

0

Ariz Jacinto

1 year ago

Using SQL Server Native Client 11.0 on Linux as a PDO_ODBC driver: 

Download the SQL Server Native Client 11.0 on Linux ODBC Driver: 

http://www.microsoft.com/download/en/details.aspx?id=28160 

Configuration ODBC: 

/usr/local/etc/odbcsys.ini 

-- 

[SQL Server Native Client 11.0] 

Page 94: Introducción pdo

Description = Microsoft SQL Server ODBC Driver V1.0 for Linux 

Driver = /opt/microsoft/sqlncli/lib64/libsqlncli-11.0.so.1720.0 

UsageCount = 1 

/usr/local/etc/odbc.ini 

-- 

[MSSQLServer] 

Driver = SQL Server Native Client 11.0 

Description = Sample Database 

Trace = Yes 

Server = 

Port = 1433 

Database = 

Test the connection: 

mssqltest.php 

-- 

<?php 

    putenv('ODBCSYSINI=/usr/local/etc'); 

    putenv('ODBCINI=/usr/local/etc/odbc.ini'); 

    $username = ""; 

    $password = ""; 

    try { 

      $dbh = new PDO("odbc:MSSQLServer", 

                    "$username", 

                    "$password" 

                   ); 

    } catch (PDOException $exception) { 

      echo $exception->getMessage(); 

      exit; 

    } 

    echo var_dump($dbh); 

    unset($dbh); 

?>

up

down

0

Page 95: Introducción pdo

tuomas

3 years ago

If you want to avoid installing DB2 Connect and/or PECL modules ibm_db2 and

PDO_IBM, you can also use IBM DB2 databases trough unixODBC.

If you have DB2 database on a i server you need to install IBM iAccess

(http://www.ibm.com/systems/i/software/access/linux/index.html) and unixODBC. Just

install the libraries (rpm) and modify configurations in /etc/odbcinst.ini (sample

configuration in /opt/ibm/iSeriesAccess/unixodbcregistration) and /etc/odbc.ini.

To my experience this is much easier way than installing DB2 Connect.

up

down

0

ethan dot nelson at ltd dot org

4 years ago

Using SQL 2005, PDO_ODBC and datetime fields is a royal pain.  MSDN

documentation on CAST CONVERT shows that there is supposed to be an implicit

convert between character types and datetime types.  That's true... until you put it in a

stored procedure and use variable declarations.

For instance this fails:

declare @date varchar;

SET @date = '20080101';

SELECT cast(@date AS datetime) AS poo

While this succeeds:

declare @date varchar(19);

SET @date = '20080101';

SELECT cast(@date AS datetime) AS poo

The PDO Driver appears to attempt an implicit conversion and so it fails whenever you

try to insert data into datetime column types.

So to workaround this nuance in SQL, declare a character column type with explicit

width.  Then your implicit type conversion will work.

Page 96: Introducción pdo

Funciones PostgreSQL (PDO_PGSQL)

Introducción

PDO_PGSQL es un controlador que implementa la interfaz PHP Data Objects (PDO) para

permitir el acceso desde PHP a bases de datos PostgreSQL.

Tipos de recursos

Esta extensión define un recurso de secuencia retornado por PDO::pgsqlLOBOpen().

Instalación

Utilice --with-pdo-pgsql[=DIR] para instalar la extensión PDO PostgreSQL, donde el

opcional [=DIR] es el directorio base de la instalación de PostgreSQL, o la ruta a pg_config.

$ ./configure --with-pdo-pgsql

Tabla de contenidos

PDO_PGSQL DSN — Conectarse a bases de datos PostgreSQL

PDO::pgsqlLOBCreate — Crea un nuevo objeto grande

PDO::pgsqlLOBOpen — Abre un flujo de un objeto grande existente

PDO::pgsqlLOBUnlink — Elimina un objeto grande

Funciones de SQLite (PDO_SQLITE)

Introducción

PDO_SQLITE es un controlador que implementa la interfaz Objetos de Datos de PHP

(PDO, siglas en inglés de PHP Data Objects) para habilitar el acceso a bases de datos de

SQLite 3.

En PHP 5.1, la extensión SQLite también proporciona un controlador para bases de datos de

SQLite 2; aunque no es técnicamente una parte del controlador PDO_SQLITE, se comporta de

manera similar, por lo que está documentado codo con codo. El controlador SQLite 2 para PDO

es proporcionado pricipalmente para hacer más la importación de ficheros de bases de datos

atiguos de SQLite a una aplicación que utilice el controlador SQLite 3 más rápido y más

eficiente. Como consecuencia, el controlador SQLite 2 no tiene unas características tan ricas

como el controlador SQLite 3.

Nota:

PDO_SQLITE permite usar cadenas aparte de flujos junto con PDO::PARAM_LOB.

Instalación

El controlador PDO_SQLITE PDO está habilitado por omisión. Para deshabilitarlo, se puede

usar --without-pdo-sqlite[=DIR] , donde el parámetro opcional [=DIR] es el directorio base

de instalación de sqlite.

Tabla de contenidos

PDO_SQLITE DSN — Conectar a las bases de datos de SQLite

Page 97: Introducción pdo

PDO::sqliteCreateAggregate — Registra una función acumuladora definida por el usuario

para usarla en sentencias SQL

PDO::sqliteCreateFunction — Registra una función definida por el usuario para utilizarla en

sentencias SQL

PDO_SQLITE DSN PDO::pgsqlLOBUnlink

[edit] Last updated: Fri, 25 Jan 2013

 

   add a noteUser Contributed Notes SQLite (PDO) - [6 notes]

up

down

2

nospam8715 at dririan dot com

2 months ago

Instead of compiling an old version of SQLite to create a database using an older

database format that the version of SQLite bundled with PDO can handle, you can

(much more easily) just run the query "PRAGMA legacy_file_format = TRUE;"

BEFORE creating the database (if you have an existing database, run ".dump" from the

sqlite shell on your database, run the sqlite shell on a new database, run the PRAGMA,

then paste the contents of the .dump). That will ensure SQLite creates a database

readable by SQLite 3.0 and later.

up

down

0

gmac63 at charter dot net

6 years ago

Issue:

Error: SQLSTATE[HY000]: General error: 1 unsupported file format 

Resolution:

To solve this (and/or many issues) involving this type of error, I assumed the error to be

generated from php. Well, it was to an extent. The sqlite pdo code offered the solution:

I researched the error by grep'ing the php source code and found the error string to

Page 98: Introducción pdo

come from php-5.1.4/ext/pdo_sqlite/sqlite/src/prepare.c, lines 265:278 :

/*

 ** file_format==1    Version 3.0.0.

 ** file_format==2    Version 3.1.3.

 ** file_format==3    Version 3.1.4.

 **

 ** Version 3.0 can only use files with file_format==1. Version 3.1.3

 ** can read and write files with file_format==1 or file_format==2.

 ** Version 3.1.4 can read and write file formats 1, 2 and 3.

 */

 if( meta[1]>3 ){

   sqlite3BtreeCloseCursor(curMain);

   sqlite3SetString(pzErrMsg, "unsupported file format", (char*)0);

   return SQLITE_ERROR;

 }

This is interesting as I am running SQLite version 3.3.5 which the databases were

created in. I see that the SQLite PDO source in the php source is :

      # cat ext/pdo_sqlite/sqlite/VERSION

       3.2.8

My solution was then to find a version of sqlite that was =< 3.1.4. I found source for

3.1.3, compiled, recreated my database using that version (NOTE: the databases are

unsupported between 3.1.x and 3.2.x versions of SQLite). Once I did this it worked.

Also as a side note, to get SQLite compiled as a PDO, I had to:

1) configure with

...

--enable-pdo=shared \

--with-sqlite=shared \

--with-pdo-sqlite=shared

--with-zlib

... \

'make && make install' if configure is successful.

Page 99: Introducción pdo

2) Make sure the pdo libs were copied/installed to the correct directory. On my

installation it was /usr/local/include/php/ext/pdo/

3) Make these changes in my php.ini:

  - change ' extension_dir = "./" ' to ' extension_dir="/usr/local/include/php/ext/pdo/" '

  - add/edit in this order:

      extension=pdo.so

      extension=pdo_sqlite.so

      extension=sqlite.so

4) test php with : 'php -m' at the command line and solve any issues from there. Mostly

php.ini config issues. Also restart the http service!

up

down

0

Duffalo

6 years ago

Note that as of the date of this post, PDO_SQLITE will not interact with database files

created with the current version of the SQLite console application, sqlite-3.3.6.

It is currently necessary to obtain version 3.2.8, available from http://www.sqlite.org/ but

only by entering the URI manually, as there is no link. Go

tohttp://www.sqlite.org/download.html and find the URI of the version you're looking for,

then make the appropriate version number substitution.

up

down

0

aidan at php dot net

7 years ago

If you receive an error while trying to write to a sqlite database (update, delete, drop):

Warning: PDO::query() [function.query]: SQLSTATE[HY000]: General error: 1 unable

to open database

The folder that houses the database file must be writeable.

up

down

Page 100: Introducción pdo

-1

Hayley Watson

1 year ago

If there is anyone using PDO to interface with SQLite and wondering how to create an

SQLite database to begin with; if they're thinking they'll have to detour into one of the

other SQLite interfaces to get the job done - nope!

PDO does need a SQLite database file to exist before it can connect, but that file can

be a completely empty one; so a single touch() is enough to create a brand new virgin

SQLite database ready to receive your CREATE TABLE statements.

up

down

-1

gopal at gopalarathnam dot com

5 years ago

If you get an error reporting "invalid resource" when trying to query the database table

and looping through it, the version of the SQLite extension compiled in to PHP might be

incompatible with the version that had created the database (like SQLite 2.x vs 3.x).

The database open itself might be successful, failing only when querying.

$dbh = new PDO('sqlite:/tmp/foo.db'); // success

foreach ($dbh->query('SELECT * FROM bar') as $row) // prints invalid resource

    // ...

Funciones de 4D (PDO_4D)

Introducción

Advertencia

Esta extensión es EXPERIMENTAL. Esto significa que el comportamiento de esta extensión,

los nombres de sus funciones y todo lo documentado sobre esta extensión, puede cambiar en

una futura edición de PHP sin previo aviso. El uso de esta extensión queda bajo su propia

responsabilidad.

PDO_4D es un controlador que implementa la interfaz de Objetos de datos de PHP

(PDO) para habilitar el acceso desde PHP a bases de datos de 4D.

4D es una plataforma integrada que acelera y simplifica el desarrollo y el despliegue de

aplicaciones de negocios, utilizada en más de 70 países, mediante una comunidad de miles de

Page 101: Introducción pdo

desarrolladores y proveedores de soluciones verticales, con millones de usuarios finales en todo

el mundo.

Ofreciendo un juego integrado de herramientas, tales como una base de datos relacional y

transaccional ANSI SQL, un entorno de desarrollo gráfico, un lenguaje de cuarta generación

con más de 1000 comandos de alto nivel, un servidor HTTP interno, un servidor de

aplicaciones, etc., 4D facilita la creación y el mantenimiento de aplicaciones desde uno a miles

de usuarios simultáneos, ya sea en Windows, Mac o desde cualquier cliente web.

4D también es una plataforma abierta, ofreciendo una API completa para la creación de

complementos, incluyendo varios conectores que le permiten actuar como un sistema servidor o

cliente para muchos entornos (Oracle mediante OCI, cliente o servidor SOAP, origen de datos

Flex, todas las bases de datos ODBC, XML sobre HTTP, etc.)

Además de la capacidad de interactuar con aplicaciones 4D a través de servicios web, ahora se

puede acceder a las bases de datos de 4D directamente usando el controlador PDO_4D.

Se pueden encontrar más detalles sobre el entorno de desarrollo de 4D

en »   http://www.4d.com/ .

Se sabe que PDO_4D funciona con las versiones 12 beta y siguientes de 4D, para Mac OS X y

Windows. Las plataformas antiguas podrían funcionar, pero no están soportadas.

Tabla de contenidos

DSN de PDO_4D — Conectarse a un servidor de 4D SQL

Constantes para PDO_4D — Constantes para PDO_4D

Tipos de SQL con PDO_4D y PHP — Tipos de SQL con PDO_4D y PHP

SQL aceptado por 4D — PDO y SQL 4D

Ejemplos con PDO_4D — Ejemplos con PDO_4D