Documents - MX - Manual de Adodb PDF
Documents - MX - Manual de Adodb PDF
1 de 69
http://www.lacorona.com.mx/fortiz/adodb/docs-adodb-es.htm#rsclose
Ligas utules de ADOdb: Descarga Otros manuales (en ingles) Otros manuales (en espaol
Introduccion
Caracteristicas Unicas
Como se esta usando actualmente ADOdb
Solicitud de mejoras y reporte de fallas
Instalacion
Instalacion Minima
Codigo de Inicio y Ejemplos de conexion
Soporte a DSN (Data Source Name) Ejemplos de conexion
ADORecordSet
07/10/2011 7:27
Manual de ADODB
2 de 69
http://www.lacorona.com.mx/fortiz/adodb/docs-adodb-es.htm#rsclose
Introduccion
Las funciones de acceso a base de datos en PHP no estan estandarizadas. Esto requiere una libreria que esconda las
diferencias entre cada API de base de datos (encapsular las diferencias) para que podamos cambiar facilmente de base de
datos. Se requiere la version de PHP 4.0.5 o posterior (debido a que usamos la funcion str_replace con arreglos).
Actualmente manejamos MySQL, Oracle, Microsoft SQL Server, Sybase, Sybase SQL Anywhere, Informix, PostgreSQL,
FrontBase, SQLite, Interbase (versiones de Firebird y Borland), Foxpro, Access, ADO, DB2, SAP DB and ODBC.
Tenemos noticias que se puede conectar a Progress y CacheLite via ODBC. Esperamos que mas personas contribuyan
con drivers para manejar mas base de datos.
PHP4 maneja variables de sesion. Puedes almacenar la informacion de tu sesion usando ADOdb para tener una
verdadera portabilidad y escalabilidad. Para mas informacion ve el archivo adodb-session.php.
Tambie lee tips_portable_sql-es.htm (tambien dispobible en ingles en el archivo tips_portable_sql.htm) para consejos para
escribir enunciados SQL portables.
07/10/2011 7:27
Manual de ADODB
3 de 69
http://www.lacorona.com.mx/fortiz/adodb/docs-adodb-es.htm#rsclose
PostNuke es una sistema de control de contenidos muy popular. Maneja un soporte completo de CSS, cumple con
HTML 4.01, un sistema avanzado de bloques, y es completamente multilenguaje.
EasyPublish CMS es otro sistema de control de contenidos. Para el manejo de informacion y modulos integrados
para tu internet, intranet y extranet. Noruego.
NOLA es una apliacion completa de contabilidad, inventarios y control de trabajo. Su licencia es GPL,
desarrollado por Noguska.
Guia de Instalacion
Asegurate de estar usando PHP 4.0.5 o posterior. Descomprime todos los archivos en un directorio accesible por tu
servidor Web.
Para probar, intenta modificar algunos de los ejemplos del tutorial. Asegurate de corregir los parametros de coneccion a
tus necesidades. Puedes depurar el codigo usando $db->debug = true como se muestra a continuacion:
<?php
include('adodb/adodb.inc.php');
$db = ADONewConnection($dbdriver); # eg 'mysql' o 'postgres'
$db->debug = true;
$db->Connect($servidor, $usuario, $contrasea, $database);
$rs = $db->Execute('select * from alguna_tabla_pequea');
print "<pre>";
print_r($rs->GetRows());
print "</pre>";
?>
Instalacion Minima
Para los desarrolladores que quieran distribuir una version minima de ADOdb, se requieren los siguientes archivos:
adodb.inc.php
adodb-lib.inc.php
adodb-time.inc.php
drivers/adodb-$database.inc.php
license.txt (por razones legales)
adodb-php4.inc.php
adodb-iterator.inc.php (funcionaldiad para PHP5)
Opcionalmente:
adodb-error.inc.php y lang/adodb-$lang.inc.php (si usas MetaError())
adodb-csvlib.inc.php (si usas recordsets en memoria - CacheExecute(), etc)
adodb-exceptions.inc.php y adodb-errorhandler.inc.php (si usas el manejo de errores de ADOdb o excepciones de
PHP5).
adodb-active-record.inc.php si usas Active Records.
07/10/2011 7:27
Manual de ADODB
4 de 69
http://www.lacorona.com.mx/fortiz/adodb/docs-adodb-es.htm#rsclose
Cada vez que necesitas conectarte a una base de datos, debes de crear un objeto de conexion usando la funcion
ADONewConnection($driver). NewADOConnection($driver) es un nombre alterno para la misma funcion.
En este momento, no estas conectado a la base de datos (ya no es cierto si como parametro usas un dsn). Primero tienes
que decidir si vas a usar una coneccion persistente o no persistente. La ventaja de las conexiones persistentes es que son
mas rapidas, debido a que la conexion no es cerrada nunca (aun si usas Close()). Las conexiones No persistentes
consumen menos recursos reduciendo el riesgo de sobrecargar la base de datos o el servidor Web.
Para conexiones persistentes, usa $conn->PConnect(), o $conn->Connect() para conexiones no persistentes. Algunas
bases de datos tambien manejan NConnect(), la cual forza la creacion de una nueva conexion.
Problemas con Conexiones: Si creas dos conexiones, pero ambas usan el mismo usuario y contrasea, PHP compartira
las conexiones. Esto puede causar problemas si se supone que las conexiones son a diferentes bases de datos. La solucion
es usar siempre diferentes usuarios para diferentes bases de datos o usar NConnect().
NewADOConnection() llama a Connect() o PConnect() internamente por ti. Si la conexion falla, te regresa false.
# Conexion no persistente
$dsn = 'mysql://root:pwd@localhost/mydb';
$db = NewADOConnection($dsn);
if (!$db) die("Conexion incorrecta");
# no se requiere llamar connect/pconnect!
$arr = $db->GetArray("select * from table");
# conexion persistente
$dsn2 = 'mysql://root:pwd@localhost/mydb?persist';
Si tienes caracteres especiales como /:?_ en tu dsn, entonces tienes que invocar a rawurlencode primero:
$pwd = rawurlencode($pwd);
$dsn = "mysql://root:$pwd@localhost/mydb";
$dsn2=rawurlencode("sybase_ase")."://user:pass@host/path?query";
MySQLi
Oci8
Para todos los drivers, cuando se activa la opcion persist o persistent, se forza una conexionpersistente; asi mismo,
cuando se activa new, entonces la conexion se creara usando NConnect si el driver lo maneja. La opcion debug habilita
la depuracion. La opcion fetchmode invoca SetFetchMode(). Si no se le indica el valor a alguna oopcion se asume el
valor de 1.
La version DSN de ADOdb DSN es compatible con el formato de la version 1.0 de PEAR DB.
07/10/2011 7:27
Manual de ADODB
5 de 69
http://www.lacorona.com.mx/fortiz/adodb/docs-adodb-es.htm#rsclose
$conn = &ADONewConnection('mysql');
$conn->PConnect('localhost','usuario','contrasea','database');
# o dsn
$dsn = 'mysql://user:pwd@localhost/mydb';
$conn = ADONewConnection($dsn); # no necesita Connect()
# o dsn persistente
$dsn = 'mysql://user:pwd@localhost/mydb?persist';
$conn = ADONewConnection($dsn); # no necesita PConnect()
# un ejemplo mas complejo:
$pwd = urlencode($pwd);
$flags = MYSQL_CLIENT_COMPRESS;
$dsn = "mysql://user:$pwd@localhost/mydb?persist&clientflags=$flags";
$conn = ADONewConnection($dsn); # no need for PConnect()
La mayoria de las demas bases de datos usan la misma convencion: Connect($servidor, $usuario, $contrasea,
$database). Las excepciones se enlistas a continuacion.
PDO
PDO, que solo funciona en PHP5, acepta una cadena de driver especifica:
$conn =& NewADConnection('pdo');
$conn->Connect('mysql:host=localhost',$user,$pwd,$mydb);
$conn->Connect('mysql:host=localhost;dbname=mydb',$user,$pwd);
$conn->Connect("mysql:host=localhost;dbname=mydb;username=$user;password=$pwd");
PostgreSQL
PostgreSQL 7 y 8 acepta conexiones usando:
a. La cadena estandard de conexcion:
$conn = &ADONewConnection('postgres');
$conn->PConnect('host=localhost port=5432 dbname=maria');
c. dsn:
$dsn = 'postgres://user:pwd@localhost/mydb?persist'; # persist es opcional
$conn = ADONewConnection($dsn); # no se requiere Connect/PConnect
LDAP
Este es un ejemplo de busqueda en un servidor LDAP. Gracias a Josh Eldridge por el driver y este ejemplo:
<?php
require('adodb/adodb.inc.php');
/* Make sure to set this BEFORE calling Connect() */
$LDAP_CONNECT_OPTIONS = Array(
Array ("OPTION_NAME"=>LDAP_OPT_DEREF, "OPTION_VALUE"=>2),
Array ("OPTION_NAME"=>LDAP_OPT_SIZELIMIT,"OPTION_VALUE"=>100),
Array ("OPTION_NAME"=>LDAP_OPT_TIMELIMIT,"OPTION_VALUE"=>30),
Array ("OPTION_NAME"=>LDAP_OPT_PROTOCOL_VERSION,"OPTION_VALUE"=>3),
Array ("OPTION_NAME"=>LDAP_OPT_ERROR_NUMBER,"OPTION_VALUE"=>13),
07/10/2011 7:27
Manual de ADODB
6 de 69
http://www.lacorona.com.mx/fortiz/adodb/docs-adodb-es.htm#rsclose
Array ("OPTION_NAME"=>LDAP_OPT_REFERRALS,"OPTION_VALUE"=>FALSE),
Array ("OPTION_NAME"=>LDAP_OPT_RESTART,"OPTION_VALUE"=>FALSE)
);
$host = 'ldap.baylor.edu';
$ldapbase = 'ou=People,o=Baylor University,c=US';
$ldap = NewADOConnection( 'ldap' );
$ldap->Connect( $host, $user_name='', $password='', $ldapbase );
echo "<pre>";
print_r( $ldap->ServerInfo() );
$ldap->SetFetchMode(ADODB_FETCH_ASSOC);
$userName = 'eldridge';
$filter="(|(CN=$userName*)(sn=$userName*)(givenname=$userName*)(uid=$userName*))";
$rs = $ldap->Execute( $filter );
if ($rs)
while ($arr = $rs->FetchRow()) {
print_r($arr);
}
$rs = $ldap->Execute( $filter );
if ($rs)
while (!$rs->EOF) {
print_r($rs->fields);
$rs->MoveNext();
}
print_r( $ldap->GetArray( $filter ) );
print_r( $ldap->GetRow( $filter ) );
$ldap->Close();
echo "</pre>";
?>
Using DSN:
$dsn = "ldap://ldap.baylor.edu/ou=People,o=Baylor University,c=US";
$db = NewADOConnection($dsn);
Interbase/Firebird
Hay que definir la base de datos en el parametro $host:
$conn = &ADONewConnection('ibase');
$conn->PConnect('localhost:c:\ibase\employee.gdb','sysdba','masterkey');
O con dsn:
$dsn = 'firebird://user:pwd@localhost/mydb?persist&dialect=3'; # persist es opcional
$conn = ADONewConnection($dsn); # no se requiere Connect/PConnect
O con dsn:
$path = urlencode('c:\path\to\sqlite.db');
$dsn = "sqlite://$path/?persist"; # persist es opcional
$conn = ADONewConnection($dsn); # no se requiere Connect/PConnect
Oracle (oci8)
Con oci8 te puedes conectar de varias maneras.
a. PHP y Oracle estan en la misma maquina, usar SID.
07/10/2011 7:27
Manual de ADODB
7 de 69
http://www.lacorona.com.mx/fortiz/adodb/docs-adodb-es.htm#rsclose
o
$conn->PConnect('miTNS', 'scott', 'tiger');
f. ADOdb dsn:
$dsn = 'oci8://user:pwd@tnsname/?persist'; # persist is optional
$conn = ADONewConnection($dsn); # no need for Connect/PConnect
$dsn = 'oci8://user:pwd@host/sid';
$conn = ADONewConnection($dsn);
$dsn = 'oci8://user:pwd@/';
# oracle on local machine
$conn = ADONewConnection($dsn);
Tamnbien puedes usar el charSet para Oracle 9.2 y posterior, soportado desde PHP 4.3.2, ADOdb 4.54:
$conn->charSet = 'we8iso8859p1';
$conn->Connect(...);
# o
$dsn = 'oci8://user:pwd@tnsname/?charset=WE8MSWIN1252';
$db = ADONewConnection($dsn);
o si lo prefieres, se puede usar la extension mssql (que esta limitada a la funcionalildad de la version 6.5):
07/10/2011 7:27
Manual de ADODB
8 de 69
http://www.lacorona.com.mx/fortiz/adodb/docs-adodb-es.htm#rsclose
Para DB2:
$dbms = 'db2'; # or 'odbc_db2' if db2 extension not available
$db =& ADONewConnection($dbms);
$dsn = "driver={IBM db2 odbc DRIVER};Database=sample;hostname=localhost;port=50000;protocol=TCPIP;".
"uid=root; pwd=secret";
$db->Connect($dsn);
Sugerencias Avanzadas
Si tienes instalada la extension C ADOdb, puedes modificar tus llamados a $rs->MoveNext() por adodb_movenext($rs).
Esto duplica la velocidad de esta operacion. Para obtener todo un conjunto de rsultados en una operacion, usa
07/10/2011 7:27
Manual de ADODB
9 de 69
http://www.lacorona.com.mx/fortiz/adodb/docs-adodb-es.htm#rsclose
07/10/2011 7:27
Manual de ADODB
10 de 69
http://www.lacorona.com.mx/fortiz/adodb/docs-adodb-es.htm#rsclose
Exceptions: Unicamente hay que incluir adodb-exceptions.inc.php y ya se pueden atrapar las excepciones
conforme ocurran los errores.
include("../adodb-exceptions.inc.php");
include("../adodb.inc.php");
try {
$db = NewADOConnection("oci8");
$db->Connect('','scott','bad-password');
} catch (exception $e) {
var_dump($e);
}
sirve
RecordCount()
Pre-requisitos Sistemas
operativos
access
S/N
ODBC
ado
ADO generico, no esta optimizado para ninguna base de ? depende de la ADO o proveedor Windows
datos especifica. Permite conexiones DSN-less. Para un base de datos
OLEDB
unicamente
mejor rendimiento, utilizar un proveedor de OLEDB.
Esta la clase basa para todos los drivers ado.
ado_access
S/N
ado_mssql
db2
S/N
Interfase
CLI/ODBC de
DB2
Unix y Windows.
Trucos de
instalacion en
Unix. Hay reportes
de que los
parametros $host y
$database del
Connect() tienen
que ir invertidos si
se usa la interfase
CLI.
odbc_db2
S/N
Interfase
CLI/ODBC de
DB2
Unix y Windows.
sugerencias para
instalacion en
Unix. Tengo
reportes que los
parametros $host y
$database tienen
que ser invertidos
en el Connect()
cuando se usa la
interfase CLI.
vfp
S/N
ODBC
Windows
unicamente
fbsql
FrontBase.
Unix y Windows
Windows
unicamente
07/10/2011 7:27
Manual de ADODB
11 de 69
ibase
http://www.lacorona.com.mx/fortiz/adodb/docs-adodb-es.htm#rsclose
S/N
cliente Interbase
Unix y Windows
S/N
cliente Interbase
Unix y Windows
S/N
cliente Interbase
Unix y Windows
Cliente Informix
Unix y Windows
borland_ibase C
informix72
S/N
informix
S/N
ldap
mssql
mssqlpo
Cliente Informix
Unix y Windows
Extension LDAP
S/N
cliente Mssql
Unix y Windows.
Guia de
instalacion de Unix
y otra mas.
Cliente Mssql
Unix y Windows.
Guia de instlacion
en Unix.
mysql
S/N
Cliente MySQL
Unix y Windows
mysqlt or
maxsql
Cliente MySQL
Unix y Windows
oci8
S/N
Cliente Oracle
Unix y Windows
S/N
Cliente Oracle
Unix y Windows
oci8po
Cliente Oracle
Unix y Windows
Unix y Windows.
Trucos para Unix.
odbc_mssql
S/N
ODBC
Unix y Windows.
odbc_oracle
S/N
ODBC
Unix y Windows.
odbtp
odbtp
Unix y Windows
odbtp
Unix y Windows
odbtp_unicode C
S/N
07/10/2011 7:27
Manual de ADODB
12 de 69
http://www.lacorona.com.mx/fortiz/adodb/docs-adodb-es.htm#rsclose
oracle
S/N
Cliente Oracle
Unix y Windows
netezza
postgres
Cliente
PostgreSQL
Unix y Windows.
postgres64
Cliente
PostgreSQL
Unix y Windows.
postgres7
Cliente
PostgreSQL
Unix y Windows.
postgres8
Cliente
PostgreSQL
Unix y Windows.
sapdb
S/N
Cliente ODBC de ?
SAPdb
sqlanywhere
S/N
Cliente ODBC de ?
SQL Anywhere
ODBC
sqlite
Unix y Windows.
sqlitepo
Unix y Windows.
Sybase.
S/N
Cliente Sybase
Unix y Windows.
sybase_ase
Sybase ASE.
S/N
Cliente Sybase
Unix y Windows.
La columna "Verificada" indica que tan profusamente el codigo a sido verificado y usado.
A = bien verificado y usado con mucha gente
B = verificado y usable, pero algunas caracteristicas pueden no estar implementadas
C = driver proporcionado por los usuarios o experimental. Puede no manejar todas las ultimas caracteristcicas de
ADOdb.
La columna "sirve RecordCount()" indica si RecordCount() regresa la cantidad de renglones o regresa -1 cuando se
ejectuta un enunciado SELECT. Si la columna muestra S/N entonces RecordCount() es simulado cuando la variable
global $ADODB_COUNTRECS=true (esto es el valor por omision). Nota que para recordsets muy grandes, puede ser
mejor desabilitar la emulacion de RecordCount()debido a la gran cantidad de memoria para leer el recordset para
contarlo. Tambien hay una penalizacion del 40-50% si se tiene que emular la funcion. Es emulada en la mayoria de las
bases de datos excepto para PostgreSQL y MySQL. Esta variable es verificada cada vez que se ejecuta un SELECT, por
lo que puedes escoger selectivamente cuales recordset contar.
Tutoriales
Ejemplo 1: SELECT
Tarea: Conectarse al DSN MS Access de la base de datos Nortwind, mostrar las primeras 2 columnas de cada renglon.
En este ejemplo, se crea un objeto ADOConnection que representa la conexion a la base de datos. La conexion se inicia
con PConnect, que es una conexion persistente. Para interrogar a las base de datos llamamos a la funcion
ADOConnection.Execute() . Esto regresa un objeto ADORecordSet que es de hecho un cursor que contiene el
renglon actual en el arreglo fields[]. Tambien usamos el metodo MoveNext() para avanzar de renglon en renglon.
Nota: Una funcion muy util que NO usamos en este ejemplo es SelectLimit, que nos permite limitar la cantidad de
renglones a mostrar.
<?
include('adodb.inc.php');
07/10/2011 7:27
Manual de ADODB
13 de 69
http://www.lacorona.com.mx/fortiz/adodb/docs-adodb-es.htm#rsclose
$conn = &ADONewConnection('access');
# crea la conexion
$conn->PConnect('northwind');
# se conecta a la base detos northwind via el DSN MS-Access
$recordSet = &$conn->Execute('select * from products');
if (!$recordSet)
print $conn->ErrorMsg();
else
while (!$recordSet->EOF) {
print $recordSet->fields[0].' '.$recordSet->fields[1].'<BR>';
$recordSet->MoveNext();
}
$recordSet->Close(); # opcional
$conn->Close(); # opcional
?>
La variable $recordSet obtenida contiene el renglon actual en el arreglo $recordSet->fields , indexado por
numero de columna (empezando en cero). Usamos el metodo MoveNext() para avanxar al renglon siguiente. La
propiedad EOF tiene valor verdadero (true) cuando se llega al final del archivo. Si hay algun error en el Execute() se
regresa falso (false) en lugar del recordset.
El arreglo $recordSet->fields[] es generado por la extension PHP de la base de datos correspondiente. Algunas
extensiones unicamente indexan por numero y no por nombre del campo. Para provocar que se indexe por nombre (o sea
con arreglos asociativos) hay que usar la funcion SetFetchMode. Cada recordset almacena y usa el metodo que estuvo
vigente cuando se creo el recordset con un Execute() o SelectLimit().
$db->SetFetchMode(ADODB_FETCH_NUM);
$rs1 = $db->Execute('select * from table');
$db->SetFetchMode(ADODB_FETCH_ASSOC);
$rs2 = $db->Execute('select * from table');
print_r($rs1->fields); # muestra array([0]=>'v0',[1] =>'v1')
print_r($rs2->fields); # muestra array(['col1']=>'v0',['col2'] =>'v1')
En este ejemplo se verifica el tipo de campo de la segunda columna usando la funcion FetchField(). Esto obtiene
un objeto con al menos tres propiedades.
name: Nombre de la columna (campo)
type: Tipo nativo del campo de la columna
max_length: Longitid maxima del campo. Algunas bases de datos como MySQL no regresan la longitud maxima
07/10/2011 7:27
Manual de ADODB
14 de 69
http://www.lacorona.com.mx/fortiz/adodb/docs-adodb-es.htm#rsclose
Ejemplo 3: Insert
Insertar un renglon en la tabla Orders conteniendo fechas y cadenas de caracteres que necesitan ser encomillados antes
de que sean aceptados por la base de datos, por ejemplo el apostrofo en la palabra John's.
<?php
include('adodb/adodb.inc.php');
# carga el codigo comun de ADOdb
$conn = &ADONewConnection('access');
# crea la connection
$conn->PConnect('northwind');
# Se conecta al DSN northwind
$shipto = $conn->qstr("John's Old Shoppe");
$sql = "insert into orders (customerID,EmployeeID,OrderDate,ShipName) ";
$sql .= "values ('ANATR',2,".$conn->DBDate(time()).",$shipto)";
if ($conn->Execute($sql) === false) {
print 'error al insertar: '.$conn->ErrorMsg().'<BR>';
}
?>
En este ejemplo observamos el manejo avanzado de encomillado y de fechas que tiene ADOdb. El valor unix del tiempo
(que es un entero largo) se formatea correctamente para Access con DBDate(), y se usa el caracter adecuado para
encomillar John's Old Shoppe, lo correcto es John''s Old Shoppe y no lo que hace PHP normalmente John's Old Shoppe
con qstr().
Observa el manejo de errores en el enunciado Execute. Se obtiene Falso si hubo un error al ejectutar Execute(). El
mensaje de error del ultimo error encontrado se muestra con ErrorMsg(). Ojo: Se necesita que php_track_errors este
habiliatado para que se salven los mensajes de error.
Ejemplo 4: Depurando
<?php
include('adodb/adodb.inc.php');
# carga el codigo comun de ADOdb
$conn = &ADONewConnection('access');
# crea la conexion
$conn->PConnect('northwind');
# se conecta al DSN de northwind
$shipto = $conn->qstr("John's Old Shoppe");
$sql = "insert into orders (customerID,EmployeeID,OrderDate,ShipName) ";
$sql .= "values ('ANATR',2,".$conn->FormatDate(time()).",$shipto)";
$conn->debug = true;
if ($conn->Execute($sql) === false) print 'error inserting';
?>
En el ejemplo anterior se activo la depuracion asignando debug = true. Esto desplegara los enunciados SQL antes de
ejectuarse, y ademas mostrara cualquier mensaje de error. En este caso no hay necesidad de llamar la funcion
ErrorMsg(). Para mostrar el contenido del recordset, ve el ejemplo de rs2html().
Tambien ve la seccion de Manejadores de error a la medida.
07/10/2011 7:27
Manual de ADODB
15 de 69
http://www.lacorona.com.mx/fortiz/adodb/docs-adodb-es.htm#rsclose
Aqui definimos un menu llamado GetCust, con la opcion del menu 'Mary Rosli' pre seleccionada. Ve el metodo
GetMenu(). Tambien hay funciones que regresan el recordset como un arreglo: GetArray(), y como un arreglo
asociativo con la primera columna como llave: GetAssoc().
y un UPDATE asi:
$record["firstname"] = "Caroline";
$record["lastname"] = "Smith"; # Actualiza iel apellido de Caroline de Miranda a Smith
$insertSQL = $conn->AutoExecute($rs, $record, 'UPDATE', 'id = 1');
07/10/2011 7:27
Manual de ADODB
16 de 69
http://www.lacorona.com.mx/fortiz/adodb/docs-adodb-es.htm#rsclose
include('adodb/tohtml.inc.php');
#==========================
# Codigo para probar un insert
$sql = "SELECT * FROM ADOXYZ WHERE id = -1";
# Selecciona un registro en blanco de la base de datos
$conn = &ADONewConnection("mysql"); # crea la conexion
$conn->debug=1;
$conn->PConnect("localhost", "admin", "", "test"); # se conecta a la base de datos testdb
$rs = $conn->Execute($sql); # Ejecuta la busqueda y obtiene el recordset vacio
$record = array(); # Inicializa el arreglo que contiene los datos a insertar
# Asignar el valor de los campos en el registro
# Observa que el nombre de los campos pueden ser mayusculas o minusculas
$record["firstname"] = "Bob";
$record["lastNamE"] = "Smith";
$record["creaTed"] = time();
# Mandar como parametro el recordset vacio y el arreglo conteniendo los datos a insertar
# a la funcion GetInsertSQL. Esta procesara los datos y regresara un enunciado SQL
# para procesar el INSERT.
$insertSQL = $conn->GetInsertSQL($rs, $record);
$conn->Execute($insertSQL); # Inserta el registro en la base de datos
#==========================
# Codigo de prueba para UPDATE
$sql = "SELECT * FROM ADOXYZ WHERE id = 1";
# Selecciona el registro a actualizar
$rs = $conn->Execute($sql); # Executa la busqueda y obtiene el registro a actualizar.
$record = array(); # Inicializa el arreglo que contiene los datos a modificar
# Asignar el valor de los campos en el registro
# Observa que el nombre de los campos pueden ser mayusculas o minusculas
$record["firstname"] = "Caroline";
$record["LasTnAme"] = "Smith"; # Corrige el apellido de Carolina de Miranda a Smith
# Mandar como parametro el recordset y el arreglo conteniendo los datos a actualizar
# a la funcion GetUpdateSQL. Esta procesara los datos y regresara el enunciado sql del
# update necesario con clausula WHERE correcta.
# Si no se modificaron los datos no regresa nada.
$updateSQL = $conn->GetUpdateSQL($rs, $record);
$conn->Execute($updateSQL); # Actualiza el registro en la base de datos
$conn->Close();
?>
$ADODB_FORCE_TYPE
El comportamiento de AutoExecute(), GetUpdateSQL() y GetInsertSQL() al convertir variables PHP vacias o nulas a
varibales SQL is controlado por la nueva variable global $ADODB_FORCE_TYPE. Asignale alguno de los valores
enlistados abajo. El valor por omision es ADODB_FORCE_VALUE (3):
0 = ignorar campos vacios. Todos los campos vacios en el arreglo son ignorados.
1 = forzar null. Todos los campos vacios, con valor null (de php) o con la cadena 'null' se cambian al
valor SQL de NULL.
2 = forzar vacio. Todos los campos vacios, con valor null (de php) o con la cadena 'null' se cambian a la
cadena vacia de SQL '' o a 0.
3 = forzar valor value. El valor se deja como esta. Lo null (de php) y las cadenas 'null' se cambien a NULL
de SQL y los camnpos vacios con '' se convierten a vacio de SQL ''.
define('ADODB_FORCE_IGNORE',0);
define('ADODB_FORCE_NULL',1);
define('ADODB_FORCE_EMPTY',2);
define('ADODB_FORCE_VALUE',3);
07/10/2011 7:27
Manual de ADODB
17 de 69
http://www.lacorona.com.mx/fortiz/adodb/docs-adodb-es.htm#rsclose
ID
36
37
38
39
40
First Name
Alan
Serena
Yat Sun
Wai Hun
Steven
Last Name
Turing
Williams
Sun
See
Oey
Date Created
Sat 06, Oct 2001
Sat 06, Oct 2001
Sat 06, Oct 2001
Sat 06, Oct 2001
Sat 06, Oct 2001
Page 8/10
El numero de renglones a mostrar en cada pagina se controla con el metodo Render($rows). Si no le mandas ningun
parametro a Render(), ADODB_Pager toma como valor por omision 10 renglones por pagina.
Puedes controlar el titulo de cada columna modificando el SQL (funciona en la mayoria de las bases de datos):
$sql = 'select id as "Clave", firstname as "Nombre",
lastname as "Apellido", created as "Fecha Creacion"
from adoxyz';
El codigo anterior lo puedes encontrar en los ejemplos incluidos con la distribucion en el archivo adodb/tests
/testpaging.php, y la clase ADODB_Pager esta en adodb/adodb-pager.inc.php. El codigo de ADODB_Pager puede ser
modificado por el programador para que las ligas sean imagenes en lugar de textos, y el aburrido fondo blanco tenga
colores mas interesantes.
Tambien puedes habilitar que se muestre HTML modificando $pager->htmlSpecialChars = false.
Parte del codigo usado aqui fue proporcionado por Ivn Oliva and Cornel G.
07/10/2011 7:27
Manual de ADODB
18 de 69
http://www.lacorona.com.mx/fortiz/adodb/docs-adodb-es.htm#rsclose
Los regresos de carro y saltos de linea (CR/LF) se convierten a espacios. Los nombres de los campos se muestran en el
primer renglon del texto. Las cadenas de caracteres que contengan el caracter de delimitador se encierran entre comillas
dobles. Las comillas dobles se encierran tambien entre comillas. Esto cumple las guias de importacion y exportacion de
MS Excel.
Todas las funciones anteriores tienen un ultimo parametro opcional, $addtitles que tiene como valor por omision true.
Cuando se le manda false se omite el nombre de los campos en la primera linea.
La funcion RSFilter requiere dos parametros, el recordset y el nombre de la funcion del filtro. Regresa el recordset
apuntando nuevamente al primer registro. La funcion filter requiere otros dos parametros, el renglon como un arreglo, y
el objeto recordset. Para compatibilidad con futuras versiones se recomienda no usar el objeto recordset original.
Esto es muy compliado para proyectos largos debido a que debes de ir siguiendole la huella a los errores. Con
transacciones inteligentes es mas sencillo. Se empieza una transaccion invocando StartTrans():
$conn->StartTrans();
$conn->Execute($sql);
$conn->Execute($Sql2);
$conn->CompleteTrans();
El metodo CompleteTrans() detecta cuando ocurrio un error SQL, y procesara Rollback o Commit segun sea necesario.
Para forzar especificamente un evento rollback si no ha ocurrido un error, usa el metodo FailTrans(). Toma en cuenta que
07/10/2011 7:27
Manual de ADODB
19 de 69
http://www.lacorona.com.mx/fortiz/adodb/docs-adodb-es.htm#rsclose
Tambien se puede verificar si una transaccion a fallado usando HasFailedTrans(), el cual nos devuelve verdadero si se ha
invocado FailTrans() o si hubo un error en la ejecucion de los SQL. Asegurese de usar HasFailedTrans() antes de llamar a
CompleteTrans(), ya que esta unicamente funciona dentro de StartTrans y CompleteTrans.
Finalmente, StartTrans/CompleteTrans son anidables, y unicamente el bloque exterior se ejecuta. En contraste
BeginTrans/CommitTrans/RollbackTrans NO son anidables.
$conn->StartTrans();
$conn->Execute($sql);
$conn->StartTrans();
# ignorado
if (!CheckRecords()) $conn->FailTrans();
$conn->CompleteTrans(); # ignorado
$conn->Execute($Sql2);
$conn->CompleteTrans();
ADOdb proporciona dos estilos de manejo de errores que se pueden ajustar a nuestras necesidades. El primero esta en el
archivo adodb-errorhandler.inc.php. Este utiliza las funciones estandard de PHP error_reporting para controlar los
tipos de mensajes de error a mostrar, y trigger_error que invoca al manejador de errores usual de PHP.
Si se incluye el archivo anterior se provoca que se invoque a la funcion trigger_error($errorstring,E_USER_ERROR)
cuando:
(a) Falla Connect() o PConnect(), o
(b) Una funcion que ejecuta un enunciado SQL como Execute() or SelectLimit() tiene un error.
(c) Parezca que GenID() esta en un ciclo sin fin.
La variable $errorstring generada por ADOdb contra informacion util de depuracion similar a los datos del error.log
siguiente. El archivo adodb-errorhandler.inc.php debe de ser incluido antes de crear cualquier objeto ADOConnection.
Si se define error_reporting(0), ningun error llegara al manejador de errores. Si se define error_reporting(E_ALL), todos
los errores llegaran al manejador de errores. Ademas es ncesario usar ini_set("display_errors", "0" or "1") para
controlar el despliegue de errores.
<?php
error_reporting(E_ALL); # pasa cualquier mensaje de error al manajeador de errores
include('adodb/adodb-errorhandler.inc.php');
include('adodb/adodb.inc.php');
include('adodb/tohtml.inc.php');
$c = NewADOConnection('mysql');
$c->PConnect('localhost','root','','northwind');
$rs=$c->Execute('select * from productsz'); # Table invalida productsz');
if ($rs) rs2html($rs);
?>
07/10/2011 7:27
Manual de ADODB
20 de 69
http://www.lacorona.com.mx/fortiz/adodb/docs-adodb-es.htm#rsclose
Si desea llevar una bitacora de los mensajes de error, puede definir las siguientes constantes opcionales
ADODB_ERROR_LOG_TYPE y ADODB_ERROR_LOG_DEST. ADODB_ERROR_LOG_TYPE es el tipo de mensaje
(ver error_log en el manual de PHP). En este ejemplo lo asignamos a 3 que significa registar en el archivo definido por la
constante ADODB_ERROR_LOG_DEST.
<?php
error_reporting(E_ALL); # reporta todos los errores
ini_set("display_errors", "0"); # pero no los muestra en la pantalla
define('ADODB_ERROR_LOG_TYPE',3);
define('ADODB_ERROR_LOG_DEST','C:/errors.log');
include('adodb/adodb-errorhandler.inc.php');
include('adodb/adodb.inc.php');
include('adodb/tohtml.inc.php');
$c = NewADOConnection('mysql');
$c->PConnect('localhost','root','','northwind');
$rs=$c->Execute('select * from productsz'); ## Tabla invalida productsz
if ($rs) rs2html($rs);
?>
PEAR_ERROR
El segundo manjeador de errores es adodb-errorpear.inc.php. Este crea una objeto de la clase PEAR_Error cada vez
que hay un error. El ultimo objeto PEAR_Error creado puede ser obtenido usando la funcion ADODB_Pear_Error().
<?php
include('adodb/adodb-errorpear.inc.php');
include('adodb/adodb.inc.php');
include('adodb/tohtml.inc.php');
$c = NewADOConnection('mysql');
$c->PConnect('localhost','root','','northwind');
$rs=$c->Execute('select * from productsz'); #invalid table productsz');
if ($rs) rs2html($rs);
else {
$e = ADODB_Pear_Error();
echo '<p>',$e->message,'</p>';
}
?>
Puedes usar una clase derivada de la clase PEAR_Error definiendo la constante ADODB_PEAR_ERROR_CLASS antes
de incluir adodb-errorpear.inc.php. Para facilitar la depuracion, se puede fijar el manejador por omision al principio el
codigo PHP a PEAR_ERROR_DIE, lo cual provocara que se muestre el mensaje de error y que se detenga la ejecucion
del codigo:
include('PEAR.php');
PEAR::setErrorHandling('PEAR_ERROR_DIE');
Toma en cuenta que ADOdb no regresa un objeto PEAR_Error cuando ocurre un error. Se regresa falso. Hay que llamar
a ADODB_Pear_Error() para obtener el ultimo error o usa la tecnica de PEAR_ERROR_DIE.
MetaError y MetaErrMsg
SI tu necesitas mensajes que error que funcionen en varios manejadores de bases de datos, entonces usa MetaError(), que
regresa un numero de error virtual basado en el sistema de numeracion de errores de PEAR DB, y MetaErrMsg().
Mensajes de Error
Los mensajes de error son mostrados usando el metodo estatico ADOConnnection::outp($msg,$newline=true).
Normalmente se manda el mensaje al cliente (IE, Netscape, Mozilla, etc.). Se puede modificar esto para efectuar un
registro de errores.
Nombres de DSN
07/10/2011 7:27
Manual de ADODB
21 de 69
http://www.lacorona.com.mx/fortiz/adodb/docs-adodb-es.htm#rsclose
ADOdb ahora tambien soporta conectarse usando DSN con el estilo de PEAR. Un nombre DSN es una cadena de texto
con el siguiente formato:
$dsn = "$driver://$usuario:$contrasea@$servidor/$basededatos";
Un ejemploe:
$username = 'root';
$password = '';
$hostname = 'localhost';
$databasename = 'xphplens';
$driver = 'mysql';
$dsn = "$driver://$username:$password@$hostname/$databasename"
$db = NewADOConnection();
# DB::Connect($dsn) also works if you include 'adodb/adodb-pear.inc.php' at the top
$rs = $db->query('select firstname,lastname from adoxyz');
$cnt = 0;
while ($arr = $rs->fetchRow()) {
print_r($arr); print "<br>";
}
El primer parametros es el numero de segundos a almacenar la busqueda. Las siguientes llamadas a esa misma busqueda
usaran la version almacenda en memoria en el directorio $ADODB_CACHE_DIR. Para provocar que un busqueda se
ejecute y se limpie del cache, hay que inviocar CacheExecute() con el primer parametro en cero. Tambien sirve invocar
la funcion CacheFlush($sql).
07/10/2011 7:27
Manual de ADODB
22 de 69
http://www.lacorona.com.mx/fortiz/adodb/docs-adodb-es.htm#rsclose
Por seguridad se recomienda que tengas register_globals=off en el archivo php.ini si usas $ADODB_CACHE_DIR.
A partir de la vsersion 1.80 de ADOdb, el parametro secs2cache es opcional en las funciones CacheSelectLimit() y
CacheExecute(). Si se omiten, usaran el valor que tenga el parametro $connection->cacheSecs, por omision son 60
minutos.
$conn->Connect(...);
$conn->cacheSecs = 3600*24; # 24 horas de cache
$rs = $conn->CacheExecute('select * from table');
Tablas Pivote
Desde la version 2.30, ADOdb maneja la generacion de SQL para crear tablas pivote, tambien conocidas como tablas
cruzadas. Para una mayor explicacion lea este tutorial de DevShed Cross-Tabulation tutorial. Suponemos que la base de
datos maneja la expresion SQL case-when.
En este ejemplo se usara la base de datos Northwind de MS Access. En la base de datos hay un tabla de productos, y
deseamos analizar esta tabla proveedores versus categoria de productos. Se mostraran los proveedores uno en cada
renglon, y tabulado contra categoria. De esta manera en base a la tabla de la izquierda se generara la tabla pivote de la
derecha:
Proveedor Categoria
proveedor1 categoria1
proveedor2 categoria1
proveedor2 categoria2
proveedor2
include "adodb/pivottable.php";
$sql = PivotTableSQL(
$conn,
# conexion adodb
'products p ,categories c ,suppliers s',
# tablas
'CompanyName',
# rows (multiple fields allowed)
'CategoryName',
# column to pivot on
'p.CategoryID = c.CategoryID and s.SupplierID= p.SupplierID' # joins/where
);
Tambien se puede tomar como eje una columna (campo) numerico y generar totales usando rangos. Este codigo se
reviso en la version 2.41 de ADOdb y no es compatible con versiones anteriores. El segundo ejemplo es:
$sql = PivotTableSQL(
$conn,
'products p ,categories c ,suppliers s',
# conexion adodb
# tablas
07/10/2011 7:27
Manual de ADODB
23 de 69
http://www.lacorona.com.mx/fortiz/adodb/docs-adodb-es.htm#rsclose
'CompanyName',
# renglones (se permiten, muiples campos)
array(
# rango de columnas
' 0 '
=> 'UnitsInStock <= 0',
"1 to 5"
=> '0 < UnitsInStock and UnitsInStock <= 5',
"6 to 10" => '5 < UnitsInStock and UnitsInStock <= 10',
"11 to 15" => '10 < UnitsInStock and UnitsInStock <= 15',
"16+"
=> '15 < UnitsInStock'
),
' p.CategoryID = c.CategoryID and s.SupplierID= p.SupplierID', # joins/where
'UnitsInStock',
# sum this field
'Sum '
# sum label prefix
);
REFERENCIA de la Clase
Los parametros de funcion encerrados entre [ ] son opcionales.
Variables Globales
$ADODB_COUNTRECS
Si el API de la base de datos no cuenta el numero de registros encontrados por el enunciado SELECT, la funcion
RecordCount() es simulada cuando la variable global $ADODB_COUNTRECS tiene el valor true, que es el valor por
omision. Esto se simula almacenando los registros, lo cual puede consumir mucha memoria para recordset muy grandes.
Asignele el valor falso a esta variable para un mejor rendimiento. El valor de esta variable se verifica cada vez que se
ejecuta una consulta, por lo cual se puede escoger cuales recordsets se desean contar.
$ADODB_CACHE_DIR
Si se utiliza la memoria intermedia (cache), esta variable contiene el directorio donde se almacenan los recordsets. Hay
que definirla antes de invocar cualquier funcion de cache como CacheExecute( ). Por razones de seguridad se
recomienda tener register_globals=off en el archivo php.ini si se usa el cache.
Con Unix y Apache, hay que modificar los permisos del directorio de cache a algo similar a lo siguiente:
chown -R apache /ruta/al/cache
chgrp -R apache /ruta/al/cache
$ADODB_ANSI_PADDING_OFF
Nos indica cuando hay que eliminar los espacios a la derecha de los campos CHAR (y tambien VARCHAR en el caso de
ibase/firebird). Hay que asignarle true para que los elimine, el valor por omision es false. Por el momento funciona para
los drivers de oci8po, ibase y firebird. Se agrego en la version 4.01 de ADOdb.
$ADODB_LANG
Determina el lenguaje que usa la funcion MetaErrorMsg(). El valor por omision es 'en', que significa mensajes en ingles.
Para ver que lenguajes estan disponibles, vea los archivos en adodb/lang/adodb-$leng.inc.php, donde $leng son los
lenguajes disponibles.
$ADODB_FETCH_MODE
Determina como se obtienen los arreglos generados por los recordsets. Los recordsets salvan este valor cuando se crean
07/10/2011 7:27
Manual de ADODB
24 de 69
http://www.lacorona.com.mx/fortiz/adodb/docs-adodb-es.htm#rsclose
(ej. al Execute( ) o SelectLimit( )), y cualquier cambio siguiente al valor de $ADODB_FETCH_MODE no tiene efecto
en los recordsets existentes, unicamente en los recordsets creados posteriormente.
Se difinen la siguientes constantes:
define('ADODB_FETCH_DEFAULT',0);
define('ADODB_FETCH_NUM',1);
define('ADODB_FETCH_ASSOC',2);
define('ADODB_FETCH_BOTH',3);
Un ejemplo:
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
$rs1 = $db->Execute('select * from table');
$ADODB_FETCH_MODE = ADODB_FETCH_ASSOC;
$rs2 = $db->Execute('select * from table');
print_r($rs1->fields); # muestra array([0]=>'v0',[1] =>'v1')
print_r($rs2->fields); # muestra array(['col1']=>'v0',['col2'] =>'v1')
Como se observa en el ejemplo anterior, cada recordset almacena y usa un metodo diferente en base al valor que tenia
$ADODB_FETCH_MODE cuando se creo el recordset al llamar el Execute().
Si no se le asigna valor, el valor por omision es ADODB_FETCH_DEFAULT. El comportamiento en este modo es
diferente en cada driver, por lo cual no confie en ADODB_FETCH_DEFAULT. Para portabilidad, se recomienda usar
ADODB_FETCH_NUM o ADODB_FETCH_ASSOC. Algunos drivers no manejan ADODB_FETCH_BOTH.
Funcion SetFetchMode
Algunos programadores prefieren usar una solucion mas orientada a objetos, donde el metodo de recuperacion se
selecciona por medio de una funcion del objeto (metodo), SetFetchMode. Una vez que esta funcion se usa para un objeto
de conexion, este objeto ignorara la variable global $ADODB_FETCH_MODE y solo usara la propiedad interna
fetchMode.
$db->SetFetchMode(ADODB_FETCH_NUM);
$rs1 = $db->Execute('select * from table');
$db->SetFetchMode(ADODB_FETCH_ASSOC);
$rs2 = $db->Execute('select * from table');
print_r($rs1->fields); # muestra array([0]=>'v0',[1] =>'v1')
print_r($rs2->fields); # muestra array(['col1']=>'v0',['col2'] =>'v1')
Para obtener el valor anterior del metodo de recuperacion, se puede usar la propiedad $db->fetchMode, o el valor
regresado por SetFetchMode( ).
ADODB_ASSOC_CASE
Para algunos drivers se puede controlar si los nombres de los campos de los indices de los arreglos asociativos esten en
mayusculas o minusculas. Para los drivers de sybase, oci8po, mssql, odbc e ibase y todos los otros drivers derivados de
ellos, ADODB_ASSOC_CASE generara por omision recordset donde los nombres de los campos esten en minusculas.
Hay tres posibles valores de la constante ADODB_ASSOC_CASE:
0 = Nombres de campo en minusculas. $rs->fields['orderid']
1 = Nombres de campo en mayusculas. $rs->fields['ORDERID']
2 = Nombres de campo sin cambio. $rs->fields['OrderID'] -- Valor por omision desde ADOdb 2.90.
Para usarla hay que declarala antes de incluir adodb.inc.php.
define('ADODB_ASSOC_CASE', 2); # No cambiar las letras para ADODB_FETCH_ASSOC
include('adodb/adodb.inc.php');
$ADODB_FORCE_TYPE
Ve el tutorial de GetUpdateSQL.
ADOConnection
07/10/2011 7:27
Manual de ADODB
25 de 69
http://www.lacorona.com.mx/fortiz/adodb/docs-adodb-es.htm#rsclose
Objeto que realiza la conexion a la base de datos, ejecuta enunciados SQL y tiene un conjunto de funciones de utileria
para estandirzar el formato de enunciados SQL para cosas coma la concatenacion y el formateo de fechas.
07/10/2011 7:27
Manual de ADODB
26 de 69
http://www.lacorona.com.mx/fortiz/adodb/docs-adodb-es.htm#rsclose
connectSID: Valor boleano que indica si se debe considerar el parametro $database en la conexion como SID para el
driver oci8. Lo normal es falso. Utill para las version 8.0.5 o anteriores de Oracle.
autoRollback: Si tiene valor true las conexiones persistentes hacen un rollback automatico al momento del PConnect( ).
El valor por omision es false.
Con esto al hacer una conexion persistente con PConnect( ), ADOdb realizara primero un rollback. Esto porque el
documento que PHP no garantiza que se haga un rollback de las transacciones que fallen cuando se usan transacciones
persistentes. Actualmente funciona para Oracle, MySQL, PgSQL, MSSQL, ODBC.
Desde ADOdb 3.11 se puede forzar el uso de conexiones no persistentes aunque se invoque PConnect definiendo la
constante ADODB_NEVER_PERSIST antes de invocar PConnect.
Desde ADOdb 4.23, se regresa null si la extension no esta cargada.
NConnect($host,[$user],[$password],[$database])
07/10/2011 7:27
Manual de ADODB
27 de 69
http://www.lacorona.com.mx/fortiz/adodb/docs-adodb-es.htm#rsclose
Siempre genera una nueva conexion. En comparacion con PHP que algunas veces reutiliza las conexiones cuando se usa
Connect() o PConnect(). Por lo pronto solo funciona con mysql (PHP 4.3.0 o posterior), postgresql y drivers derivado de
oci8. Para los otros drivers NConnect() funciona como Connect().
IsConnected( )
Regresa true si esta conectado a la base de datos. Se agrego en la version 4.53.
Execute($sql,$inputarr=false)
Ejecuta el enunciado SQL en $sql y regresa un objeto de la clase ADORecordSet si es correcto. Observe que si se
ejectuta correctamente el SQL, siempre regresa un recordset, aun si se ejecuto un insert o un update. Tambien se puede
mandar como parametro $sql un enunciado preparado con prepared Prepare().
Regresa un objeto derivado de la clase ADORecordSet. Ej. si esta conectado a mysql, se obtiene un objeto de la clase
ADORecordSet_mysql. Se regresa False si hubo un error en la ejecucion del sql.
El parametro $inputarr puede ser usado para ligar variables a parametros. A continuacion un ejemplo con Oracle:
$conn->Execute("SELECT * FROM TABLE WHERE COND=:val", array('val'=> $val));
Esto proporciona un gran rendimiento ya que el enunciado SQL se prepara primero. El enunciado ya preparado se
ejecuta sucesivamente para cada renglon del arreglo hasta que se procesan todos los renglones o hasta que ocurra un
error. Es muy util para importar datos.
CacheExecute([$secs2cache,]$sql,$inputarr=false)
Es similar al Execute, excepto que el recordset es almacenado en cache por $secs2cache segundos en el directorio
$ADODB_CACHE_DIR, y $inputarr solo recibe arreglos de una dimension (no soporte 'bulk'). Si se ejecuta
CacheExecute() otra vez con los mismos parametros de $sql, $inputarr, y tambien la misma base datos, usuario, y el
recordset almacenado en cache no a caducado, se regresa el recordset almacenado en el cache.
07/10/2011 7:27
Manual de ADODB
28 de 69
http://www.lacorona.com.mx/fortiz/adodb/docs-adodb-es.htm#rsclose
<?php
include('adodb/adodb.inc.php');
include('adodb/tohtml.inc.php');
$ADODB_CACHE_DIR = '/usr/local/ADOdbcache';
$conn = &ADONewConnection('mysql');
$conn->PConnect('localhost','userid','password','database');
$rs = $conn->CacheExecute(15, 'select * from table'); # en cache por 15 secs
rs2html($rs); /* muestra el recordset como tabla html */
?>
Si se omite el parametro $secs2cache, se usa el valor en $connection->cacheSecs (el valor por omision es de 3600
segundos, o 1 hora). Use CacheExecute() unicamente con enunciados SELECT.
Nota del desempeo: Haciendo varias medidas de desempeo (benchmarks) encontre que varian tanto que es mejor
hablar de cuando es de beneficio el uso del cache. Cuando el servidor de base de datos es mas lento que tu servidor Web
o si la base de datos esta muy sobrecargada entonces el cache de ADOdb es bueno porque reduce la carga a tu servidor
de base de datos. Si tu servidor de base de datos esta con poca carga o es mucho mas rapido que tu servidor Web,
entonces el uso del cache podria de hecho reducir el desempeo.
ExecuteCursor($sql,$cursorName='rs',$parameters=false)
Ejecuta un procedimiento almacenado (SP) de Oracle, y regresa una variable de cursor REF de Oracle como un recordset
de ADOdb. No funciona con ninguna otra base de datos excepto oci8. Gracias a Robert Tuttle por el diseo.
$db = ADONewConnection("oci8");
$db->Connect("foo.com:1521", "uid", "pwd", "FOO");
$rs = $db->ExecuteCursor("begin :cursorvar := getdata(:param1); end;",
'cursorvar',
array('param1'=>10));
# $rs es ahora como cualquier otro objeto recordset de ADOdb
rs2html($rs);
SelectLimit($sql,$numrows=-1,$offset=-1,$inputarr=false)
Si tiene exito regresa un recordset, en caso contrario regresa false. Ejectuta un enunciado select, simulando la clausula
"LIMIT $numrows OFFSET $offset" del enunciado SELECT de PostgreSQL.
En PostgreSQL, SELECT * FROM TABLE LIMIT 3 da como resultado los primeros 3 registros unicamente. Lo
07/10/2011 7:27
Manual de ADODB
29 de 69
http://www.lacorona.com.mx/fortiz/adodb/docs-adodb-es.htm#rsclose
equivalente es $connection->SelectLimit('SELECT * FROM TABLE',3). Esta funcionalidad se simula para las bases
de datos que no poseen esta caracteristica.
SELECT * FROM TABLE LIMIT 3 OFFSET 2 regresara los registros 3, 4 y 5 (es decir despues del registro 2, regresa 2
registros). Lo equivalente en ADOdb es $connection->SelectLimit('SELECT * FROM TABLE',3,2).
Observa que es lo contrario de la clausula LIMIT de MySQL. Tambien se puede usar
$connection->SelectLimit('SELECT * FROM TABLE',-1,10) para obtener los registros del 11 al ultimo.
El ultimo parametros $inputarr es para aquellas bases de datos que manejan la liga de variables a parametros como
Oracle oci8. Esto reduce significativamente la demora por la compilacion de enunaciados SQL. Aqui hay un ejemplo con
Oracle :
$conn->SelectLimit("SELECT * FROM TABLE WHERE COND=:val", 100,-1,array('val'=> $val));
El driver oci8po (driver portable de Oracle) usa el metodo mas estandar de definir los parametros para las variables ?:
$conn->SelectLimit("SELECT * FROM TABLE WHERE COND=?", 100,-1,array($val));
$conn->Connect(...);
$conn->cacheSecs = 3600*24; // cache de24 horas
$rs = $conn->CacheSelectLimit('select * from table',10);
CacheFlush($sql=false,$inputarr=false)
Elimina (borra) cualquier recordsets en el cache $ADODB_CACHE_DIR del enunciado SQL en $sql.
Si no se manda ningun parametro, todos los archivos adodb_*.cache son eliminados.
Si se desean borrar todos los archivos de cache en forma manual, hay que ejecutar el siguiente codigo PHP (funciona
unicamente en Unix/linux):
system("rm -f `find ".$ADODB_CACHE_DIR." -name adodb_*.cache`");
Para una limpieza general de los archivos caducos, se recomienda el uso de crontab en Unix, o de at.exe en Windows, y
un archivo de comandos similiar al siguiente:
#-----------------------------------------------------# Este ejemplo en particular borra archivos en el
# directorio TMPPATH # con la cadena de caracteres ".cache"
# en el nombre que tengan mas de 7 dias.
#-----------------------------------------------------AGED=7
find ${TMPPATH} -mtime +$AGED | grep "\.cache" | xargs rm -f
MetaError($errno=false)
Regresa un numero de error virtual, en base a la numeracion del DB de PEAR. Se puede necesitar incluir adodberror.inc.php antes de invocar esta funcion. El parametro $errno es el numero de error nativo que se desea convertir. Si
no se manda ningun parametro, MetaError invocara ErrorNo() para convertirlo. Si el numero de error no tiene
equivalente virtual, MetaError regresara -1 (DB_ERROR).
MetaErrorMsg($errno)
Recibe el numero de error generado por MetaError() para obtener el equivalente mensaje de error virtual.
07/10/2011 7:27
Manual de ADODB
30 de 69
http://www.lacorona.com.mx/fortiz/adodb/docs-adodb-es.htm#rsclose
ErrorMsg()
Regresa el ultimo mensaje de error. El mensaje de error se cambia despues de cada llamado a la funcion Execute().
Puede regresar un texto aun si no ocurrio un error. No es necesario llamar esta funcion a menos que la funcion ADOdb
regrese falso.
Nota: Si esta habiliado debug, los mensajes de error SQL se despliegan cada vez que la funcion Execute es llamada.
ErrorNo()
Regresa el ultimo numero de error. Este numero de error se actualiza despues de cada invocacion de Execute(). Si se
obtiene el valor 0, es que no hubo error.
Tenga en cuenta que las versiones antiguas de PHP (antes de 4.0.6) no generan numero de error para conexiones ODBC.
En lo general no es necesario invocar esta funcion a menos que la funcion ADOdb regrese el valor falso.
IgnoreErrors($saveErrHandlers)
Te permite ignorar errores para que StartTrans()/CompleteTrans() no se vea afectado, asi como tampoco sea invocado el
menajador de erroes 'normal' en caso de ocurra un error. Es util si qiueres verificar si existe un campo o una table sin que
se invoque un error si no existe.
Uso:
$saveErrHandlers = $conn->IgnoreErrors();
$rs = $conn->Execute("select campo from alguna_table_que_pueda_no_existir");
$conn->IgnoreErrors($saveErrHandlers);
07/10/2011 7:27
Manual de ADODB
31 de 69
http://www.lacorona.com.mx/fortiz/adodb/docs-adodb-es.htm#rsclose
Uso:
# para oracle
$conn->Execute('INSERT INTO blobtable (id, blobcol) VALUES (1, empty_blob())');
$conn->UpdateBlob('blobtable','blobcol',$blobvalue,'id=1');
# las demas bases de datos (excepto oracle)
$conn->Execute('INSERT INTO blobtable (id, blobcol) VALUES (1, null)');
$conn->UpdateBlob('blobtable','blobcol',$blobvalue,'id=1');
Regresa verdadero si tiene existo, faslo en caso contrario. Sirve para MySQL, PostgreSQL, Oci8, Oci8po e Interbase.
Otros drivers pueden funcionar, dependiendo del estado de su desarrollo (informix ya funciona).
Nota, cuando se lee un blob de Interbase blob con un SELECT, todavia necesita ser decodificado usando
$connection->DecodeBlob($blob); para obtener el valor original en versiones de PHP anteriores a 4.1.0.
Para PostgreSQL, se pueden almacenar blob en campos OID o bytea. Se pueden usar campos bytea pero no OID con
UpdateBlob( ). Y UpdateBlobFile( ) maneja OID, pero no bytea.
Si el parametro no es un OID, entonces UpdateBlob() asume que se esta almacenando en un campo bytea.
UpdateClob($table,$column,$val,$where)
Permite almacenar el valor clob en la variable $val en la columna $column de la tabla $table en el renglon que cumpla el
criterio $where. Es similar a UpdateBlob anterior, pero para 'Character Large OBjects'.
Uso:
# para oracle
$conn->Execute('INSERT INTO clobtable (id, clobcol) VALUES (1, empty_clob())');
$conn->UpdateBlob('clobtable','clobcol',$clobvalue,'id=1');
# las demas bases de datos (excepto oracle)
$conn->Execute('INSERT INTO clobtable (id, clobcol) VALUES (1, null)');
$conn->UpdateBlob('clobtable','clobcol',$clobvalue,'id=1');
UpdateBlobFile($table,$column,$path,$where,$blobtype='BLOB')
Similar a UpdateBlob, excepto que se pasa como parametro el nombre del archivo que contiene el blob.
Para PostgreSQL, si estas usando OID, use esta interfase. Esta interfase no maneja campos bytea.
Regresa verdadero si tiene exito, falso en caso contrario.
BlobEncode($blob)
Agunas bases de datos requieren que los blobs se codifiquen manualmente antes de ser almacenados. Nota, si se usa
UpdateBlob( ) o UpdateBlobFile( ) la conversion es automatica y no hay necesidad de llamar esta funcion. Para
PostgreSQL, BlobEncode() puede unicamente ser usada en campos bytea.
Regresa el valor del blob codificado.
Nota, hay una propiedad del objeto conexion llamada blobEncodeType el cual tiene 3 valor legales:
false - no hay necesidad de realizar codificacion ni decodificacion.
'I' - Se requiere la codificacion de blobs, y se obtiene un valor numerico (no hay necesidad de encerrar entre comillas).
'C' - Se requiere la codificacion de blobs, y se obtiene un valor alfanumerico (si requiere que se encierre entre comillas).
Esto es solo para efectos de documentacion, para que el programa que maneja varios drivers de bases de datos sepa que
es lo correcto cuando procesa blobs.
BlobDecode($blob)
Algunas bases de datos requieren que los blobs sean decodificados manualmente despues de ejecutar el select. Si la base
de datos no requiere la decodificacion, esta funcion regresara el blob sin cambio. Actualmente BlobDecode es requerido
unicamente para una base de datos, PostgreSQL, y unicamente si se usan campos OID (si se usan campos bytea se
decodifican automaticamente). El valor por omision maximo de un blob esta en $connection->maxblobsize, que vale
07/10/2011 7:27
Manual de ADODB
32 de 69
http://www.lacorona.com.mx/fortiz/adodb/docs-adodb-es.htm#rsclose
07/10/2011 7:27
Manual de ADODB
33 de 69
http://www.lacorona.com.mx/fortiz/adodb/docs-adodb-es.htm#rsclose
$record["lasTname"] = "Smith";
$conn->AutoExecute($table,$record,'INSERT');
# executes "INSERT INTO $table (firstName,lasTname) values ('Carol',Smith')";
$record["firstName"] = "Carol";
$record["lasTname"] = "Jones";
$conn->AutoExecute($table,$record,'UPDATE', "lastname like 'Sm%'");
# executes "UPDATE $table SET firstName='Carol',lasTname='Jones' WHERE lastname like 'Sm%'";
Nota: Una de las fortalezas del AutoExecute() de ADOdb es que solo los nombres de campo validos de la tabla $table
son actualizados. Si $arrFields contiene campos que no son de la tabla, son ignorados. Esto tiene un costo ya que hay que
consultar la base de datos para obtener el nombre de los campos, pero ya que tu no estas codificando el SQL, significa
que tu probablemente no estas tan interesado en velocidad como en conveniencia.
Desde 4.62, el nombre de la tabla puede ser forzado asignandolo en $rs->tableName antes de invocar AutoExecute(),
GetInsertSQL() o GetUpdateSQL().
GetUpdateSQL(&$rs, $arrFields, $forceUpdate=false,$magicq=false)
Genera el enunciado SQL para actualizar una tabla, dandole el recordset $rs, y un arreglo con los campos modificados a
comparar con el recordset ($arrFields, el cual debe de ser un arreglo asociativo conteniendo el nombre de la columna y el
nuevo valor). Si $forceUpdate vale true, entonces tambien se genera el SQL aun cuando $arrFields sea identico a
$rs->fields. Requiere que el recordset sea asociativo. $magicq es utilizado para indicar si se desea encomillado
automatico (ver qstr()). El nombre de los campos en el arreglo puede ser con mayusculas o minusculas.
Desde la version 4.52, se permite que pasas el parametro $force, y este tiene precedencia sobre la variable global
$ADODB_FORCE_TYPE.
Desde la version 4.62, el nombre de la tabla a usar puede ser modificada usando $rs->tableName antes de llamar a
AutoExecute(), GetInsertSQL() o GetUpdateSQL().
GetInsertSQL(&$rs, $arrFields,$magicq=false)
Genera el enunciado SQL para insertar en una tabla, dandole un recordset $rs. Requiere que este en modo asociativo.
$magicq se usa para indicar si se desea el encomillado automatico de los valores (ver qstr()). El nombre de los campos en
el arreglo puede ser con mayusculas o minusculas.
Desde laversion 2.42, se puede pasar como parametro el nombre de la tabla en lugar del recordset (parametro $rs), y se
generara automaticamente el enunciado de INSERT para esa tabla.
Desde la version 4.52, se permite que pasas el parametro $force, y este tiene precedencia sobre la variable global
$ADODB_FORCE_TYPE.
Desde la version 4.62, el nombre de la tabla a usar puede ser modificada usando $rs->tableName antes de llamar a
AutoExecute(), GetInsertSQL() o GetUpdateSQL().
PageExecute($sql, $nrows, $page, $inputarr=false)
Se usa para procesar un recordset por paginas. La pagina inicial es 1. Vea el Ejemplo 8.
CachePageExecute($secs2cache, $sql, $nrows, $page, $inputarr=false)
Se usa para procesar un recordset por paginas. La pagina inicial es 1. Vea el Ejemplo 8. version con cache del
PageExecute.
Close( )
Cierra la conexion a la base de datos. PHP4 orgullosamente nos indica que ya no es necesario hacer la limpieza al final
de la conexion por que el mecanismo de conteo de PHP4 lo hara por nosotros.
StartTrans( )
Inicia una transaccion monitoreada. Cada enunciado SQL que se ejectute, ADOdb lo monitoreara buscando errores SQL,
y si detecta alguno cuando se invoque CompleteTrans(), se hara un rollback automatico.
Para entender porque StartTrans() es mejor que BeginTrans(), examinemos algunas maneras de usar BeginTrans(). A
continuacion la manera incorrecta de usar las transacciones.
07/10/2011 7:27
Manual de ADODB
34 de 69
http://www.lacorona.com.mx/fortiz/adodb/docs-adodb-es.htm#rsclose
$DB->BeginTrans();
$DB->Execute("update table1 set val=$val1 where id=$id");
$DB->Execute("update table2 set val=$val2 where id=$id");
$DB->CommitTrans();
debido a que no se verifica por errores. Es posible que se actualize la tabla table1 y que la actualizacion de la tabla table2
falle. Esta es una manera mejor (o menos peor):
$DB->BeginTrans();
$ok = $DB->Execute("update table1 set val=$val1 where id=$id");
if ($ok) $ok = $DB->Execute("update table2 set val=$val2 where id=$id");
if ($ok) $DB->CommitTrans();
else $DB->RollbackTrans();
Otra manera (con el metodo antiguo) de hacerlo desde la version de 2.0 de ADOdb:
$DB->BeginTrans();
$ok = $DB->Execute("update table1 set val=$val1 where id=$id");
if ($ok) $ok = $DB->Execute("update table2 set val=$val2 where id=$id");
$DB->CommitTrans($ok);
Es muy engorroso monitorear $ok por todo el codigo. StartTrans() es una mejora debido a que monitorea todos los
erroers SQL por nosotros. Esto es particularmente util si invocas una funcion de 'caja negra' en el cual se pueden ejecutar
varios enunciados SQL. Adicionalmente,todas las llamadas a BeginTrans, CommitTrans o RollbackTrans dentro de un
bloque StartTrans seran desabilitadas, por lo cual aunque la 'caja negra' haga un commit, sera ignorado.
$DB->StartTrans();
CallBlackBox();
// Funcion que hace varias cosas
$DB->Execute("update table1 set val=$val1 where id=$id");
$DB->Execute("update table2 set val=$val2 where id=$id");
$DB->CompleteTrans($ok);
Nota los bloques StartTrans son anidables, los bloques interiores son ignorados.
CompleteTrans($autoComplete=true)
Termina una transaccion iniciada con StartTrans(). Esta funcion monitorea por posibles errores SQL, y hara un 'commit' si
no ocurrieron errores, en caso de algun error hara el 'rollback'. Regresa verdadero si efectuo el commit y false si llamo el
roolback. Si el parametro $autoComplete es true se monitorean los errores y hace commit o rollback segun sea el caso.
Con $autoComplete en false se hace rollback aun cuando no se hayan detectado errores.
FailTrans( )
Aborta una transaccion iniciada con StartTrans(). El rollback se hara hasta que se invoque CompleteTrans().
HasFailedTrans( )
Verifica si una transaccion inteligente ha fallado, es decir regresa true si ha habido un error SQL o si se invoco a
FailTrans(). Si no esta dentro de una transaccion inteligente regresa falso.
BeginTrans( )
Inicia una transaccion. Desactiva el Commit automatico. Regresa true si se hace con exito. Algunas bases de datos
siempre regresan false si no esta habilitado el manejo de transacciones. Cualquier transaccion abierta hara rollback
cuando se cierre la conexion. Algunas de las bases de datos que manejan transacciones son: Oracle, PostgreSQL,
Interbase, MSSQL, ciertas versiones de MySQL, DB2, Informix, Sybase, etc.
Observe que StartTrans() y CompleteTrans() son un metodo superior para el manejo de transacciones, disponible desde
ADOdb 3.40. Para una explicacion vea la documentacion de StartTrans().
Tambien se puede usar el manejador de errores de ADOdb para matar y hacer rollback de la transaccion
automaticamente. Algunas extensiones de bases de datos problematicas hacen 'commit' de todas las transacciones
pendientes, por lo cual conviene por seguridad invocar manualmente $DB->RollbackTrans() en el manejador de errores.
Detectando Transacciones
07/10/2011 7:27
Manual de ADODB
35 de 69
http://www.lacorona.com.mx/fortiz/adodb/docs-adodb-es.htm#rsclose
Desde la version 2.50 de ADOdb, se puede detectar si se esta dentro de una transaccion. Hay que verificar si
$connection->transCnt > 0. Esta variable se incrementa cada vez que se llama a BeginTrans(), y se decrementada cuando
se invoca a RollbackTrans() o CommitTrans().
CommitTrans($ok=true)
Termina una transaccion con exito. Regresa true si funciona. Si la base base de datos no maneja transaccion tambien
regresara true ya que los datos son siempre almacenados.
Si se manda el parametro $ok=false, invocara un 'rollback'. Vea el ejemplo de BeginTrans().
RollbackTrans( )
Termina la transaccion regresando los cambios ('rollback'). Regresa true si tiene exito. Si la base de datos no maneja
transacciones, regresara false ya que los datos no se pueden restaurar.
SetTransactionMode($mode )
SetTransactionMode te permite indicar el modo de trasaccion a usar para todas las transacciones subsecuentes. Nota: si
tu tienes conexiones persistentes y usas mssql o mysql, puedes tener que regresar explicitamente el modo de transaccion
alprincipio de cada pagina. Actualmente solo esta soportado para postgresql, mssql, mysql con InnoDB y oci8. Por
ejemplo:
$db->SetTransactionMode("SERIALIZABLE");
$db->BeginTrans();
$db->Execute(...); $db->Execute(...);
$db->CommiTrans();
$db->SetTransactionMode(""); // lo regreso al valor por omision
$db->StartTrans();
$db->Execute(...); $db->Execute(...);
$db->CompleteTrans();
07/10/2011 7:27
Manual de ADODB
36 de 69
http://www.lacorona.com.mx/fortiz/adodb/docs-adodb-es.htm#rsclose
Tambien revisa InParameter(), OutParameter() y PrepareSP(). Solo esta soportado internamente por interbase, oci8 y
algunos drivers basados en ODBC, en los demas casos es emulado. No hay ninguna ganancia en el rendimiendo usando
07/10/2011 7:27
Manual de ADODB
37 de 69
http://www.lacorona.com.mx/fortiz/adodb/docs-adodb-es.htm#rsclose
Prepare() emulados.
Importante: Debido a las limitaciones o fallas en el PHP, si tienes errores al ejecutar SQLs preparados, pon
$ADODB_COUNTRECS = false antes de prepararlos. Esto ha sido observado con ODBC.
IfNull($field, $nullReplacementValue)
Funcion IFNULL compatible (NVL para Oracle). Regresa una cadena de caracteres que representa la funcion que
verifica si $field es nulo (NULL), y si lo es, le cambia el valor regresado por $nullReplacementValue. Ej.
$sql = 'SELECT '.$db->IfNull('name', "'- unknown -'"). ' FROM table';
length
No es una funcion sino una propiedad. Algunas bases de datos tiene la funcion "length" y otras "len" para medir la
longitud de una cadena. Para usar la propiedad:
$sql = "SELECT ".$db->length."(field) from table";
$rs = $db->Execute($sql);
random
Tampoco es una funcion sino una propiedad. Contiene la cadena que representa a la funcion sql que genera un numero
aleatorio entre 0.0 y 1.0 inclusive.
substr
Tambien es una propiedad. Algunas bases de datos tienen la funcion "substr" y otras la funcion "substring" para recuperar
parte de una cadena. Ejemplo de uso:
$sql = "SELECT ".$db->substr."(field, $offset, $length) from table";
$rs = $db->Execute($sql);
Para todas las bases de datos, el primer parametro de substr es el campo, el segundo es el desplazamiento (1 es el
principio) para empezar la sub-cadena, y el tercero es el largo.
Param($name)
Genera el caracter para marcar la posicion de los parametros. En la mayoria de las bases de datos el caracter es "?". Sin
embargo algunas bases de datos usan marcadores con nombre, Oracle por ejemplo usa ":somevar". Estos nos permite
definir enunciados SQL con parametros que sean compatibles.
$sql = 'insert into table (col1,col2) values ('.$conn->Param('a').','.$conn->Param('b').')';
# genera 'insert into table (col1,col2) values (?,?)'
# o
'insert into table (col1,col2) values (:a,:b)'
$stmt = $conn->Prepare($sql);
$stmt = $conn->Execute($stmt,array('one','two'));
PrepareSP($sql, $cursor=false )
Al llamar procedimientos almaceneados (SP) de mssql y oci8 (oracle), PrepareSP() nos permite ligar directamente a un
parametro que regresa un valor, o el manejo especial de LOBs.
Regresa el mismo arreglo o cadena $sql como el Prepare( ). Si NO se necesita ligar a un valor de salido, se deberia de
usar Prepare().
El segundo parametro, $cursor solo se usa con oci8. Con valor true provoca que se llame a OCINewCursor; esto para el
manejo de REF CURSOR.
Para ejemplos del uso de PrepareSP( ), vea InParameter( ) a continuacion.
Nota: en el driver de mssql, preparar procedimientos almacenados requiere que se llame a una funcion especial,
mssql_init( ), la cual es invocada por esta funcion. PrepareSP( ) esta disponible en todos los drivers y es emulado
invocando a Prepare( ).
07/10/2011 7:27
Manual de ADODB
38 de 69
http://www.lacorona.com.mx/fortiz/adodb/docs-adodb-es.htm#rsclose
Tome en cuenta que la unica diferencia entre la implementacion de oci8 y mssql es $sql.
En mssql si el parametro $type tiene valor false, $type se determinara dinamicamente en base al tipo de variable PHP
proporcionada. (string => SQLCHAR, boolean =>SQLINT1, integer =>SQLINT4 o
float/double=>SQLFLT8).
Para oci8, $type puede ser OCI_B_FILE (Binary-File), OCI_B_CFILE (Character-File), OCI_B_CLOB
(Character-LOB), OCI_B_BLOB (Binary-LOB) y OCI_B_ROWID (ROWID). Para pasar NULL hay que usar
$db->Parameter($stmt, $null=null, 'param').
OutParameter($stmt, $var, $name, $maxLen = 4000, $type = false )
Liga una variable PHP con la salida de una variable de un procedimiento almacenado. El parametro $stmt es el valor que
regreso PrepareSP(), $var es la variable PHP que se se desea ligar, $name es el nombre de la variable del procedimiento
almacenado. Opcionalmente, $maxLen es la longitud maxima de datos a ligar, y $type que depende de cada base de
datos.
OutParameter() es una funcion envolvente que llamada Parameter() con $isOutput=true. La ventaja de esta funcion es
que es auto descriptiva, debido a que ya no es necesario el parametro $isOutput. Actualmente solo para mssql y oci8.
Para un ejemplo vea InParameter.
Parameter($stmt, $var, $name, $isOutput=false, $maxLen = 4000, $type = false )
Observacion: Esta funcion esta descontinuada, debido a las nuevas funciones InParameter() y OutParameter(). Estas
son mejores porque son auto descriptivas.
Agrega un parametro adecuado para regresar valores o el manejo especial de datos (ej, LOBs) despues de que el
enunciado ha sido preparado con PrepareSP(). Actualmente solo para mssql y oci8. Los parametros son:
$stmt Enunciado regresado por Prepare() o PrepareSP().
$var Variable PHP a ligar. Asegurarse de inicializarla!
$name Nombre de la variable del procedimiento almacenado a ligarse.
07/10/2011 7:27
Manual de ADODB
39 de 69
http://www.lacorona.com.mx/fortiz/adodb/docs-adodb-es.htm#rsclose
[$isOutput] Indica el sentido del parametro, 0/false=Entrada 1=Salida 2= Entrada/Salida. Se ignora en el driver oci8 ya
que este auto detecta el sentido.
[$maxLen] Longitud maxima de la variable.
[$type] Consulta mssql_bind y ocibindbyname en php.net para mas informacion de los valores legales de $type.
Por ultimo, para oci8, los parametros pueden ser reusados sin llamar nuevamente a PrepareSP( ) o Parameters. Esto no es
posible con mssql. Un ejemplo con oci8:
$id = 0; $i = 0;
$stmt = $db->PrepareSP( "update table set val=:i where id=:id");
$db->Parameter($stmt,$id,'id');
$db->Parameter($stmt,$i, 'i');
for ($cnt=0; $cnt < 1000; $cnt++) {
$id = $cnt;
$i = $cnt * $cnt; # Funciona para oci8!
$db->Execute($stmt);
}
LogSQL($enable=true)
Llama este metodo para instalar el sistema de registro y medicion de enunciados SQL (usando fnExecute). Todos los
enunciados SQL seran registrados en la tabla adodb_logsql de la base de datos. Si la tabla no existe, ADOdb la creara si
tienes los premisos necesarios. Regresa el estado previo de registro (true para habilitado, false para desabilitado). Este un
ejemplo del DDL para algunas bases de datos:
mysql:
CREATE TABLE adodb_logsql (
created datetime NOT NULL,
sql0 varchar(250) NOT NULL,
sql1 text NOT NULL,
params text NOT NULL,
07/10/2011 7:27
Manual de ADODB
40 de 69
http://www.lacorona.com.mx/fortiz/adodb/docs-adodb-es.htm#rsclose
Uso:
$conn->LogSQL(); // Habilita el registro
:
$conn->Execute(...);
:
$conn->LogSQL(false); // deshabilita el registro
# Muestra un resumen de los resultados del registro
$perf = NewPerfMonitor($conn);
echo $perf->SuspiciousSQL();
echo $perf->ExpensiveSQL();
Una limitante del registro es que el 'rollback' de la transaccion tambien impide que el enunciado SQL se registre.
Si deseas otro nombre para la tabla a utilizar para almacenar los SQL, tendras que invocar
adodb_perf::table($tablename), donde $tablename es el nuevo nombre de la tabla (tu tendras que crear la tabla
manualmente). Un ejemplo:
include('adodb.inc.php');
include('adodb-perf.inc.php');
adodb_perf::table('my_logsql_table');
07/10/2011 7:27
Manual de ADODB
41 de 69
http://www.lacorona.com.mx/fortiz/adodb/docs-adodb-es.htm#rsclose
else $EXECS++;
}
# $conn es el objeto de conexion
function CountCachedExecs($conn, $secs2cache, $sql, $inputarray)
{
global $CACHED; $CACHED++;
}
$conn = NewADOConnection('mysql');
$conn->Connect(...);
$conn->fnExecute = 'CountExecs';
$conn->fnCacheExecute = 'CountCachedExecs';
:
:
# Despues de muchos enunciados sql:`
printf("<p>Total de queries=%d; total en cache=%d</p>",$EXECS+$CACHED, $CACHED);
La funcion fnExecute se llamada antes del que el sql sea examinado y ejecutado, por eso se puede reescribir el query. Si
mandas como parametro un enunciado preparado entonces $sql es un arreglo (ver Prepare). La funcion fnCacheExecute
se ejecuta unicamente si el recordset se almacena en cache. Los parametros de la funcion coinciden con las funciones
Execute y CacheExecute, excepto que $this (el objeto conexion) se manda como primer parametro.
Desde la version 3.91 de ADOdb 3.91, el comportamiento de fnExecute es diferente dependiendo de si la funcion
definida regresa un valor. Si no regresa ningun valor el enunciado $sql se ejecuta como siempre. Esto es util para
reescribir querys o para contar ejecuciones.
Tambien puedes desear reemplazar la funcion Execute con una propia. En este caso, que tu funcion regrese un valor. Si
se obtiene un valor, el valor se regresa inmediatamente sin ningun procesamiento. Esto lo uso ADodb internamente para
implementar LogSQL().
BindDate($date)
Formatea la fecha ($date) en formato que la base de datos acepte para variables posicionales. Normalmente esto
significa que la cadena no se entre comilla.
$sql = "select * from atable where created > ".$db->Param('0');
// or
$sql = "select * from atable where created > ?";
$db->Execute($sql,array($db->BindDate("$year-$month-$day"));
DBTimeStamp($ts)
07/10/2011 7:27
Manual de ADODB
42 de 69
http://www.lacorona.com.mx/fortiz/adodb/docs-adodb-es.htm#rsclose
Formatea el registro de tiempo $ts en un formato que acepte la base de datos, puede ser un entero de Unix o una cadena
en el formato ISO Y-m-d H:i:s. Emplea el valor de la propedad fmtTimeStamp, que contiene el formato a emplear. Si le
menda como parametro null o false o '', genera un null de SQL.
Regresa el registro de tiempo como una cadena encomillada.
$sql = "select * from atable where created > ".$db->DBTimeStamp("$year-$month-$day $hr:$min:$secs");
$db->Execute($sql);
BindTimeStamp($ts)
Formatea el resgistro de tiempo $ts en formato de variable posicional para ser aceptado por la base de datos. Esto casi
siempre significa que la cadena no sera encomillada.
$sql = "select * from atable where created > ".$db->Param('0');
// or
$sql = "select * from atable where created > ?";
$db->Execute($sql,array($db->BindTimeStamp("$year-$month-$day $hr:$min:$secs"));
qstr($s,[$magic_quotes_enabled=false])
Encierra entre comillas una cadena a ser enviada a la base de datos. Puede verse extrao el parametro
$magic_quotes_enabled, pero la idea es por si esta encomillando cadenas obtenidas por POST o GET, se puede mandar
get_magic_quotes_gpc() como el segundo parametro. Esto nos asegura que la variable no se encomille dos veces, una por
qstr y la otra por magic_quotes_gpc.
Ej. $s = $db->qstr(HTTP_GET_VARS['name'],get_magic_quotes_gpc());
Regresa la cadena encomillada.
Quote($s)
Encierra entre comillas la cadena $s, protegiendo el caracter especifico de encomillado de la base de datos.
Anteriormente verificaba el estado de 'magic quotes', pero se deshabilito desde la version 3.31 para que sea compatible
con el paquete DB de PEAR.
Affected_Rows( )
Regresa el numero de renglones afectados por un enunciado update o delete. Regresa falso si la funcion no esta
soportada.
Actualmente no esta soportada para interbase/firebird.
Insert_ID( )
Regresa el ultimo identificador de numeracion automatico insertado (serial). Regresa falso si la funcion no esta
soportada.
Unicamente soportado por bases de datos que manejan auto incrementos o identificador de objetos (OID) como
PostgreSQL, actualmente MySQL y MS SQL Server. PostgreSQL regresa el OID, que puede cambiar en una recarga de
la base de datos.
RowLock($table,$where)
Asegura el renglon de una tabla por la duracion de la transaccion. Por ejemplo, para asegurar el renglon $id de la tabla
'table1':
$DB->StartTrans();
$DB->RowLock("table1","rowid=$id");
$DB->Execute($sql1);
$DB->Execute($sql2);
$DB->CompleteTrans();
07/10/2011 7:27
Manual de ADODB
43 de 69
http://www.lacorona.com.mx/fortiz/adodb/docs-adodb-es.htm#rsclose
MetaDatabases()
Regresa un arreglo con la lista de bases de datos disponibles en el servidor. Debes de estar conectado al servidor. Solo
disponible para ODBC, MySQL y ADO.
MetaTables($ttype = false, $showSchema = false, $mask=false)
Regresa un arreglo de las tablas y vistas de la base de datos actual. El arreglo omitira en lo posible las tablas del sistema.
Para unicamente mostar tablas use db->MetaTables('TABLES'). Para unicamente mostar vistas use
$db->MetaTables('VIEWS'). Actualmente el parametro $showSchema solo funciona para DB2, y cuando es verdadero,
agerga el nombre del esquema a la tabla, ej. "SCHEMA.TABLE".
Se puede definir una mascara de coincidencia. Por ejemplo, con $mask = 'TMP%' solo encontrara las tablas que
empiecen con 'TMP'. Por lo pronto solo mssql, oci8, odbc_mssql y postgres* manejan el parametro $mask.
MetaColumns($table,$toupper=true)
Regresa un arreglo de objetos de la clase ADOFieldObject, un objeto por cada columna de la tabla $table. Cada instancia
tiene definidos las propiedades (name, type, max_length). Actualmente Sybase no reconoce los tipos de fecha y ADO no
puede identificar el tipo adecuado de datos (por lo que se identifican como 'varchar').
El parametro $toupper determina si hay que convertir a mayusculas el nombre de la tabla (requerido por algunas bases de
datos).
Para el manejo de esquemas, en el parametro $table mande el valor "$schema.$tablename". Estos solo funciona en
algunas bases de datos.
MetaColumnNames($table)
Regresa un arreglo con los nombres de las columnas de la tabla $table. Desde ADOdb 4.22, es un arreglo asociativo con
las llaves en mayusculas.
Es decir, array('FIELD1' => 'Field1', 'FIELD2'=>'Field2')
MetaPrimaryKeys($table, $owner=false)
Regresa un arreglo con el nombre de las columnas que forman la llave primaria de la tabla $table. Actualmente manejado
por mysql, odbc (including db2, odbc_mssql, etc), mssql, postgres, interbase/firebird, oci8.
Las vistas (y algunas tablas) tienen llave primaria, pero algunas veces esta informacion no esta disponible para la base de
datos. Tu puedes definir una funcion ADODB_View_PrimaryKeys($databaseType, $database, $view, $owner) que
regrese el arreglo conteniendo los campos que forman la llave primaria. Si esta funcion existe sera invocada cuando
MetaPrimaryKeys() no pueda encontrar la llave primaria para tabla o vista.
// En este ejemplo: dbtype = 'oci8', $db = 'mydb', $view = 'dataView', $owner = false
function ADODB_View_PrimaryKeys($dbtype,$db,$view,$owner)
{
switch(strtoupper($view)) {
case 'DATAVIEW': return array('DATAID');
default: return false;
}
}
$db = NewADOConnection('oci8');
$db->Connect('localhost','root','','mydb');
$db->MetaPrimaryKeys('dataView');
ServerInfo($table)
Regresa un arreglo asociativo con dos elementos 'description' y 'version'. El elemento 'description' contiene una cadena
con la descripcion de la base de datos. El elemento 'version' contiene una cadena con el numero de version.
MetaForeignKeys($table, $owner=false, $upper=false)
Regresa un arreglo asociativo con las llaves foraneas (foreign keys) de la tabla. o falso si no esta soportado. Por ejemplo,
si la tabla 'empleados' tiene una llave foranea 'empleados.empl_dept' apunta a 'departamentos.dept_clav', y
empleados.empl_puesto=organigrama.orga_puesto y empleados.empl_cat=organigrama.orga_cat, entonces
07/10/2011 7:27
Manual de ADODB
44 de 69
http://www.lacorona.com.mx/fortiz/adodb/docs-adodb-es.htm#rsclose
Opcionalmente el dueo de la tabla o vista se puede definir en $owner. Si $upper es verdadero entonces el nombre de las
tables (las llaves del arreglo) se convierten a mayusculas.
ADORecordSet
Cuando se ejectuta satisfactoriamente un enunciado SQL con el metodo ADOConnection->Execute($sql), se
obtiene un objeto ADORecordSet. Este objeto contiene: un cursor virtual para podernos mover de renglon en renglon,
funciones para obtener informacion acerca de las columnas y sus tipos de datos, y funciones auxiliares para el formateo
de los resultados para ser mostrados al usuario.
Campos/propiedades de ADORecordSet
fields: Arreglo que contiene el renglon actual. No es asociativo, sino un arreglo indexado del 0 al (columnas - 1). Vea
tambien la funcion Fields, que se comprota como un arreglo asociativo.
dataProvider: El mecanismo subyacente empleado para conectarse a la base de datos. Normalmete vale native, a menos
que sea odbc o ado.
blobSize: Tamao maximo de un objeto char, string o varchar antes de que se considere como un Blob (Los Blobs se
deberan mostar en textareas). Vea la funcion MetaType function.
sql: Contiene el enunciado sql empleado para generar este conjunto de datos.
canSeek: Con valor verdadero si la funcion Move( ) funciona..
EOF: Verdadero si se ha navegado el cursor despues del ultimo registro.
Funciones/metodos de ADORecordSet
ADORecordSet( )
Constructor. Normalmente nunca hay que llamar a esta funcion.
GetAssoc([$force_array])
Genera un arreglo asociativo del recordset. Observe que esta funcion tambien esta disponible en el objeto de conexion.
Mas detalles se pueden encontar ahi.
GetArray([$number_of_rows])
Genera un arreglo bidimensional de registros desde la position actual del cursor, indexado desde 0 a ($number_of_rows 1). Si no se define $number_of_rows, se indexa hasta el final de recordset (EOF).
GetRows([$number_of_rows])
Genera un arreglo bidimensional de registros desde la posicion actual del cursor, Sinomimo de GetArray() para tener
compatibilidad con Microsoft ADO.
GetMenu($name, [$default_str=''], [$blank1stItem=true], [$multiple_select=false], [$size=0], [$moreAttr=''])
Genera un menu HTML (<select><option><option></select>). La primera columna del recordset (fields[0]) contiene el
texto a desplegar en la etiqueta option. Si el recordset tiene mas de 1 columna, la segunda columna (fields[1]) es el valor
a enviar al servidor Web. La variable del menu tendra el nombre $name.
Si esta definido $default_str, entonces si $default_str == fields[0], entonces ese campo se selecciona. Si $blank1stItem
es verdadero, la primera opcion esta en blanco. Tambien se le puede poner un texto a la primera opcion con
07/10/2011 7:27
Manual de ADODB
45 de 69
http://www.lacorona.com.mx/fortiz/adodb/docs-adodb-es.htm#rsclose
$blank1stItem = "$valor:$texto".
$Default_str puede ser un arreglo para una caja de opcion multiple.
Para obtener una caja, asignele a $size un valor diferente de cero (o mande $default_str como un arreglo). Si
$multiple_select es verdadero entonces se generara un caja con $size elementos (o si $size==0, con 5 elementos)
visibles, y se regresera un arreglo al servidor. Finalmente emplee $moreAttr para agregar atributos adicionales como
javascript o styles.
Ejemplo de Menu 1: GetMenu('menu1','A',true) genera el menu:
ejemplo 5.
Ejemplo de Menu 2: Con los mismo datos, GetMenu('menu1',array('A','B'),false) generara un menu con A y B
seleccionados:
07/10/2011 7:27
Manual de ADODB
46 de 69
http://www.lacorona.com.mx/fortiz/adodb/docs-adodb-es.htm#rsclose
// regresa "(sysdate+2.5)"
Esta funcion esta disponible en los driverrs mysql, mssql, oracle, oci8 y postgresql desde 2.13. Puede funcionar con otros
drivers siempre y cuando permitan aritmetica de fechas.
SQLDate($dateFormat, $basedate=false) Regresa una cadena que contiene la funcion SQL nativa para formatear una
fecha o el campo fecha $basedate. Es usado en enunciados SELECT. Para enunciados INSERT/UPDATE use DBDate.
Emplea un formato con mayusculas/minusculas en $dateFormat, que maneja:
Y:
Q:
M:
m:
d:
H:
h:
i:
s:
A:
Ao a 4 digitis
Trimestre (1-4)
Mes (Jan-Dec)
Mes (01-12)
Dia (01-31)
Hora (00-23)
Hora (1-12)
Minuto (00-59)
Segundo (00-60)
Indicador de AM/PM
Todos los demas caracteres se tratan como cadena. Se puede usar \ para escapar caracteres. Disponible en algunas bases
de datos, incluyendo mysql, postgresql, mssql, oci8 y DB2.
Es util para escribir enunciados sql portable que hacen GROUP BY por fechas. Por ejemplo para mostrar el costo total de
los bienes vendidos por cada trimestre (las fecha estan en el campo llamado postdate):
$sqlfn = $db->SQLDate('Y-\QQ','postdate'); # obtiene el sql que formatea postdate
$sql = "SELECT $sqlfn,SUM(cogs) FROM table GROUP BY $sqlfn ORDER BY 1 desc";
MoveNext( )
Mueve el cursor al siguiente renglon. El arreglo $this->fields se actualiza automaticamente. Regresa falso si no lo pudo
hacer (normalmente debido a que se encontrol el EOF), en caso contrario regresa verdadero.
Si se alcanzo el EOF, entonces el arreglo $this->fields tiene valor falso (esto funciona consistentemente a partir de
ADOdb 3.30). Para tener el comportamiento que habia antes de la version 3.30 en $this->fields (en EOF), ponga la
variable global $ADODB_COMPAT_FETCH = true.
Ejemplo:
$rs = $db->Execute($sql);
if ($rs)
while (!$rs->EOF) {
ProcessArray($rs->fields);
$rs->MoveNext();
}
Move($to)
Mueve el cursor interno al renglon $to. En numero de renglon empieza en 0, es decir 0 es el primer renglon. El arreglo
fields es actualizado automaticamente. Para aquellas bases de datos que no manejan internamente la navegacion, ADOdb
simulara la navegacion para adelante. Algunas bases de datos no manejan la navegacion para atras. Si $to esta despues
del EOF, $to se movera al final del RecordSet en la mayoria de las bases de datos. Algunas bases de datos poco claras
usando odbc pueden no comportarse de esta manera.
Observacion: Esta funcion emplea posicionamiento absoluto , a comparacion de Microsoft's ADO.
Regresa verdadero o falso. Si es falso, el cursor interno no se mueve en la mayoria de las implementaciones, en cuyo caso
AbsolutePosition( ) regresara la ultima posicion del cursor antes del Move( ).
MoveFirst()
Internamente invoca Move(0). Algunas bases de datos no manejan esta funcion.
07/10/2011 7:27
Manual de ADODB
47 de 69
http://www.lacorona.com.mx/fortiz/adodb/docs-adodb-es.htm#rsclose
MoveLast()
Internamente llama Move(RecordCount()-1). Algunas bases de datos no manejan esta funcion.
GetRowAssoc($toUpper=true)
Regresa un arreglo asociativo conteniendo el renglon actual. Las llaves del arreglo son los nombres de las columnas. El
nombre de las columnas esta en mayusculas para facilitar el acceso. Para obtener el siguiente renglon todavia es
necesario invocar MoveNext().
Por ejemplo:
Array ( [ID] => 1 [FIRSTNAME] => Caroline [LASTNAME] => Miranda [CREATED] => 2001-07-05 )
Nota: no use GetRowAssoc() con $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC. debido a que tienen la
misma funcionalidad e interfiere uno con el otro.
AbsolutePage($page=-1)
Regresa la pagina indicada. Requiere que se haya llamado PageExecute() o CachePageExecute(). Ver Ejemplo 8.
AtFirstPage($status='')
Regresa verdadero si esta en la primera pagina, (en base a 1). Requiere que se haya llamado a PageExecute() o
CachePageExecute(). ver Ejemplo 8.
AtLastPage($status='')
Regresa verdadero si esta en la ultima pagina, (en base a 1). Requiere que se haya llamado a PageExecute() o
CachePageExecute(). ver Ejemplo 8.
Fields($colname)
Regresa el valor de la columna $colname. Al nombre de la columna no le afectan las mayusculas.
Esta funcion solo esta por comodidad. Para un mejor rendimiento use $ADODB_FETCH_MODE.
FetchRow()
Regresa un arreglo conteniendo el renglon actual, or falso si es EOF. Internamente FetchRow( ) se mueve al siguiente
renglon despues de regresar el renglon actual.
ADVERTENCIA: No mezcle FetchRow() con MoveNext().
Uso:
$rs = $db->Execute($sql);
if ($rs)
while ($arr = $rs->FetchRow()) {
# process $arr
}
FetchInto(&$array)
Pone en el arreglo $array el renglon actual. Regresa un objeto PEAR_Error si EOF, 1 si es correcto (la constante
DB_OK). Si PEAR no esta definido regresa falso cuando encuentra EOF. Internamente FetchInto() se mueve al siguiente
registro despues de regresar el renglon actual.
Es mas facil de usar FetchRow(). Vea arriba.
FetchField($column_number)
Regresa un objeto conteniendo name, type and max_length de el campo solicitado. Si max_length no se pueden
determinar con confianza, tendra el valor de -1. El numero de columna esta en base a cero (la primer columna es 0). Ver
el ejemplo 2.
FieldCount( )
07/10/2011 7:27
Manual de ADODB
48 de 69
http://www.lacorona.com.mx/fortiz/adodb/docs-adodb-es.htm#rsclose
FetchObject($toupper=true)
Regresa el renglon actual como un object. Si se manda $toupper = true, entonces los campos de los objetos estaran en
mayusculas. Nota. La nueva funcion FetchNextObject() es el metodo recomendado para accesar los renglones como
objetos. Vea a continuacion.
FetchNextObject($toupper=true)
Obtiene el renglon actual como un objeto y automaticamente avanza al siguiente renglon. Regresa falso si esta al final del
archivo (EOF). Si se manda $toupper = true, entonces los campos del objeto estaran en mayusculas.
$rs = $db->Execute('select firstname,lastname from table');
if ($rs) {
while ($o = $rs->FetchNextObject()) {
print "$o->FIRSTNAME, $o->LASTNAME<BR>";
}
}
Hay una concesion en la velocidad por usar FetchNextObject(). Si el rendimiento es importante, se deben de accesar los
renglones con el arreglo fields[].
FetchObj()
Regresa el renglon actual como un objeto. Los nombres de los campos no se convierten a mayusculas al contrario de
FetchObject.
FetchNextObj()
Regresa el renglon actual como un objeto y se mueve al siguiente registro. Si hay EOF regresa falso. Los campos no se
convierten a mayusculas al contrario de FetchNextObject.
CurrentRow( )
Regresa el numero del renglon actual, Regresa 0 si es el primer renglon.
AbsolutePosition( )
Sinonimo de CurrentRow para compatibilidad con ADO. Regresa el numero del renglon actual. 0 si es el primer renglon.
07/10/2011 7:27
Manual de ADODB
49 de 69
http://www.lacorona.com.mx/fortiz/adodb/docs-adodb-es.htm#rsclose
MetaType($nativeDBType[,$field_max_length],[$fieldobj])
Determina el meta tipo generic del tipo de campo nativo $nativeDBType de la base de datos, y la longitud del campo
$field_max_length. Toma en cuenta que field_max_length puede ser -1 si no es conocido. El objeto del campo regresado
por FetchField() puede ser pasado a $fieldobj o como el primer parametro $nativeDBType. Es util para bases de datos
como mysql que tienen propiedades adicionales en el objeto de campo como primary_key.
Emplea el campo blobSize y lo compara con $field_max_length para determinar si campo caracter es realmente un
blob. Por ejemplo, $db->MetaType('char') will return 'C'.
Regresa:
C: Campo caracter que debe ser mostrador en una etiqueta <input type="text">.
X: Clob (character large objects), o campos de textos largos que deberia de ser mostrado en <textarea>
D: Campo fecha
T: Campo Timestamp o datetime
L: Campo logico (boleano o de bit)
N: Campo numerico. Incluye decimal, numeric, punto flotante, y real.
I: Campo entero.
R: Campo contador o auto-incremento. Debe de ser numerico.
B: Blob o binario objeto largo.
Desde ADOdb 3.0, MetaType acepta $fieldobj como el primer parametro, en lugar de $nativeDBType.
Close( )
Cierra el recordset, limpia toda la memoria y recursos asociados con el recordset.
Si no se esta usando la administracion de memoria, no hay necesidad de llamar a esta funcion ya que los recordset son
cerrados por PHP al final del script. Los enunciados SQL como INSERT/UPDATE/DELETE no regresan realmente un
recordset, por lo que no hay que llamar a Close() para esos enunciados SQL.
07/10/2011 7:27
Manual de ADODB
50 de 69
http://www.lacorona.com.mx/fortiz/adodb/docs-adodb-es.htm#rsclose
5. Los objetos de parametros de ADO no estan soportados. En su lugar existe la funcion ADOConnection::Parameter(
), la cual proporciona una interfase mas sencilla para nombrar parametros preparados e invocar procedimientos
almacenados.
6. Las propiedades del recordset para paginacion estan disponibles, pero implementados como en el Ejemplo 8.
07/10/2011 7:27
Manual de ADODB
51 de 69
http://www.lacorona.com.mx/fortiz/adodb/docs-adodb-es.htm#rsclose
Optimizando PHP
Para informacion para optimizar PHP, lea este articulo acerca de Optimizando PHP.
Implemented Transpose() for recordsets. Recordset must be retrieved using ADODB_FETCH_NUM. First column
becomes the column name.
$DB = NewADOConnection('mysql');
$DB->Connect(...);
$DB->SetFetchMode(ADODB_FETCH_NUM);
$rs = $DB->Execute('select productname,productid,unitprice from products limit 10');
$rs2 = $DB->Transpose($rs);
rs2html($rs2);
07/10/2011 7:27
Manual de ADODB
52 de 69
http://www.lacorona.com.mx/fortiz/adodb/docs-adodb-es.htm#rsclose
07/10/2011 7:27
Manual de ADODB
53 de 69
http://www.lacorona.com.mx/fortiz/adodb/docs-adodb-es.htm#rsclose
The adodb-perf.inc.php CreateLogTable() code now works for user-defined table names.
Error in ibase_blob_open() fixed. See http://phplens.com/lens/lensforum/msgs.php?id=14997
4.80 8 Mar 2006
Added activerecord support.
Added mysql $conn->compat323 = true if you want MySQL 3.23 compat enabled. Fixes GetOne() Select-Limit
problems.
Added adodb-xmlschema03.inc.php to support XML Schema version 3 and updated adodb-datadict.htm docs.
Better memory management in Execute. Thx Mike Fedyk.
4.72 21 Feb 2006
Added 'new' DSN parameter for NConnect().
Pager now sanitizes $PHP_SELF to protect against XSS. Thx to James Bercegay and others.
ADOConnection::MetaType changed to setup $rs->connection correctly.
New native DB2 driver contributed by Larry Menard, Dan Scott, Andy Staudacher, Bharat Mediratta.
The mssql CreateSequence() did not BEGIN TRANSACTION correctly. Fixed. Thx Sean Lee.
The _adodb_countrecs() function in adodb-lib.inc.php has been revised to handle more ORDER BY variations.
4.71 24 Jan 2006
Fixes postgresql security issue related to binary strings. Thx to Andy Staudacher.
Several DSN bugs found:
1. Fix bugs in DSN connections introduced in 4.70 when underscores are found in the DSN.
2. DSN with _ did not work properly in PHP5 (fine in PHP4). Fixed.
3. Added support for PDO DSN connections in NewADOConnection(), and database parameter in PDO::Connect().
The oci8 datetime flag not correctly implemented in ADORecordSet_array. Fixed.
Added BlobDelete() to postgres, as a counterpoint to UpdateBlobFile().
Fixed GetInsertSQL() to support oci8po.
Fixed qstr() issue with postgresql with \0 in strings.
Fixed some datadict driver loading issues in _adodb_getdriver().
Added register shutdown function session_write_close in adodb-session.inc.php for PHP 5 compat. See
http://phplens.com/lens/lensforum/msgs.php?id=14200.
4.70 6 Jan 2006
Many fixes from Danila Ulyanov to ibase, oci8, postgres, mssql, odbc_oracle, odbtp, etc drivers.
Changed usage of binary hint in adodb-session.inc.php for mysql. See http://phplens.com/lens/lensforum
/msgs.php?id=14160
Fixed invalid variable reference problem in undomq(), adodb-perf.inc.php.
Fixed http://phplens.com/lens/lensforum/msgs.php?id=14254 in adodb-perf.inc.php, _DBParameter() settings of
fetchmode was wrong.
Fixed security issues in server.php and tmssql.php discussed by Andreas Sandblad in a Secunia security advisory. Added
07/10/2011 7:27
Manual de ADODB
54 de 69
http://www.lacorona.com.mx/fortiz/adodb/docs-adodb-es.htm#rsclose
$ACCEPTIP = 127.0.0.1 and changed suggested root password to something more secure.
Changed pager to close recordset after RenderLayout().
4.68 25 Nov 2005
PHP 5 compat for mysqli. MetaForeignKeys repeated twice and MYSQLI_BINARY_FLAG missing.
PHP 5.1 support for postgresql bind parameters using ? did not work if >= 10 parameters. Fixed. Thx to Stanislav
Shramko.
Lots of PDO improvements.
Spelling error fixed in mysql MetaForeignKeys, $associative parameter.
4.67 16 Nov 2005
Postgresql not_null flag not set to false correctly. Thx Cristian MARIN.
We now check in Replace() if key is in fieldArray. Thx Sstien Vanvelthem.
_file_get_contents() function was missing in xmlschema. fixed.
Added week in year support to SQLDate(), using 'W' flag. Thx Spider.
In sqlite metacolumns was repeated twice, causing PHP 5 problems. Fixed.
Made debug output XHTML compliant.
4.66 28 Sept 2005
ExecuteCursor() in oci8 did not clean up properly on failure. Fixed.
Updated xmlschema.dtd, by "Alec Smecher" asmecher#smecher.bc.ca
Hardened SelectLimit, typecasting nrows and offset to integer.
Fixed misc bugs in AutoExecute() and GetInsertSQL().
Added $conn->database as the property holding the database name. The older $conn->databaseName is retained for
backward compat.
Changed _adodb_backtrace() compat check to use function_exists().
Bug in postgresql MetaIndexes fixed. Thx Kevin Jamieson.
Improved OffsetDate for MySQL, reducing rounding error.
Metacolumns added to sqlite. Thx Mark Newnham.
PHP 4.4 compat fixes for GetAssoc().
Added postgresql bind support for php 5.1. Thx Cristiano da Cunha Duarte
OffsetDate() fixes for postgresql, typecasting strings to date or timestamp.
DBTimeStamp formats for mssql, odbc_mssql and postgresql made to conform with other db's.
Changed PDO constants from PDO_ to PDO:: to support latest spec.
4.65 22 July 2005
Reverted 'X' in mssql datadict to 'TEXT' to be compat with mssql driver. However now you can set $datadict->typeX =
'varchar(4000)' or 'TEXT' or 'CLOB' for mssql and oci8 drivers.
Added charset support when using DSN for Oracle.
07/10/2011 7:27
Manual de ADODB
55 de 69
http://www.lacorona.com.mx/fortiz/adodb/docs-adodb-es.htm#rsclose
X->varchar(4000) XL->CLOB
07/10/2011 7:27
Manual de ADODB
56 de 69
http://www.lacorona.com.mx/fortiz/adodb/docs-adodb-es.htm#rsclose
mssql: X->XL->TEXT
mysql: X->XL->LONGTEXT
fbird: X->XL->varchar(4000)
to:
oci8:
mssql:
mysql:
fbird:
X->varchar(4000)
X->VARCHAR(4000)
X->TEXT
X->VARCHAR(4000)
XL->CLOB
XL->TEXT
XL->LONGTEXT
XL->VARCHAR(32000)
Added $connection->disableBlobs to postgresql to improve performance when no bytea is used (2-5% improvement).
Removed all HTTP_* vars.
Added $rs->tableName to be set before calling AutoExecute().
Alex Rootoff rootoff#pisem.net contributed ukrainian language file.
Added new mysql_option() support using $conn->optionFlags array.
Added support for ldap_set_option() using the $LDAP_CONNECT_OPTIONS global variable. Contributed by Josh
Eldridge.
Added LDAP_* constant definitions to ldap.
Added support for boolean bind variables. We use $conn->false and $conn->true to hold values to set false/true to.
We now do not close the session connection in adodb-session.inc.php as other objects could be using this connection.
We now strip off \0 at end of Ixora SQL strings in $perf->tohtml() for oci8.
4.61 23 Feb 2005
MySQLi added support for mysqli_connect_errno() and mysqli_connect_error().
Massive improvements to alpha PDO driver.
Quote string bind parameters logged by performance monitor for easy type checking. Thx Jason Judge.
Added support for $role when connecting with Interbase/firebird.
Added support for enum recognition in MetaColumns() mysql and mysqli. Thx Amedeo Petrella.
The sybase_ase driver contributed by Interakt Online. Thx Cristian Marin cristic#interaktonline.com.
Removed not_null, has_default, and default_value from ADOFieldObject.
Sessions code, fixed quoting of keys when handling LOBs in session write() function.
Sessions code, added adodb_session_regenerate_id(), to reduce risk of session hijacking by changing session cookie
dynamically. Thx Joe Li.
Perf monitor, polling for CPU did not work for PHP 4.3.10 and 5.0.0-5.0.3 due to PHP bugs, so we special case these
versions.
Postgresql, UpdateBlob() added code to handle type==CLOB.
4.60 24 Jan 2005
Implemented PEAR DB's autoExecute(). Simplified design because I don't like using constants when strings work fine.
_rs2serialize will now update $rs->sql and $rs->oldProvider.
Added autoExecute().
Added support for postgres8 driver. Currently just remapped to postgres7 driver.
07/10/2011 7:27
Manual de ADODB
57 de 69
http://www.lacorona.com.mx/fortiz/adodb/docs-adodb-es.htm#rsclose
Changed oci8 _query(), so that OCIBindByName() sets the length to -1 if element size is > 4000. This provides better
support for LONGs.
Added SetDateLocale() support for netherlands (Nl).
Spelling error in pivot code ($iff should be $iif).
mysql insert_id() did not work with mysql 3.x. Fixed.
"\r\n" not converted to spaces correctly in exporting data. Fixed.
_nconnect() in mysqli did not return value correctly. Fixed.
Arne Eckmann contributed danish language file.
Added clone() support to FetchObject() for PHP5.
Removed SQL_CUR_USE_ODBC from odbc_mssql.
4.55 5 Jan 2005
Found bug in Execute() with bind params for db's that do not support binding natively.
DropSequence() now correctly uses default parameter.
Now Execute() ignores locale for floats, so 1.23 is NEVER converted to 1,23.
SetFetchMode() not properly saved in adodb-perf, suspicious sql and expensive sql. Fixed.
Added INET to postgresql metatypes. Thx motzel.
Allow oracle hints to work when counting with _adodb_getcount in adodb-lib.inc.php. Thx Chris Wrye.
Changed mysql insert_id() to use SELECT LAST_INSERT_ID().
If alter col in datadict does not modify col type/size of actual col, then it is removed from alter col code. By Mark
Newham. Not perfect as MetaType() !== ActualType().
Added handling of view fields in metacolumns() for postgresql. Thx Renato De Giovanni.
Added to informix MetaPrimaryKeys and MetaColumns fixes for null bit. Thx to Cecilio Albero.
Removed obsolete connection_timeout() from perf code.
Added support for arrayClass in adodb-csv.inc.php.
RSFilter now accepts methods of the form $array($obj, 'methodname'). Thx to blake#near-time.com.
Changed CacheFlush to $cmd = 'rm -rf '.$ADODB_CACHE_DIR.'/[0-9a-f][0-9a-f]/';
For better cursor concurrency, added code to free ref cursors in oci8 when $rs->Close() is called. Note that CLose() is
called internally by the Get* functions too.
Added IIF support for access when pivoting. Thx Volodia Krupach.
Added mssql datadict support for timestamp. Thx Alexios.
Informix pager fix. By Mario Ramirez.
ADODB_TABLE_REGEX now includes ':'. By Mario Ramirez.
Mark Newnham contributed MetaIndexes for oci8 and db2.
4.54 5 Nov 2004
Now you can set $db->charSet = ?? before doing a Connect() in oci8.
07/10/2011 7:27
Manual de ADODB
58 de 69
http://www.lacorona.com.mx/fortiz/adodb/docs-adodb-es.htm#rsclose
07/10/2011 7:27
Manual de ADODB
59 de 69
http://www.lacorona.com.mx/fortiz/adodb/docs-adodb-es.htm#rsclose
Fixed mysqli MetaType() recognition. Mysqli returns numeric types unlike mysql extension. Thx Francesco Riosa.
VFP odbc driver curmode set wrongly, causing problems with memo fields. Fixed.
Odbc driver did not recognize odbc version 2 driver date types properly. Fixed. Thx Bostjan.
ChangeTableSQL() fixes to datadict-db2.inc.php by Mark Newnham.
Perf monitoring with odbc improved. Now we try in perf code to manually set the sysTimeStamp using date() if
sysTimeStamp is empty.
All ADO errors are thrown as exceptions in PHP5. So we added exception handling to ado in PHP5 by creating new
adodb-ado5.inc.php driver.
Added IsConnected(). Returns true if connection object connected. By Luca.Gioppo.
"Ralf Becker" RalfBecker#digitalROCK.de contributed new sapdb data-dictionary driver and a large patch that
implements field and table renaming for oracle, mssql, postgresql, mysql and sapdb. See the new RenameTableSQL() and
RenameColumnSQL() functions.
We now check ExecuteCursor to see if PrepareSP was initially called.
Changed oci8 datadict to use MODIFY for $dd->alterCol. Thx Mark Newnham.
4.52 10 Aug 2004
Bug found in Replace() when performance logging enabled, introduced in ADOdb 4.50. Fixed.
Replace() checks update stmt. If update stmt fails, we now return immediately. Thx to alex.
Added support for $ADODB_FORCE_TYPE in GetUpdateSQL/GetInsertSQL. Thx to niko.
Added ADODB_ASSOC_CASE support to postgres/postgres7 driver.
Support for DECLARE stmt in oci8. Thx Lochbrunner.
4.51 29 July 2004
Added adodb-xmlschema 1.0.2. Thx dan and richard.
Added new adorecordset_ext_* classes. If ADOdb extension installed for mysql, mysqlt and oci8 (but not oci8po), we
use the superfast ADOdb extension code for movenext.
Added schema support to mssql and odbc_mssql MetaPrimaryKeys().
Patched MSSQL driver to support PHP NULL and Boolean values while binding the input array parameters in the
_query() function. By Stephen Farmer.
Added support for clob's for mssql, UpdateBlob(). Thx to gfran#directa.com.br
Added normalize support for postgresql (true=lowercase table name, or false=case-sensitive table names) to
MetaColumns($table, $normalize=true).
PHP5 variant dates in ADO not working. Fixed in adodb-ado.inc.php.
Constant ADODB_FORCE_NULLS was not working properly for many releases (for GetUpdateSQL). Fixed. Also
GetUpdateSQL strips off ORDER BY now - thx Elieser Leo.
Perf Monitor for oci8 now dynamically highlights optimizer_* params if too high/low.
Added dsn support to NewADOConnection/ADONewConnection.
Fixed out of page bounds bug in _adodb_pageexecute_all_rows() Thx to "Sergio Strampelli" sergio#rir.it
Speedup of movenext for mysql and oci8 drivers.
07/10/2011 7:27
Manual de ADODB
60 de 69
http://www.lacorona.com.mx/fortiz/adodb/docs-adodb-es.htm#rsclose
07/10/2011 7:27
Manual de ADODB
61 de 69
http://www.lacorona.com.mx/fortiz/adodb/docs-adodb-es.htm#rsclose
Added $gmt parameter (true/false) to UserDate and UserTimeStamp in connection class, to force conversion of input (in
local time) to be converted to UTC/GMT.
Mssql datadict did not support INT types properly (no size param allowed). Added _GetSize() to datadict-mssql.inc.php.
For borland_ibase, BeginTrans(), changed:
$this->_transactionID = $this->_connectionID;
to
$this->_transactionID = ibase_trans($this->ibasetrans, $this->_connectionID);
07/10/2011 7:27
Manual de ADODB
62 de 69
http://www.lacorona.com.mx/fortiz/adodb/docs-adodb-es.htm#rsclose
07/10/2011 7:27
Manual de ADODB
63 de 69
http://www.lacorona.com.mx/fortiz/adodb/docs-adodb-es.htm#rsclose
07/10/2011 7:27
Manual de ADODB
64 de 69
http://www.lacorona.com.mx/fortiz/adodb/docs-adodb-es.htm#rsclose
07/10/2011 7:27
Manual de ADODB
65 de 69
http://www.lacorona.com.mx/fortiz/adodb/docs-adodb-es.htm#rsclose
07/10/2011 7:27
Manual de ADODB
66 de 69
http://www.lacorona.com.mx/fortiz/adodb/docs-adodb-es.htm#rsclose
07/10/2011 7:27
Manual de ADODB
67 de 69
http://www.lacorona.com.mx/fortiz/adodb/docs-adodb-es.htm#rsclose
07/10/2011 7:27
Manual de ADODB
68 de 69
http://www.lacorona.com.mx/fortiz/adodb/docs-adodb-es.htm#rsclose
07/10/2011 7:27
Manual de ADODB
69 de 69
http://www.lacorona.com.mx/fortiz/adodb/docs-adodb-es.htm#rsclose
The odbc_mssql driver now sets CONCAT_NULL_YIELDS_NULL OFF for compat with mssql driver.
0.10 Sept 9 2000 First release
07/10/2011 7:27