Programacion Web Avanzada
Programacion Web Avanzada
Programacion Web Avanzada
CAMPUS TUXTEPEC
ASIGNATURA:
Programacin web avanzada
CARRERA:
Ingeniera en Informtica
SEMESTRE: 10to.
GRUPO: A
CATEDRATICO:
M.S.C. Vctor Manuel Evaristo Salinas
UNIDAD:
IIII
PRESENTA:
Ricardo Vzquez Pavn
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 adodbsession.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.
Facil para programadores Windows debido a que muchas de las convenciones son
similares al ADO de Microsoft.
A diferencia de otras clases PHP de base de datos que se enfocas unicamente en el
enunciado SELECT. ADOdb soporta codigo para manajar INSERT y UPDATE que
son rapidamente adaptables a multiples bases de datos. Tambien hay metodos para
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:
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().
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";
'dialect','charset','buffers','role'
M'soft ADO
'charpage'
MySQL
'clientflags'
MySQLi
Oci8
'nls_date_format','charset'
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.
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),
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.
$conn->Connect(false, 'scott', 'tiger');
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);
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);
include('adodb.inc.php');
$db = &ADONewConnection("ado_mssql");
print "<h1>Connecting DSN-less $db->databaseType...</h1>";
$myDSN="PROVIDER=MSDASQL;DRIVER={SQL Server};"
. "SERVER=flipper;DATABASE=ai;UID=sa;PWD=;"
$db->Connect($myDSN);
$rs->MoveNext();
var_dump($array);
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 GetArray(), el cual usa
internamente la funcion de alta velocidad de la extension adodb_getall($rs).
Execute() es la manera usal para ejecutar enunciados SQL. Puedes usar la funcion de bajo
nivel _Execute() y _query() para reducir el costo. Ambas funciones comparten los mismos
parametros que Execute().
Si no tienes ningun parametro posicional o si tu base de datos soporta los parametros
posicionales (sin emulacion), entonces puedes llamar _Execute() directamente. AL invocar
esta funcion eliminas la emulacion de parametros. La depuracion tambien es manejada por
_Execute().
Si no requuieres depuracion ni emulacion de parametros, no requieres obtener un
recordset, entonces puedes llamar _query. Es muy buena para inserts, updates y deletes. Al
invocar esta funcion omites la emulacion de parametros, la depuracion y el majejo de
recordsets. _query() regresa el resultid, true o false.
Recomendacion para INFORMIX: Desabilita los cursores navegables 'scroll' con $db>cursorType = 0.
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
$rs = $db->Execute($sql);
foreach($rs as $k => $row) {
echo "r1=".$row[0]." r2=".$row[1]."<br>";
}
$db->Connect('','scott','bad-password');
} catch (exception $e) {
var_dump($e);
}
sirve
RecordCount
()
PreSistemas
requisito operativo
s
s
access
S/N
ODBC
ado
? depende de
la base de
datos
ADO o
Windows
proveedor unicamente
OLEDB
Windows
unicamente
ADO o
Windows
proveedor unicamente
OLEDB
ado_mssql
ADO o
Windows
proveedor unicamente
OLEDB
db2
S/N
Interfase
CLI/ODB
C 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
vfp
fbsql
ibase
S/N
Interfase
CLI/ODB
C 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.
ODBC
Windows
unicamente
FrontBase.
Unix y
Windows
cliente
Interbase
Unix y
Windows
S/N
cliente
Interbase
Unix y
Windows
borland_ibas C
e
S/N
cliente
Interbase
Unix y
Windows
informix72
S/N
Cliente
Informix
Unix y
Windows
informix
S/N
Cliente
Informix
Unix y
Windows
ldap
Extension
LDAP
firebird
mssql
cliente
Mssql
Unix y
Windows.
Guia de
instalacion
de Unix y
otra mas.
mssqlpo
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
ODBC
Unix y
Windows.
Trucos para
Unix.
odbc_mssql
S/N
ODBC
Unix y
Windows.
odbc_oracle
S/N
ODBC
Unix y
Windows.
odbtp
S/N
odbtp
Unix y
Windows
S/N
odbtp
Unix y
Windows
odbtp_unico C
de
oracle
S/N
Cliente
Oracle
Unix y
Windows
netezza
postgres
Cliente
Unix y
PostgreSQ Windows.
L
postgres64
Cliente
Unix y
PostgreSQ Windows.
L
postgres7
Cliente
Unix y
PostgreSQ Windows.
L
postgres8
Cliente
Unix y
PostgreSQ Windows.
L
sapdb
Cliente
ODBC de
SAPdb
sqlanywhere C
sqlite
S/N
Cliente
?
ODBC de
SQL
Anywhere
ODBC
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
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')
Seleccionar los registros de una tabla, desplegar las primeras dos columnas. Si la segunda
columna es un campo DATE o TIMESTAMP entonces reformatear la fecha al formato
americano.
<?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
$recordSet = &$conn->Execute('select CustomerID,OrderDate from Orders');
if (!$recordSet)
print $conn->ErrorMsg();
else
while (!$recordSet->EOF) {
$fld = $recordSet->FetchField(1);
$type = $recordSet->MetaType($fld->type);
if ( $type == 'D' || $type == 'T')
print $recordSet->fields[0].' '.
$recordSet->UserDate($recordSet>fields[1],'m/d/Y').'<BR>';
else
print $recordSet->fields[0].' '.$recordSet->fields[1].'<BR>';
$recordSet->MoveNext();
}
$recordSet->Close(); # opcional
$conn->Close(); # opcional
?>
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');
$conn = &ADONewConnection('access');
$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>';
}
?>
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");
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.
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');
$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):
Date Created
36 Alan
Turing
37 Serena
Williams
38 Yat Sun
Sun
39 Wai Hun
See
40 Steven
Oey
Page 8/10
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.
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();
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);
?>
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>';
}
?>
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
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>";
}
DB_Common
query - si regresa PEAR_Error si hay error
limitQuery - si regresa PEAR_Error si hay error
prepare - no regresa PEAR_Error si hay error
execute - no regresa PEAR_Error si hay error
setFetchMode - maneja ASSOC y ORDERED
errorNative
quote
nextID
disconnect
getOne
getAssoc
getRow
getCol
DB_Result
numRows - regresa -1 si no esta soportado
numCols
fetchInto - no maneja indicar el fetchmode
fetchRows - no maneja indicar el fetchmode
free
$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
);
SELECT CompanyName,
SUM(CASE WHEN CategoryName='Beverages' THEN 1 ELSE 0 END) AS "Beverages",
SUM(CASE WHEN CategoryName='Condiments' THEN 1 ELSE 0 END) AS "Condiments",
SUM(CASE WHEN CategoryName='Confections' THEN 1 ELSE 0 END) AS "Confections",
SUM(CASE WHEN CategoryName='Dairy Products' THEN 1 ELSE 0 END) AS "Dairy
Products",
SUM(CASE WHEN CategoryName='Grains/Cereals' THEN 1 ELSE 0 END) AS
"Grains/Cereals",
SUM(CASE WHEN CategoryName='Meat/Poultry' THEN 1 ELSE 0 END) AS
"Meat/Poultry",
SUM(CASE WHEN CategoryName='Produce' THEN 1 ELSE 0 END) AS "Produce",
SUM(CASE WHEN CategoryName='Seafood' THEN 1 ELSE 0 END) AS "Seafood",
SUM(1) as Total
FROM products p ,categories c ,suppliers s WHERE p.CategoryID = c.CategoryID
and s.SupplierID= p.SupplierID
GROUP BY CompanyName
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,
# conexion adodb
'products p ,categories c ,suppliers s',
# tablas
'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 (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')
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
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.
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])
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));
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.
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));
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 adodb-error.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.
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);
Para ODBC y bases de datos que no manejan secuencias en forma nativa (ej mssql, mysql),
se crea la tabla para cada secuencia. Si la secuencia no habia sido definida anteriormente se
creara con el valor inicial de $startID.
Nota, el driver de mssql anterior a la version 1.90 generaba GenID() de 16 bytes (GUID).
UpdateBlob($table,$column,$val,$where)
Permite almacenar el valor blob de $val en la columna $column de la tabla $table en el
renglon que cumpla el criterio $where.
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
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 256K en adodb 4.54.
'INSERT' o 1 o DB_AUTOQUERY_INSERT
'UPDATE' o 2 o DB_AUTOQUERY_UPDATE
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.
$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
Puedes tambiar indicar un valor especifico para tu base de datos como 'SNAPSHOT' para
mssql o 'READ ONLY' para oci8/postgres.
Ve la secccion 'transaction levels' para PostgreSQL, Oracle, MySQL, MS SQL Server e
Informix.
GetAssoc($sql,$inputarr=false,$force_array=false,$first2cols=false)
Regresa un arreglo asociativo para el enunciado SQL solicitado en $sql, opcionalmente
puede tener liga de parametros usando $inputarr. Si el numero de columnas obtenido es
mayor a dos, se genera un arreglo bidimensional con la primera columa del recordset como
la llave del resto de los campos. Si hay exactamente dos columnas, se obtiene un arreglo de
una dimension donde la llave (primera columna) apunta a su valor (segunda columna). A
menos que $force_array tenga el valor true, en cuyo caso se crea un arreglo para cada
valor.
Ejemplos:
Si tenemos los siguientes datos en el recordset:
renglon1: Manzana, Fruta, Comible
renglon2: Cactus, Planta, Incomible
renglon3: Rosa, Flor, Comible
GetAssoc generara el siguiente arreglo asociativo bidimensional:
Manzana => array[Fruta, Comible]
Cactus => array[Planta, Incomible]
Rosa => array[Flor,Comible]
Si el conjunto de datos es:
renglon1: Manzana, Fruta
renglon2: Cactus, Planta
renglon3: Rosa, Flor
GetAssoc generara el siguiente arreglo asociativo (con $force_array==false):
Manzana => Fruta
Cactus=>Planta
Rosa=>Flor
La funcion regresa el arreglo asociativo, o falso si ocurrio un error.
CacheGetAssoc([$secs2cache,] $sql,$inputarr=false,$force_array=false,$first2cols=false)
La version con cache de la funcion GetAssoc anterior.
GetOne($sql,$inputarr=false)
Ejecuta el enunciado SQL y regresa el primer campo del primer renglon. El recordset y el
resto de los renglones son descartados automaticamente. Si hay un error la funcion regresa
false.
GetRow($sql,$inputarr=false)
Ejecuta el enunciado SQL y regresa el primer renglon como un arreglo. El recordset y el
resto de los renglones son descartados automaticamente. Si hay un error la funcion regresa
false.
GetAll($sql)
Ejecuta el enunciado SQL y regresa todos los renglones como un arreglo bidimensional. El
recordset es descartado automaticamente. Si hay un error la funcion regresa false.
GetCol($sql,$inputarr=false,$trim=false)
Ejecuta el enunciado SQL y regresa todos los elementos de la primera columna como un
arreglo dimencional. El recordset es descartado automaticamente. Si ocurre un error
regresa false.
CacheGetOne([$secs2cache,] $sql,$inputarr=false), CacheGetRow([$secs2cache,]
$sql,$inputarr=false), CacheGetAll([$secs2cache,] $sql,$inputarr=false),
CacheGetCol([$secs2cache,] $sql,$inputarr=false,$trim=false)
Similares a las funciones Get* anteriores, excepto que el recordset es almacenado en el
cache indicado en $ADODB_CACHE_DIR por $secs2cache segundos. Es bueno para
acelerar preguntas en datos que cambian poco. El parametro $secs2cache es opcional. Si se
omite se usa el valor de $connection->cacheSecs (normalmente de 3600 segundos o 1 hora).
Prepare($sql )
Prepara (compila) un enunciado SQL para ejecutarse repetitivamente. Los parametros se
representan por ?, excepto para el driver oci8, que emplea el metodo usual de Oracle de
:varname.
Regresa un arreglo que contiene el enunciado SQL original como primera posicion, las
demas posiciones del arreglo varian para cada driver. Si hubo un error o se esta emulando
el Prepare( ), se regresa la cadena $sql original. Esto es porque todo el manejo de errores se
hace en el Execute().
Prepare( ) no puede ser usado en funciones que usan la tecnica de modificar el enunciado
SQL como PageExecute( ) y SelectLimit( ).
Ejemplo:
$stmt = $conn->Prepare('insert into table (col1,col2) values (?,?)');
for ($i=0; $i < $max; $i++)
$conn->Execute($stmt,array((string) rand(), $i));
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 )
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.
[$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,
tracer text NOT NULL,
timer decimal(16,6) NOT NULL
)
postgres:
CREATE TABLE adodb_logsql (
created timestamp NOT NULL,
sql0 varchar(250) NOT NULL,
sql1 text NOT NULL,
params text NOT NULL,
tracer text NOT NULL,
timer decimal(16,6) NOT NULL
)
mssql:
CREATE TABLE adodb_logsql (
created datetime NOT NULL,
sql0 varchar(250) NOT NULL,
sql1 varchar(4000) NOT NULL,
params varchar(3000) NOT NULL,
tracer varchar(500) NOT NULL,
timer decimal(16,6) NOT NULL
)
oci8:
CREATE TABLE adodb_logsql (
created date NOT NULL,
sql0 varchar(250) NOT NULL,
sql1 varchar(4000) NOT NULL,
params varchar(4000),
tracer varchar(4000),
timer decimal(16,6) NOT NULL
)
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');
{
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().
Formatea el campo $date en un formato fecha que la base de datos acepte. Se emplea en
enunciados INSERT/UPDATE; para enunciados SELECT emplee SQLDate. El parametro
$date puede ser un entero con la fecha Unix o una cadena en formato ISO Y-m-d. Emplea
la propiedad fmtDate que contiene el formato a emplear. Si le menda como parametro null
o false o '', genera un null de SQL.
Regresa la fecha como una cadena encomillada.
$sql = "select * from atable where created > ".$db->DBDate("$year-$month$day");
$db->Execute($sql);
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)
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();
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
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 $conn>MetaForeignKeys('empleados') obtendra como resultado:
array(
'departamentos' => array('empl_dept=dept_clav'),
'organigrama' =>
array('empl_puesto=orga_puesto','empl_cat=orga_cat')
)
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=''])
UnixDate($str)
Analiza la cadena $str por una fecha y la regresa en el formato unix para mktime (es decir
un numero indicando el numero de segundos desde el 1 de enero de 1970). Supone que la
fecha tiene formato Y-m-d H:i:s, excepto para Sybase y Microsoft SQL Server, donde
tambien se acepta M d Y (El mes a 3 letras es controlado por un arreglo global que puede
necesitar tropicalizacion).
La funcion esta disponible tanto para ADORecordSet y ADOConnection desde 1.91.
UnixTimeStamp($str)
Analiza la cadena $str por un timestap y lo regresa en el formato unix para mktime (es
decir un numero indicando el numero de segundos desde el 1 de enero de 1970). Espera la
fecha en formato "Y-m-d, H:i:s" (1970-12-24, 00:00:00) o "Y-m-d H:i:s" (1970-12-24
00:00:00) o "YmdHis" (19701225000000), excepto para Sybase y Microsoft SQL Server,
donde tambien se acepta "M d Y h:i:sA" (Dec 25 1970 00:00:00AM), (El mes a 3 letras se
controla por un arreglo global que puede necesitar tropicalizacion).
La funcion esta disponible tanto para ADORecordSet y ADOConnection desde 1.91.
OffsetDate($dayFraction, $basedate=false)
Regresa una cadena con la funcion SQL nativa para calcular fechas futuras y pasadas en
base $basedate. Si $basedate no esta definida entonces se toma la fecha actual (a las 12 de la
noche). Regresa la cadena SQL que realiza los calculos cuando se procesa por Execute().
Por ejemplo, en Oracle, para encontrar la fecha que esta 2.5 dias en el futuro:
# obtener fecha una semana en el futuro
$fld = $conn->OffsetDate(7); // Regresa "(trunc(sysdate)+7")
# obtener fecha y hora que esta 60 horas en el futuro
$fld = $conn->OffsetDate(2.5, $conn->sysTimeStamp); // 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:
Ao a 4 digitis
Trimestre (1-4)
Mes (Jan-Dec)
Mes (01-12)
Dia (01-31)
H:
h:
i:
s:
A:
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.
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( )
Regresa el numero de campos (columnas) en el recordset.
RecordCount( )
regresa el numero de renglones en el recordset. Si el numero de registros obtenidos no se
puede determinar del API de la base de datos, se leeran todos los renglones para poderse
contar. Esta lectura puede ser deshabilitada (por rendimiento) asignandole la variable
$ADODB_COUNTRECS = false. Cuando esta deshabilitada, RecordCount( ) regresara -1
en algunas bases de datos. Vea arriba la lista de bases de datos soportadas para mas
detalle.
RowCount es un sinonimo de RecordCount.
PO_RecordCount($table, $where)
Regresa el numero de registros en el recordset. Si la base de datos no lo maneja, ejecutara
un SELECT COUNT(*) en la tabla $table, con el criterio dado $where, para obtener una
estimacion del tamao del recordset.
$numrows = $rs->PO_RecordCount("articles_table", "group=$group");
NextRecordSet()
Para las bases de datos que permiten que un query regrese varios recordsets, esta funcion
permite cambiarse al siguiente recordset. Unicamente soportada para el driver de mssql.
$rs = $db->Execute('execute return_multiple_rs');
$arr1 = $rs->GetArray();
$rs->NextRecordSet();
$arr2 = $rs->GetArray();
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>";
}
}
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.
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( )
no hay necesidad de cargar el arreglo fields, solo se mueve al siguiente renglon. Regresa
true o false.
_close: Cierra el recordset
Fields: es el arreglo regresado por la extension PHP no es un arreglo asociativo, tendras
que reescribirlo. Ve adodb-odbc.inc.php para un ejemplo. Para bases de datos como
MySQL y MSSQL donde se obtiene un arreglo asociativo, no hay necesidad de reescribir la
funcion.
Campos de ADOConnection a inicializar
canSeek: Con valor true si la funcion _seek funciona.