Manual de Adodb
Manual de Adodb
Manual de Adodb
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
ADOdb de alta velocidad - trucos de optimizacion Modificando y extendiendo ADOdb con seguridad Caracteristicas para PHP5
foreach iterators exceptions
Usando manejadores de errores a la medida o de PEAR Nombres de DSN Memoria intermedia (Caching) Tablas Pivote REFERENCIA
Variables: $ADODB_COUNTRECS $ADODB_ANSI_PADDING_OFF $ADODB_CACHE_DIR $ADODB_FORCE_TYPE $ADODB_FETCH_MODE $ADODB_LANG Constantes: ADODB_ASSOC_CASE ADOConnection Conecciones: Connect PConnect NConnect IsConnected Ejecutando SQL: Execute CacheExecute SelectLimit CacheSelectLimit Param Prepare PrepareSP InParameter OutParameter AutoExecute GetOne CacheGetOne GetRow CacheGetRow GetAll CacheGetAll GetCol CacheGetCol GetAssoc CacheGetAssoc Replace ExecuteCursor (oci8 unicamente) Generando enunciados SQL: GetUpdateSQL GetInsertSQL Concat IfNull length random substr qstr Param OffsetDate SQLDate DBDate DBTimeStamp BindDate BindTimeStamp Blobs: UpdateBlob UpdateClob UpdateBlobFile BlobEncode BlobDecode Paginacion/Desplazamiento: PageExecute CachePageExecute Limpieza: CacheFlush Close Transacciones: StartTrans CompleteTrans FailTrans HasFailedTrans BeginTrans CommitTrans RollbackTransSetTransactionMode Recuperando Datos: SetFetchMode Cadenas: concat length qstr quote substr Fechas: DBDate DBTimeStamp UnixDate UnixTimeStamp OffsetDate SQLDate Renglones: Affected_Rows Insert_ID RowLock GenID CreateSequence DropSequence Manejo de Errores: ErrorMsg ErrorNo MetaError MetaErrorMsg IgnoreErrors Diccionario de datos (metadata): MetaDatabases MetaT ables MetaColumns MetaColumnNames MetaPrimaryKeys MetaForeignKeys ServerInfo Estadisticas y modifacion de SQL: LogSQL fnExecute and fnCacheExecute Descontinuado: Bind BlankRecordSet Parameter
ADORecordSet
Regresa un campo: Fields Regresa un renglon:FetchRow FetchInto FetchObject FetchNextObject FetchObj FetchNextObj GetRowAssoc Regresa todos los renglones:GetArray GetRows GetAssoc Desplazamiento:Move MoveNext MoveFirst MoveLast AbsolutePosition CurrentRow AtFirstPage AtLastPage AbsolutePage Generacion de Menu:GetMenu GetMenu2 Fechas:UserDate UserTimeStamp UnixDate UnixTimeStamp Informacion del Recordset:RecordCount PO_RecordSet NextRecordSet Informacion de un campo:FieldCount FetchField MetaType Limpieza: Close
converted by Web2PDFConvert.com
rs2html ejemplo
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.
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
converted by Web2PDFConvert.com
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.
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!
converted by Web2PDFConvert.com
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";
Las opciones permitidas son: Para todas los drivers Interbase/Firebird M'soft ADO MySQL MySQLi Oci8 'persist', 'persistent', 'debug', 'fetchmode', 'new' 'dialect','charset','buffers','role' 'charpage' 'clientflags' 'port', 'socket', 'clientflags' '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:
converted by Web2PDFConvert.com
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:
converted by Web2PDFConvert.com
SQLite
Sqlite creara la base de datos si no existe.
$conn = &ADONewConnection('sqlite'); $conn->PConnect('c:\path\to\sqlite.db'); # sqlite la creara si no existe
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);
usar una conexion DSN-less se necesita PHP version 4.3 o posterior. Para Microsoft Access:
$db =& ADONewConnection('access'); $dsn = "Driver={Microsoft Access Driver (*.mdb)};Dbq=d:\\northwind.mdb;Uid=Admin;Pwd=;"; $db->Connect($dsn);
o si lo prefieres, se puede usar la extension mssql (que esta limitada a la funcionalildad de la version 6.5):
$db =& ADONewConnection('mssql'); $db->Execute('localhost', 'userid', 'password', 'northwind');
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);
Recuperacion de datos mas rapida usando PHP Recuperacion de datos mas rapida usando la extension ADOdb
$rs =& $rs->Execute($sql); while (!$rs->EOF) { var_dump($rs->fields); $rs->MoveNext(); $rs =& $rs->Execute($sql); $array = adodb_getall($rs); var_dump($array);
converted by Web2PDFConvert.com
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.
PDO: estan disponibles los drivers de PDO. Ve los ejemplos de conexion. Actualemte los drivers PDO no son tan poderosos
como los drivers nativos, y deben de ser tomados como experimentales.
converted by Web2PDFConvert.com
$ADODB_FETCH_MODE = ADODB_FETCH_NUM; $rs = $db->Execute($sql); foreach($rs as $k => $row) { echo "r1=".$row[0]." r2=".$row[1]."<br>"; }
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); }
Nombre
access ado
sirve PreSistemas operativos RecordCount() requisitos S/N ? depende de la base de datos ODBC ADO o proveedor OLEDB Windows unicamente Windows unicamente
ado_access
Hay que configurar $db->codePage antes de conextarse. Microsoft Access/Jet usando ADO. Permite conexiones DSN- S/N less. Para mejor rendimiento usar un proveedor OLEDB. Microsoft SQL Server usando ADO. Permite conexiones DSN- S/N less. Para mejor rendimiento usar un proveedor OLEDB. DB2. Debe de funcionar satisfactoriamente porque se base en S/N el driver ODBC based on ODBC.
ado_mssql
db2
Windows unicamente
Windows unicamente
odbc_db2
S/N
A C B
Microsoft Visual FoxPro. Hay que crear un DSN. FrontBase. Interbase 6 o anterior. Algunos usuarios dicen que puedes necesitar esta sintaxis para conectarte $db->PConnect('localhost:c:/ibase/employee.gdb', "sysdba", "masterkey") . Actualmente le falta Affected_Rows. Antes de conectarte puedes modificarle $db->dialect, $db>buffers y $db->charSet. version Firebird de interbase.
S/N S S/N
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. Unix y Windows. sugerencias para instalacion en Unix. T engo reportes que los parametros $host y $database tienen que ser invertidos en el Connect() cuando se usa la interfase CLI. Windows unicamente Unix y Windows Unix y Windows
firebird
S/N
version Borland de Interbase 6.5 o posterior. S/N Desafortunadamente las version son diferentess. Versiones Informix anteriores a 7.3 que no soportan SELECT S/N FIRST . Driver generico para informix. S/N Driver LDAP driver. Ver el ejemplo para informacion de uso. Microsoft SQL Server 7 y posterior. T anbien funciona con S/N Microsoft SQL Server 2000. T oma en cuenta que el formato de las fechas es problematico con este driver. Por ejemplo, la extension mssql de PHP no regresa los segundos de los
cliente Interbase cliente Interbase Cliente Informix Cliente Informix Extension LDAP cliente Mssql
Unix y Windows Unix y Windows Unix y Windows Unix y Windows ? Unix y Windows. Guia de instalacion de Unix y otra mas.
converted by Web2PDFConvert.com
mssqlpo
campos datetime! Driver portable de mssql. Es identico al driver de mssqk anteriorm excepto que el operador de concatenacion '||' se convirtio a '+'. Esto es util para migrar codigo desde otras versiones de SQL.
S/N
Cliente Mssql
A A
oci8
MySQL sin manejo de transacciones. Puedes usar $dbS/N >clientFlags antes de conectarte. MySQL con soporte de transacciones. Recomendamos usar S/N || como el operador de concatenacion para una mejor portabilidad. Esto se logra ejectuando MySQL con: mysqld --ansi o mysqld --sql-mode=PIPES_AS_CONCAT Oracle 8/9. Tiene mas funcionabilidad que el driver oracle (ej. S/N Affected_Rows). Puedes tener que hacer un putenv('ORACLE_HOME=...') antes del Connect/PConnect. hay dos maneras de conectarse - Con la direccion IP del servidor y el nombre del servicio: PConnect('serverip:1521','scott','tiger','service') o en base a un renglon en TNSNAMES.ORA o ONAMES o HOSTNAMES: PConnect(false, 'scott', 'tiger', $oraname). A partir de la version 2.31, se manejan las variables de cursores REF directamente (ver ExecuteCursor). Maneja un funcionaldiad reducida para la version 8.0.5 de S/N Oracle. SelectLimit no es tan eficiente como en los drivers oci8 o oci8po. Driver portable de Oracle 8/9. Esta es casi identica al driver S/N oci8 execpto que (a) Las variables 'bind' en los Prepare() usan ? en lugar de :bindvar, (b) los nombres de campos estan en minusculas (la manera mas usual en PHP). Usa este driver si la portabilidad de tu codigo a otras bases de datos es importante. En caso contrario usa el driver oci8 ya que da mejor rendimiento. Driver generico para ODBC, no esta optimizado para ninguna base de datos especifica. Para conectarse usa PConnect('DSN','user','pwd'). Esta es la clase base para todos los drivers basados en ODBC . Usa ODBC para conectarse a MSSQL Usa ODBC para conectarse a Oracle Driver odbtp generico. Odbtp es un programa para poder usar los DSN en el ODBC de Windows desde OTROS sistemas operativos (ej. Linux). Odtbp con soporte unicode Implementa el viejo API de Oracle 7. Si te es posible usa el driver oci8 para un mejor rendimiento. Driver para Netezza. Netezza esta basado en el codigo base de postgres. Driver generico PostgreSQL. Actualmente es identico al driver postgres7. Para PostgreSQL 6.4 y anteriores que no manejan LIMIT internamente. PostgreSQL que soporta LIMIT y caracteristicas de la version 7. PostgreSQL que maneja la funcionalidad de la version 8. SAP DB. Debe de funcionar bien ya que esta basado en el driver ODBC. Sybase SQL Anywhere. Debe de funcionar bien ya que esta basado en el driver ODBC.
Cliente Oracle
Unix y Windows
oci805
Unix y Windows
oci8po
Unix y Windows
odbc
ODBC
C C C
odbtp Cliente Oracle ? Cliente PostgreSQL Cliente PostgreSQL Cliente PostgreSQL Cliente PostgreSQL Cliente ODBC de SAPdb Cliente ODBC de SQL Anywhere ODBC -
Unix y Windows Unix y Windows ? Unix y Windows. Unix y Windows. Unix y Windows. Unix y Windows. ?
sqlanywhere
S/N
sqlite
Unix y Windows.
sqlitepo
Driver portable para SQLLite. Es debido a que el modo S asociativo no funciona como en los otros drivers. Al seleccionar multiples tablas (joining), se incluye el nombre de la tabla en la llave del arreglo asociativo. En el driver "sqlitepo", el nombre de la tabla es eliminado del nombre de la columna. Cuando hay conflictos, el primer campo tiene preferencia.
Unix y Windows.
converted by Web2PDFConvert.com
sybase sybase_ase
C C
S/N S/N
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');
# Carga el codigo comun de ADOdb $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')
Para obtener el numero de renglones en el enunciado SELECT, se puede usar la funcion $recordSet->RecordCount(). Observa que la funcion puede regresar -1 si no se puede determinar la cantidad de renglones.
converted by Web2PDFConvert.com
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 ?>
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 del campo
adecuadamente. En estos casos max_length contendra -1. Posteriormente usamos MetaType() para traducir el tipo nativo a un tipo generico. Actualmente estan definidos los siguientes tipos genericos:
C: Campo caracter que se debe de mostrar en etiquetas <input type="text">. X: TeXtos, campos de texto largo (indefinido) que se deben de mostrar en <textarea> B: Blobs, u Objectos Binarios Largos (BYTE). Normalmente son imagenes. D: Campo fecha T: Campo Timestamp o datetime L: Campo logico (boleano o de bit) I: Campo entero N: Campo numerico. Incluye auto incrementales (seriales), numericos, punto flotante, reales y enteros. R: Campo serial. Incluye serial, enteros auto incrementales integers. Funciona solo para algunas bases de datos.
Si el metatype es de tipo date o timestamp, entonces se imprime usando la funcion definida por el usuario UserDate(), la cual convierte la cadena de texto en formato PHP SQL al formato definido por el usuario. otro uso para la funcion MetaType() es para validar los datos antes de ejecutar un enunciado SQL de INSERT o UPDATE.
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)";
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
converted by Web2PDFConvert.com
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)";
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');
El resto de esta section esta desactualizada: A partir de la version 1.31 de ADOdb 1.31 hay dos metodos nuevos para recordset: GetUpdateSQL( ) y GetInsertSQL( ). Esto nos permite ejecutar un "SELECT * FROM table query WHERE...", copiar los valores de $rs->fields, modificar los campos y generar el
converted by Web2PDFConvert.com
SQL correcto para hacer un update o insert en la tabla. Mostraremos como pueden ser empleadas las funciones en una tabla con los siguiente campos: (ID, FirstName, LastName, Created). Antes de que estos metodos puedan ser invocados, necesitas inicializar el recordset ejecutando un select en la tabla. En base a una idea de Jonathan Y ounger jyounger#unilab.com. a partir de la version de 2.42 de ADOdb, puedes mandar como parametro el nombre de la tabla en lugar del recordset y se generara un enunciado insert para la tabla.
<?php #===================================================== # codigo de Ejemplo de GetUpdateSQL()y GetInsertSQL() #===================================================== include('adodb/adodb.inc.php'); 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);
converted by Web2PDFConvert.com
Gracias a Niko (nuko#mbnet.fi) por el codigo de $ADODB_FORCE_TYPE. Nota: la constante ADODB_FORCE_NULLS es obsoleta desde la version 4.52 y es ignorada. Asigna $ADODB_FORCE_TYPE = ADODB_FORCE_NULL para un comportamiento similar. Desde la version 4.62, el nombre de la tabla a ser usada puede ser modificado al poner $rs->tableName antes de invocar AutoExecute(), GetInsertSQL() o GetUpdateSQL().
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.
include_once('adodb/toexport.inc.php');
include_once('adodb/adodb.inc.php'); $db = &NewADOConnection('mysql'); $db->Connect($server, $userid, $password, $database); $rs = $db->Execute('select fname as "Nombre", surname as "Apellido" from table'); print "<pre>"; print rs2csv($rs); # obtenemos un texto en formao CSV print '<hr>'; $rs->MoveFirst(); # Nota, en algunas bases de datos no funciona el MoveFirst
converted by Web2PDFConvert.com
print rs2tab($rs,false); # obtenemos el texto delimitado por tabuladores # false == omite el nombre de los campos en el primer renglon print '<hr>'; $rs->MoveFirst(); rs2tabout($rs); # manda a la salida estandar (stdout) (tambien existe la funcion rs2csvout) print "</pre>"; $rs->MoveFirst(); $fp = fopen($path, "w"); if ($fp) { rs2csvfile($rs, $fp); # Escribe a un archivo (tambien existe la funcion rs2tabfile) fclose($fp); } ?>
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 el rollback se efectua HASTA el CompleteTrans(), y no con el FailTrans().
$conn->StartTrans(); $conn->Execute($sql); if (!CheckRecords()) $conn->FailTrans(); $conn->Execute($Sql2); $conn->CompleteTrans();
converted by Web2PDFConvert.com
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
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);
converted by Web2PDFConvert.com
?>
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 {
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
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_Result
numRows - regresa -1 si no esta soportado numCols fetchInto - no maneja indicar el fetchmode fetchRows - no maneja indicar el fetchmode free
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). 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');
Observe que magic_quotes_runtime debe de estar desactivado. Mas informacion, y no cambie $ADODB_FETCH_MODE (o SetFetchMode) ya que el recordset en memoria usara el valor de $ADODB_FETCH_MODE que tenia cuando el SQL fue ejecutada.
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 --> proveedor1 proveedor2 categoria1 proveedor2 proveedor2 categoria2 El seiguiente codigo generara el SQL para la tabla pivote:
converted by Web2PDFConvert.com
# Consultar la tabla principal de "productos" # Poner los renglones al campo CompanyName # y las columnas al valor de Categories # definir las ligas para unir las tablas de busqueda # "categories" y "suppliers" # 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, # 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.
converted by Web2PDFConvert.com
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')
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.
converted by Web2PDFConvert.com
$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.
fmtTimeStamp: El formato usado por la funcion DBTimeStamp para enviar campos timestamp/datetime a la base de datos. true: El valor usado para representar 'verdadero' .Ej. '.T.' para Foxpro, '1' para Microsoft SQL. false: El valor usado para representar 'falso'. Ej. '.F.' para Foxpro, '0' para Microsoft SQL. replaceQuote: La cadena usada para protejer las comillas. Ej. dos comillas sencillas ('') para Microsoft SQL, y diagonal invertidacomilla (\") para MySQL. Usado por la funcion qstr.
autoCommit: Indica si esta habilitado el 'commit' automatico. Por omision el valor es true. charSet: Indica el conjunto de caracteres por omision. Actualmente solo lo maneja interbase. dialect: Indica el dialecto por omision a usar. Actualmente solo lo maneja interbase. role: Asigna el rol. Actualmente solo interbase/firebird lo manejan. metaTablesSQL: Enunciado SQL para obtener la lista de las tablas disponibles. Ej. SHOW TABLES para MySQL. genID: El ultimo identificador generado por la funcion GenID(), si lo maneja la base de datos. cacheSecs: El numero de segundos para guardar en cache los recordsets si se omite el parametro #secs2cache en la funciones
CacheExecute() o CacheSelectLimit(). El valor por omision es 60 minutos.
sysDate: Cadena que contiene el nombre de la funcion de la base de datos que genera la fecha fecha actual. Util en los INSERT y
UPDATE.
sysTimeStamp: Cadena que contiene el nombre de la funcion de la base de datos que genera el valor actual en formato current
timestamp/datetime.
leftOuter: Cadena que contiene el operador para hacer 'left outer join'. Si no se conoce con valor false. rightOuter: Cadena que contiene el operador para hacer 'right outer join'. Si no se conoce con valor false. ansiOuter: Valor boleano que es verdadero si se permite hacer 'outer joins' con la sintaxis ANSI. Ej. select * from table1 left join table2 on p1=p2.
converted by Web2PDFConvert.com
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.
Connect($host,[$user],[$password],[$database])
Conexion no persistente al DSN o servidor $host, usando el usuario $user y la contrasea $password. Si el servidor maneja varias bases de datos, se conecta a la base de datos $database. Regresa true/false dependiendo de la conexion. Nota para ADO: Si usas Microsoft ADO y no OLEDB, el parametro $database puede tener el 'OLEDB data provider' utilizado. PostgreSQL: Otra manera de conectarse a la base de datos es mandando en el primer parametro $host la cadena de conexion estandard de PostgreSQL, y de esa forma se ignoran los demas parametros. Para Oracle y Oci8, hay dos maneras de conectarse. La primera usando el nombre TNS deinido en el archivo local tnsnames.ora (o ONAMES o HOSTNAMES). Colocar el nombre en el parametro $database, y poner el parametro $host a false. Como alternativa poner el servidor en $host, y el SID en $database , esto se brinca el archivo tnsnames.ora. Ejemplos:
# $oraname en tnsnames.ora/ONAMES/HOSTNAMES $conn->Connect(false, 'scott', 'tiger', $oraname); $conn->Connect('server:1521', 'scott', 'tiger', 'ServiceName'); # bypass tnsnames.ora
PConnect($host,[$user],[$password],[$database])
Para conexiones persistententes al DSN o servidor $host, usando el usuario $user y contrasea $password. Si el servidor maneja multiples bases de datos, se conecta a la base de datos $database. Ahora se realiza un rollback en las conexiones persistentes para algunas bases de datos desde la version 2.21, como se recomienda en el manual de PHP. Ver la bitacora de cambios o el codigo fuente para ver cuales bases de datos se afectaron. Regresa true/false dependiendo de la conexion. Para mas informacion vea Connect( ). Desde ADOdb 2.21, se incluye el rollback automatico, ejemplo de uso:
$conn = &NewADOConnection('mysql'); $conn->autoRollback = true; # el valor por omision es false $conn->PConnect(...); # aqui hace el rollback
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)
converted by Web2PDFConvert.com
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.
<?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.
converted by Web2PDFConvert.com
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 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));
$ADODB_CACHE_DIR. Desde la version 1.80, $secs2cache es opcional y se puede definir el tiempo de cache en $connection->cacheSecs.
$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 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);
SetFetchMode($mode)
Asigna el modo para obtener los resultados para la conexion y lo almacena en $db->fetchMode. Los modos permitidos son ADODB_FETCH_ASSOC y ADODB_FETCH_NUM. Para mas informacion vea $ADODB_FETCH_MODE.
converted by Web2PDFConvert.com
Regresa el metodo anterior, o falso si SetFetchMode( ) no habia sido llamado con anterioridad.
CreateSequence($seqName = 'adodbseq',$startID=1)
Crea una secuencia. La siguiente vez que se invoque GenID( ), el valor que regrese sera $startID. Se agrego en la version 2.60.
DropSequenceD($seqName = 'adodbseq')
Borra una secuencia. Se agrego en la version 2.60.
GenID($seqName = 'adodbseq',$startID=1)
Genera un numero en secuencia. Funciona para interbase, mysql, postgresql, oci8, oci8po, mssql, y los drivers basados en ODBC. Utiliza $seqName como el nombre de la secuencia. GenID() creara automaticamente la secuencia si no existe (con la condicion de que el usuario tenga permiso de crearla). Si no habra que crear la secuencia primero. Si el driver de su base de datos emula a las secuencias, el nombre de la tabla es el nombre de la secuencia. La tabla tiene una columna, 'id' la cual deberia de ser de tipo entero, o si se necesita algo mayor, numeric(16). 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 $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
converted by Web2PDFConvert.com
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. En ADOdb 4.54 y posterior el valor del blob es el parametro de salida.EN versiones anteriores el valor del blob se mandaba a stdout.
$rs = $db->Execute("select bloboid from postgres_table where id=$key"); $blob = $db->BlobDecode( reset($rs->fields) );
La clausula $where es obligatoria si $mode == 'UPDATE'. Si $forceUpdate=false entonces primero se consulta la base de datos y verificamos si el valor del campo obtenido por la consulta coincide con el valor del arreglo; solo si son diferentes se actualiza el campo. Regresa true si es correcto, false si hay error. Un ejemplo de esto es:
$record["firstName"] = "Carol"; $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().
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().
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.
converted by Web2PDFConvert.com
$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
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
converted by Web2PDFConvert.com
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();
Valores permitidos son: READ UNCOMMITTED (permite 'dirty reads', pero es mas rapido) READ COMMITTED (valor por omision para postgres, mssql y oci8) REPEATABLE READ (omision para mysql) SERIALIZABLE (mas lento y mas restrictivo) 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.
converted by Web2PDFConvert.com
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.
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));
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 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.
converted by Web2PDFConvert.com
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( ).
Tome en cuenta que la unica diferencia entre la implementacion de oci8 y mssql es $sql.
converted by Web2PDFConvert.com
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').
converted by Web2PDFConvert.com
$stmt = $DB->Prepare("insert into table (col0, col1, col2) values (:nombre0, :nombre1, :nombre2)"); $DB->Bind($stmt, $p1, "nombre0"); $DB->Bind($stmt, $p2, "nombre1"); $DB->Bind($stmt, $p3, "nombre2"); for ($i = 0; $i < $max; $i++) { $p1 = ?; $p2 = ?; $p3 = ?; $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');
converted by Web2PDFConvert.com
Estas dos propiedades nos permiten definir funciones de 'cuello de botella' para todos los enunciados SQL procesados por ADOdb. Nos permite realizar estadisticas y reescritura de los enunciados SQL.
Ejemplos de fnExecute
A continuacion un ejemplo del uso de fnExecute para contar todos los queries con cache y sin cache:
# $conn es el objeto de conexion function CountExecs($conn, $sql, $inputarray) { global $EXECS; if (!is_array(inputarray)) $EXECS++; # Maneja arreglos bidimensionales else if (is_array(reset($inputarray))) $EXECS += sizeof($inputarray); 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().
Concat($s1,$s2,....)
Genera la cadena de caracteres para concatenar $s1, $s2, etc. Emplea el texto en la propiedad concat_operator para generar la concatenacion. Omita la funcion si no se usa un caracter de concatenacion, como en MySQL. Regresa la cadena concatenada.
DBDate($date)
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.
converted by Web2PDFConvert.com
$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();
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.
converted by Web2PDFConvert.com
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.
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
converted by Web2PDFConvert.com
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.
Ejemplo de Menu 2: Con los mismo datos, GetMenu('menu1',array('A','B'),false) generara un menu con A y B seleccionados: A B C
converted by Web2PDFConvert.com
UserDate($str, [$fmt])
Convierte la cadena de caracteres con una fecha $str a otro formato fecha. El formato de fecha es Y -m-d o un timestamp de Unix. El valor por omision de $fmt es Y -m-d.
UserTimeStamp($str, [$fmt])
Convierte la cadena de caracteres con un timestamp $str a otro formato. El formato de timestamp es Y -m-d H:i:s, como en '200202-28 23:00:12', o un timestamp de Unix. UserTimeStamp llama a UnixTimeStamp para analizar $str. El valor por omision de $fmt es to Y -m-d H:i:s.
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" (197012-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: 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.
converted by Web2PDFConvert.com
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.
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.
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>"; } }
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.
converted by Web2PDFConvert.com
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( )
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.
2. Las propiedades de ADO se implementan como funciones en ADOdb. Esto hace mas sencillo de implementar cualquier funcionalidad mejorada de ADO en el futuro. 3. La funcion ADORecordSet->Move() de ADOdb emplea posicionamiento absoluto, no relativo. Los bookmarks no estan soportados. 4. ADORecordSet->AbsolutePosition() no puede ser usada para mover el cursor del registro. 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.
ErrorMsg: Almacena el mensaje de error en la variable privada _errorMsg. Campos de ADOConnection a inicializar
_bindInputArray: Con valor true si se permite la liga (binding) de parametros para enunciados SQL de insert y update usando ?.
fmtDate fmtTimeStamp true false concat_operator replaceQuote hasLimit maneja SELECT * FROM TABLE LIMIT 10 de MySQL. hasTop maneja el estilo de Microsoft SELECT TOP 10 * FROM TABLE. Funciones de ADORecordSet a sobreescribir
Se necesita crear un constructor de tu clase derivada de ADORecordSet que invoque al constructor de la clase padre.
converted by Web2PDFConvert.com
_initrs: inicializacion de bajo nivel del recordset: inicializa los campos _numOfRows y _numOfFields -- invocada por el constructor. _seek: busca un registro en particular. No carga los datos en el arreglo de campos. Eso lo hace _fetch. Regresa true o false. Observe que algunas implementaciones como Interbase no manejan seek. Poner canSeek a false. _fetch: Obtiene un renglon usando la funcion de la extension de la base de datos y avanza al siguiente renglon. Carga el arreglo fields. Si el parametro $ignore_fields es true entonces 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.
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);
converted by Web2PDFConvert.com
Fix for GetAssoc() PHP5 compat. See http://phplens.com/lens/lensforum/msgs.php?id=15425 Active Record - If inserting a record and the value of a primary key field is null, then we do not insert that field in as we assume it is an auto-increment field. Needed by mssql. Changed postgres7 MetaForeignKeys() see http://phplens.com/lens/lensforum/msgs.php?id=15531 DB2 will now return db2_conn_errormsg() when it is a connection error.
converted by Web2PDFConvert.com
The _adodb_countrecs() function in adodb-lib.inc.php has been revised to handle more ORDER BY variations.
converted by Web2PDFConvert.com
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.
converted by Web2PDFConvert.com
GenID() had a bug in the raiseErrorFn handling. Fixed. Thx Marcos Pont. Datadict name quoting now handles ( ) in index fields correctly - they aren't part of the index field. Performance monitoring: (1) oci8 Ixora checks moved down; (2) expensive sql changed so that only those sql with count(*)>1 are shown; (3) changed sql1 field to a length+crc32 checksum - this breaks backward compat. We remap firebird15 to firebird in data dictionary.
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.
converted by Web2PDFConvert.com
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. 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.
converted by Web2PDFConvert.com
Perf code, added a string typecast to substr in adodb_log_sql(). Postgres: Changed BlobDecode() to use po_loread, added new $maxblobsize parameter, and now it returns the blob instead of sending it to stdout - make sure to mention that as a compat warning. Also added $db->IsOID($oid) function; uses a heuristic, not guaranteed to work 100%. Contributed arabic language file by "El-Shamaa, Khaled" k.el-shamaa#cgiar.org PHP5 exceptions did not handle @ protocol properly. Fixed. Added ifnull handling for postgresql (using coalesce). Added metatables() support for Postgresql 8.0 (no longer uses pg_% dictionary tables). Improved Sybase ErrorMsg() function. By Gaetano Giunta. Improved oci8 SelectLimit() to use Prepare(). By Cristiano Duarte. Type-cast $row parameter in ifx_fetch_row() to int. Thx stefan bodgan. Ralf becker contributed improvements in postgresql, sapdb, mysql data dictionary handling: - MySql and Postgres MetaType was reporting every int column which was part of a primary key and unique as serial - Postgres was not reporting the scale of decimal types - MaxDB was padding the defaults of none-string types with spaces - MySql now correctly converts enum columns to varchar Ralf also changed Postgresql datadict: - you cant add NOT NULL columns in postgres in one go, they need to be added as NULL and then altered to NOT NULL - AlterColumnSQL could not change a varchar column with numbers into an integer column, postgres need an explicit conversation - a re-created sequence was not set to the correct value, if the name was the old name (no implicit sequence), now always the new name of the implicit sequence is used Sergio Strampelli added extra $intoken check to Lens_ParseArgs() in datadict code.
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.
converted by Web2PDFConvert.com
MetaTables() for mysql, $showschema parameter was not backward compatible with older versions of adodb. Fixed. Changed mysql GetOne() to work with mysql 3.23 when using with non-select stmts (e.g. SHOW TABLES). Changed TRIG_ prefix to a variable in datadict-oci8.inc.php. Thx to Luca.Gioppo#csi.it. New to adodb-time code. We allow you to define your own daylights savings function, adodb_daylight_sv for pre-1970 dates. If the function is defined (somewhere in an include), then you can correct for daylights savings. See http://phplens.com/phpeverywhere/node/view/16#daylightsavings for more info. New sqlitepo driver. This is because assoc mode does not work like other drivers in sqlite. Namely, when selecting (joining) multiple tables, in assoc mode the table names are included in the assoc keys in the "sqlite" driver. In "sqlitepo" driver, the table names are stripped from the returned column names. When this results in a conflict, the first field get preference. Contributed by Herman Kuiper herman#ozuzo.net Added $forcenull parameter to GetInsertSQL/GetUpdateSQL. Idea by Marco Aurelio Silva. More XHTML changes for GetMenu. By Jeremy Evans. Fixes some ibase date issues. Thx to stefan bogdan. Improvements to mysqli driver to support $ADODB_COUNTRECS. Fixed adodb-csvlib.inc.php problem when reading stream from socket. We need to poll stream continiously.
to
$this->_transactionID = ibase_trans($this->ibasetrans, $this->_connectionID);
Fixed typo in mysqi_field_seek(). Thx to Sh4dow (sh4dow#php.pl). LogSQL did not work with Firebird/Interbase. Fixed. Postgres: made errorno() handling more consistent. Thx to Michael Jahn, Michael.Jahn#mailbox.tu-dresden.de. Added informix patch to better support metatables, metacolumns by "Cecilio Albero" c-albero#eos-i.com Cyril Malevanov contributed patch to oci8 to support passing of LOB parameters:
$text = 'test test test'; $sql = "declare rs clob; begin :rs := lobinout(:sa0); end;"; $stmt = $conn -> PrepareSP($sql); $conn -> InParameter($stmt,$text,'sa0', -1, OCI_B_CLOB); $rs = ''; $conn -> OutParameter($stmt,$rs,'rs', -1, OCI_B_CLOB); $conn -> Execute($stmt); echo "return = ".$rs."<br>";
use OCINewDescriptor before binding if Param is IN, uses save() before each execute. This is done automatically for you. if Param is OUT, uses load() after each execute. This is done automatically for you. when we bind $var as LOB, we create new descriptor and return it as a Bind Result, so if we want to use OUT parameters, we have to store somewhere &$var to load() data from LOB to it. - IN OUT params are not working now (should not be a big problem to fix it) - now mass binding not working too (I've wrote about it before)
Simplified Connect() and PConnect() error handling. When extension not loaded, Connect() and PConnect() will return null. On connect error, the fns will return false. CacheGetArray() added to code. Added Init() to adorecordset_empty(). Changed postgres64 driver, MetaColumns() to not strip off quotes in default value if :: detected (type-casting of default). Added test: if (!defined('ADODB_DIR')) die(). Useful to prevent hackers from detecting file paths. Changed metaTablesSQL to ignore Postgres 7.4 information schemas (sql_*). New polish language file by Grzegorz Pacan Added support for UNION in _adodb_getcount(). Added security check for ADODB_DIR to limit path disclosure issues. Requested by postnuke team. Added better error message support to oracle driver. Thx to Gaetano Giunta. Added showSchema support to mysql. Bind in oci8 did not handle $name=false properly. Fixed. If extension not loaded, Connect(), PConnect(), NConnect() will return null.
converted by Web2PDFConvert.com
Updated PHP5 RC1 iterator support. API changed, hasMore() renamed to valid(). Changed internal format of serialized cache recordsets. As we store a version number, this should be backward compatible. Error handling when driver file not found was flawed in ADOLoadCode(). Fixed.
converted by Web2PDFConvert.com
BOOL type not recognised correctly as L. Fixed. Fixed paths in ADODB_DIR for session files, and back-ported it to 4.05 (15 Dec 2003) Added Schema to postgresql MetaTables. Thx to col#gear.hu Empty postgresql recordsets that had blob fields did not set EOF properly. Fixed. CacheSelectLimit internal parameters to SelectLimit were wrong. Thx to Nio. Modified adodb_pr() and adodb_backtrace() to support command-line usage (eg. no html). Fixed some fr and it lang errors. Thx to Gaetano G. Added contrib directory, with adodb rs to xmlrpc convertor by Gaetano G. Fixed array recordset bugs when _skiprow1 is true. Thx to Gaetano G. Fixed pivot table code when count is false.
converted by Web2PDFConvert.com
Some errors in adodb_error_pg() fixed. Thx to Styve. Spurious Insert_ID() error was generated by LogSQL(). Fixed. Insert_ID was interfering with Affected_Rows() and Replace() when LogSQL() enabled. Fixed. More foreach loops optimized with list/each. Null dates not handled properly in ADO driver (it becomes 31 Dec 1969!). Heinz Hombergs contributed patches for mysql MetaColumns - adding scale, made interbase MetaColumns work with firebird/interbase, and added lang/adodb-de.inc.php. Added INFORMIXSERVER environment variable. Added $ADODB_ANSI_PADDING_OFF for interbase/firebird. PHP 5 beta 2 compat check. Foreach (Iterator) support. Exceptions support.
arrays. Added MONEY to MetaType in PostgreSQL. Added more debugging output to CacheFlush().
We now SET CONCAT_NULL_YIELDS_NULL OFF for odbc_mssql driver to be compat with mssql driver. The property $emptyDate missing from connection class. Also changed 1903 to constant (TIMESTAMP_FIRST_YEAR=100). Thx to Sebastiaan van Stijn. ADOdb speedup optimization - we now return all arrays by reference. Now DBDate() and DBTimeStamp() now accepts the string 'null' as a parameter. Suggested by vincent. Added GetArray() to connection class. Added not_null check in informix metacolumns(). Connection parameters for postgresql did not work correctly when port was defined. DB2 is now a tested driver, making adodb 100% compatible. Extensive changes to odbc driver for DB2, including implementing serverinfo() and SQLDate(), switching to SQL_CUR_USE_ODBC as the cursor mode, and lastAffectedRows and SelectLimit() fixes. The odbc driver's FetchField() field names did not obey ADODB_ASSOC_CASE. Fixed. Some bugs in adodb_backtrace() fixed. Added "INT IDENTITY" type to adorecordset::MetaType() to support odbc_mssql properly. MetaColumns() for oci8, mssql, odbc revised to support scale. Also minor revisions to odbc MetaColumns() for vfp and db2 compat. Added unsigned support to mysql datadict class. Thx to iamsure. Infinite loop in mssql MoveNext() fixed when ADODB_FETCH_ASSOC used. Thx to Josh R, Night_Wulfe#hotmail.com. ChangeTableSQL contributed by Florian Buzin. The odbc_mssql driver now sets CONCAT_NULL_YIELDS_NULL OFF for compat with mssql driver.
converted by Web2PDFConvert.com