Inicialização de código e conexão a bancos de dados Ao executar ADOdb, pelo menos dois arquivos são carregados. Primeiro é: adodb/adodb.inc.php, que contém todas as funções utilizadas por todas as classes de banco de dados. O código específico para uma determinada base de dados está no adodb/driver/adodb??. Inc.php arquivo. Por exemplo, para se conectar a um banco de dados mysql: include('/path/to/set/here/adodb.inc.php'); $conn = &ADONewConnection('mysql'); Sempre que você precisar se conectar a um banco de dados, você pode criar um objeto de conexão usando o ADONewConnection ($dirver) função. NewADOConnection ($driver) é um nome alternativo para a mesma função. Neste ponto, você não está conectado ao banco de dados (não é verdade, se você passar em um dsn). Você primeiro precisa decidir se quer usar conexões persistentes ou não-persistentes. A vantagem de conexões persistentes é que eles são mais rápidos, como a conexão de banco de dados nunca é fechada (mesmo quando você chamar) Close (). Conexões não persistentes ocupam muito menos recursos, porém, reduzindo o risco de o seu banco de dados e seu servidor web tornando-se sobrecarregado. Para conexões persistentes, utilize $conn-> pconnect (), ou US $conn-> Connect () para conexões não-persistentes. Alguns drivers de banco de dados também suportam NConnect (), o que obriga a criação de uma nova conexão. Conexão Gotcha: Se você criar duas conexões, mas ambos usam o mesmo ID de usuário e senha, o PHP irá compartilhar a mesma conexão. Isto pode causar problemas se as conexões são destinadas a diferentes bases de dados. A solução é usar sempre ID de usuário diferente é para bancos de dados diferentes, ou uso NConnect (). Data Source Name (DSN) Suporte Desde ADOdb 4,51, você pode se conectar a um banco de dados por meio de um dsn para NewADOConnection (ou ADONewConnection, que é a mesma função). O formato dsn é: $driver://$username:$password@hostname/$database?options[=value] NewADOConnection() chama Connect() ou pconnect() internamente para você. Se a conexão falhar, retorna falso. # non-persistent connection $dsn = 'mysql://root:pwd@localhost/mydb'; $db = NewADOConnection($dsn); if (!$db) die("Connection failed"); # no need to call connect/pconnect! $arr = $db->GetArray("select * from table"); # persistent connection $dsn2 = 'mysql://root:pwd@localhost/mydb?persist'; # non-persistent connection on port 3000 $dsn2 = 'mysqli://root:pwd@localhost/mydb?persist=0&port=3000'; Se você tem caracteres especiais como /:? na sua dsn, então você precisa rawurlencode-los primeiro: $pwd = rawurlencode($pwd); $dsn = "mysql://root:$pwd@localhost/mydb"; $dsn2 = rawurlencode("sybase_ase")."://user:pass@host/path?query"; Opções legais são: For all drivers 'persist', 'persistent', 'debug', 'fetchmode', 'cachesecs', 'memcache' Interbase/Firebird 'dialect', 'charset', 'buffers', 'role' M'soft ADO 'charpage' MySQL 'clientflags' MySQLi 'port', 'socket', 'clientflags' Oci8 'nls_date_format', 'charset' Para todos os drivers, quando as opções de persistir ou persistentes são definidos, uma conexão persistente é forçada. A debug option permite a depuração. O fetchmode calls setFetchMode(). Se nenhum valor é definido por uma opção, então o valor é definido como 1. Desde ADOdb 5,09, nós adicionamos dois novos parâmetros: cachesecs que globalmente determina quantos segundos para registros de cache (o padrão é 3600 segundos, se não definido) quando CacheExecute () e CacheSelectLimit () são chamados e nenhum parâmetro em tempo de cache é passado para essas funções. memcache que define o memcache máquina, porta e se pretende utilizar a compressão. Por exemplo: # we have a memcache server at 10.1.1.22 using default port 11211, no compression $dsn = 'mysql://user:pwd@localhost/mydb?memcache=10.1.1.22'; # we have a memcache server 10.1.1.22 port 8888, compression=on $dsn = 'mysql://user:pwd@localhost/mydb?memcache=10.1.1.22:8888:1'; # we have a memcache servers mem1,mem2 on port 8888, compression=off $dsn = 'mysql://user:pwd@localhost/mydb?memcache=mem1,mem2:8888:0'; # we have a memcache servers mem1,mem2 on port 8888, compression=off and cachesecs=120 $dsn = 'mysql://user:pwd@localhost/mydb?memcache=mem1,mem2:8888:0&ca chesecs=120'; ADOdb DSN são compatíveis com a versão 1.0 do formato PEAR DB DSN. Exemplos de conexão com bancos A maioria dos driver´s MySQL e outros bancos de dados Conexões MySQL são muito simples, e os parâmetros são idênticos aos mysql_connect: $conn = &ADONewConnection('mysql'); $conn->PConnect('localhost','userid','password','database'); # or dsn $dsn = 'mysql://user:pwd@localhost/mydb'; $conn = ADONewConnection($dsn); # no need for Connect() # or persistent dsn $dsn = 'mysql://user:pwd@localhost/mydb?persist'; $conn = ADONewConnection($dsn); # no need for PConnect() # a more complex example: $pwd = urlencode($pwd); $flags = MYSQL_CLIENT_COMPRESS; $dsn = "mysql://user:$pwd@localhost/mydb?persist&clientflags=$flags"; $conn = ADONewConnection($dsn); # no need for PConnect() Para a maioria dos drivers, você pode usar a função padrão: Connecte($servidor, $user, $senha, $bancoDeDados), ou um DSN desde ADOdb 4,51. Exceções a essa estão listados abaixo. PDO PDO, que só funciona com PHP5, aceita um driver de string de conexão específica: $conn =& NewADOConnection('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"); O mecanismo DSN também é suportado: $conn =& NewADOConnection("pdo_mysql://user:pwd@localhost/mydb?persist"); # persist is optional EXEMPLOS DE USO Select Statement Tarefa: Conecte-se ao Northwind Acesso DSN, exibir as primeiras duas colunas de cada linha Neste exemplo, criamos um objeto ADOConnection, que representa a conexão para a base de dados. A ligação é iniciada com pconnect, que é uma conexão persistente. Sempre que deseja consultar o banco de dados, nós chamamos o ADOConnection.Execute() function. Isso retorna um objeto ADORecordSet que na verdade é um cursor que detém a linha atual no array fields[]. Usamos MoveNext() para passar de uma linha para outra. NB: A função útil que não é utilizado neste exemplo é o SelectLimite, o que permite limitar o número de linhas exibidas. <?php include('adodb.inc.php'); # carrega a classe ADOdb $conn = &ADONewConnection('access'); # cria a conexão $conn->PConnect('northwind'); # conecta com MS-Access, northwind DSN $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(); # optional $conn->Close(); # optional ?> OUTRO EXEMPLOR CONECTANDO MySQL <?php include '../Classes/adodb5/adodb.inc.php'; $db = NewADOConnection('mysql'); $db->Connect("localhost", "root", "", "conevisual"); $result = $db->Execute("SELECT codigo, empresa FROM agencia"); if ($result === false) die("falhou!"); //NÃO CONSEGUIU CONECETAR while (!$result->EOF) { print $result->fields['codigo'].' - '. $result>fields['empresa'].'<br/>'; $result->MoveNext(); } ?> O $recordSet retornou conjunto de registros na linha atual na matriz $recordset-> fields[array], indexados pelo número da coluna (a partir de zero). Nós usamos o MoveNext () para passar para a próxima linha. A propriedade EOF é definida como true quando o fim-de-arquivo é alcançado. Se ocorre um erro em Execute(), nós retornar falso em vez de um conjunto de registros. O $recordset-> fields[] array é gerado pela extensão de banco de dados PHP. Algumas extensões de banco de dados somente criam índix por número e não index por matriz pelo nome do campo. Para forçar a indexação pelo nome - que é arrays associativos - utilizar a função setFetchMode. Cada conjunto de registros salva e usa o modo de busca que foi definido quando o conjunto de registros foi criado em Execute() ou 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); # shows array([0]=>'v0',[1] =>'v1') print_r($rs2->fields); # shows array(['col1']=>'v0',['col2'] =>'v1') Para obter o número de linhas na declaração de seleção, você pode usar $recordset-> RecordCount(). Note-se que ele pode retornar -1 se o número de linhas retornadas não pode ser determinada. Select Avançado com fild objects Seleccionar uma tabela, exibir as duas primeiras colunas. Se a segunda coluna é uma formato timestamp, reformatar a data para o formato dos EUA. <?php include('adodb.inc.php'); # load code common to ADOdb $conn = &ADONewConnection('access'); # create a connection $conn->PConnect('northwind'); # connect to MS-Access, northwind dsn $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(); # optional $conn->Close(); # optional ?> Neste exemplo, vamos verificar o tipo de campo da segunda coluna usando FetchField (). Isto retorna um objecto com pelo menos três campos. Name: Nome da coluna Type: tipo de campo nativo de coluna max_length: comprimento máximo do campo. Alguns bancos de dados como MySQL não retornar o comprimento máximo do campo corretamente. Nestes casos max_length será definido para -1. Em seguida, usamos MetaType() para traduzir o tipo nativo para um tipo genérico. Atualmente, os seguintes tipos genéricos são definidos: C: campos de caracteres que devem ser mostrados em uma tag <input type="text">. X: texto, campos de texto grande que deve ser mostrado em uma <textarea> B: Blobs, ou binários larg objects. Normalmente imagens. D: campo Data T: campo Timestamp L: Lógico campo (boolean ou bit-campo) I: campo Integer N: campo numérico. Inclui autoincrement, ponto numérico, flutuante, real e inteiro. R: campo de série. Inclui de série inteiros, de incremento automático. Isso funciona para bancos de dados selecionados. Se o metatype é do tipo data ou time stamp, então nós imprimimos usando o formato de data definido pelo usuário com UserDate (), que converte o formato PHP SQL seqüência de data para um usuário definido. Outro uso para MetaType() é a validação de dados antes de fazer uma inserção SQL ou atualização. Inserting Insira uma linha à tabela de pedidos com datas e strings que precisam ser citado antes de poderem ser aceitos pelo banco de dados, por exemplo: o apóstrofo na palavra de John. <?php include('adodb.inc.php'); # load code common to ADOdb $conn = &ADONewConnection('access'); # create a connection $conn->PConnect('northwind'); # connect to MS-Access, northwind dsn $shipto = $conn->qstr("John's Old Shoppe"); $sql = "insert into orders (customerID,EmployeeID,OrderDate,ShipName) "; $sql .= "values ('ANATR',2,".$conn->DBDate(time()).",$shipto)"; if ($conn->Execute($sql) === false) { print 'error inserting: '.$conn->ErrorMsg().'<BR>'; } ?> Neste exemplo, vemos a data avançada e facilidades de manuseio de citar ADOdb. O unix timestamp (que é um número inteiro longo) está devidamente formatada para acesso com DBDate (), e o caractere direito de escape é usado para citar John’s Old Shoppe, e não o PHP´s default Jon´s Old Shoppe com qstr(). Observe o tratamento de erro da instrução EXECUTE. False é retornado por Execute () se um erro ocorreu. A mensagem de erro para o último erro que ocorreu é exibido em ErrorMsg (). Nota: php_track_errors pode ter que ser habilitado para mensagens de erro para ser salvo. Observe the error-handling of the Execute statement. False is returned by Execute() if an error occured. The error message for the last error that occurred is displayed in ErrorMsg(). Note: php_track_errors might have to be enabled for error messages to be saved. Debugging <?php include('adodb.inc.php'); # load code common to ADOdb $conn = &ADONewConnection('access'); # create a connection $conn->PConnect('northwind'); # connect to MS-Access, northwind dsn $shipto = $conn->qstr("John's Old Shoppe"); $sql = "insert into orders (customerID,EmployeeID,OrderDate,ShipName) "; $sql .= "values ('ANATR',2,".$conn->FormatDate(time()).",$shipto)"; $conn->debug = true; if ($conn->Execute($sql) === false) print 'error inserting'; ?> No exemplo acima, temos setado a depuração definindo debug = true. Isto irá exibir a instrução SQL antes da execução, e também mostrara a mensagens de erro. Não há necessidade de chamar ErrorMsg() neste caso. Para exibir o conjunto de registros, consulte o rs2html () exemplo. MySQL and Menus Conectar a banco de dados MySQL e gerar um menu <select> de uma instrução SQL, onde as legendas <option> estão na coluna 1, eo valor para enviar de volta para o servidor está na coluna 2. <?php include('adodb.inc.php'); # load code common to ADOdb $conn = &ADONewConnection('mysql'); # create a connection $conn->PConnect('localhost','userid','','agora'); # connect to MySQL, agora db $sql = 'select CustomerName, CustomerID from customers'; $rs = $conn->Execute($sql); print $rs->GetMenu('GetCust','Mary Rosli'); ?> Aqui definimos um menu chamado GetCust, com a opção de menu "Maria Rosli" selecionada. Ver GetMenu (). Temos também funções que retornam o conjunto de registros como uma matriz: GetArray (), e como uma matriz associativa com a chave sendo a primeira coluna: GetAssoc (). Gerando Update e Insert SQL Nota: Como ADOdb 4,56, apoiamos Autoexecute (), que simplifica as coisas, fornecendo um invólucro avançada para GetInsertSQL () e GetUpdateSQL (). Por exemplo, uma inclusão pode ser feita com: $record["firstname"] = "Bob"; $record["lastname"] = "Smith"; $record["created"] = time(); $insertSQL = $conn->AutoExecute($rs, $record, 'INSERT'); E um UPDATE com: $record["firstname"] = "Caroline"; $record["lastname"] = "Smith"; # Update Caroline's lastname from Miranda to Smith $insertSQL = $conn->AutoExecute($rs, $record, 'UPDATE', 'id = 1'); O resto desta seção é fora-de-data: Implementação de rolagem como Próximo e Anterior O código a seguir cria um simples conjunto de registros pager, onde é possível navegar de página em página de um conjunto de registros. include_once('adodb.inc.php'); include_once('adodb-pager.inc.php'); session_start(); $db = NewADOConnection('mysql'); $db->Connect('localhost','root','','xphplens'); $sql = "select * from adoxyz "; $pager = new ADODB_Pager($db,$sql); $pager->Render($rows_per_page=5); Isto vai criar uma base de registro de pager que se parece com esta: |< << >> >| ID First Name Last Name Date Created 36 Alan Turing Sat 06, Oct 2001 37 Serena Williams Sat 06, Oct 2001 38 Yat Sun Sun Sat 06, Oct 2001 39 Wai Hun See Sat 06, Oct 2001 40 Steven Oey Sat 06, Oct 2001 Page 8/10 O número de linhas a serem exibidas de uma só vez é controlada pela Render ($rows) método. Se você não passar qualquer valor para render (), ADODB_Pager será o padrão para 10 registros por página. Você pode controlar os títulos das colunas, modificando o seu SQL (suportado pela maioria dos bancos de dados): $sql = 'select id as "ID", firstname as "First Name", lastname as "Last Name", created as "Date Created" from adoxyz'; O código acima pode ser encontrado no adodb / testes / exemplo testpaging.php incluído nesta versão, e os ADODB_Pager classe adodb / adodb pager.inc.php. O código ADODB_Pager podem ser adaptados por um programador, de modo que as ligações do texto pode ser substituída por imagens, e o plano de fundo opaca branca ser substituído com cores mais interessantes. Você também pode permitir a exibição de html definindo $pager-> htmlspecialchars = false. Exemplos das funções; Execute($sql,$inputarr=false) Executa instrução SQL $sql e retornar classe derivada de ADORecordSet em caso de sucesso. Note-se que um conjunto de registros é sempre devolvido em caso de sucesso, mesmo se estamos executando uma instrução de inserção ou atualização. Você também pode passar em $sql uma declaração preparada em Prepare(). Retorna classe derivada de ADORecordSet. Por exemplo; se conectar via mysql, então ADORecordSet_mysql seria devolvido. False é retornado se houve um erro na execução do sql. O parâmetro $inputarr pode ser usado para as variáveis de ligação aos parâmetros. Abaixo está um exemplo do Oracle: $conn->Execute("SELECT * FROM TABLE WHERE COND=:val", array('val'=> $val)); Outro exemplo, usando ODBC, que usa o ? convenção: $conn->Execute("SELECT * FROM TABLE WHERE COND=?", array($val)); variáveis de ligação Variáveis velocidades de ligação (Variable binding speeds) a compilação e cache de instruções SQL, resultando em maior desempenho. Atualmente Oracle, Interbase e ODBC suporta Variable binding. Interbase / ODBC usam o estilo ? para ligação emulado em bancos de dados que não suportam a ligação. Note que você não tem que as strings if se você usar binding. EXEPLOS DA NET - http://www.revistaphp.com.br/print.php?id=49 include('adodb/adodb.inc.php'); // Poderiamos tb descompactar em qualquer // lugar e usar um caminho absoluto no include: include('c:\\meu\\caminho\\absoluto\\adodb\\adodb.inc.php'); Exemplos de conexão: MySQL Forma simples <?php include('adodb/adodb.inc.php'); #Selecionado o drive para o seu banco $bd = ADONewConnection('mysql'); #conectando no banco $bd->Connect('localhost','usuario', 'senha', 'banco'); //Para conexao persistente use $bd->Pconnect: //$bd->PConnect('localhost','usuario', 'senha', 'banco'); ?> Suporte ao formato DSN <?php // Incluindo o arquivo que contém a classe adoDB include('adodb/adodb.inc.php'); $dsn = 'mysql://usuario:senha@localhost/mysql'; Para conexão persistente adicione ?persist no final //$dsn = 'mysql://usuario:senha@localhost/mysql?persist'; $bd = NewADOConnection($dsn); ?> PostgreSQL <?php include('adodb/adodb.inc.php'); $dsn = 'postgres://usuario:senha@localhost/banco'; //Para conexão persistente adicione ?persist no final //$dsn = 'postgres://usuario:senha@localhost/banco?persist'; $db ?> = &ADONewConnection($dsn); Microsoft Access <?php include('adodb/adodb.inc.php'); $db =& ADONewConnection('access'); $dsn = "Driver={Microsoft Access Driver (*.mdb)};Dbq=c:\\SeuCaminho\Banco.mdb;Uid=Admin;Pwd=;"; $db->Connect($dsn); ?> Interbase <?php include('adodb/adodb.inc.php'); $bd = &ADONewConnection('ibase'); $bd->PConnect('localhost:c:\Caminho\Banco.gdb','sysdba','masterkey'); ?> Firebird <?php include('adodb/adodb.inc.php'); $dsn = 'firebird://usuario:senha@localhost/banco'; $bd = ADONewConnection($dsn); ?> Agora vamos criar um banco para usarmos como exemplo: Crie um banco chamado empregado: CREATEDATABASE`empregado`; CREATE TABLE `funcionario` ( `id` INT NOT NULL AUTO_INCREMENT , `nome` VARCHAR( 50 ) NOT NULL , `funcao` VARCHAR( 100 ) NOT NULL , PRIMARY KEY ( `id` ) ) TYPE = MYISAM ; As 04 operações básicas ( INSERT, UPDATE, DELETE E SELECT ) são realizadas utilizando o método Execute($stringSql, $Array): O primeiro argumento $stringSql é uma string contendo umas das 04 operações básicas, veja os exemplos no trecho de código abaixo: $sql = “SELECT * FROM tabela”; $bd->Execute($sql); ou $bd->Execute(“SELECT * FROM tabela”); O segundo argumento $Array é opcional. Este recurso pode ser muito interessante, muito usado por exemplo para criar uma rotina de importação. Este array é usado como argumento condicional para o primeiro argumento ($stringSql) passado para o método Execute: Exemplo com oracle: $bd->Execute(“DELETE FROM pedido WHERE código=:condicao”, array(‘condicao’=>$valor)); Para nosso exemplo vamos criar uma array para popular nossa tabela funcionario Depois de executado o código acima vamos ver se tudo funcionou realmente: Atualização ( UPDATE ) Vamos atualizar as informações do Joaquim Neto, pois ele mudou de função, passou para gerente-comercial: Conferindo Exclusão ( DELETE ) Infelizmente o Joaquim Neto não deu certo como gerente-comercial e foi mandado embora :( , vamos ter que exclui-lo: Conferindo E por ultimo vamos fazer um SELECT em nossa tabela funcionário e exibir os dados numa tabela. Antes vamos dá umam olha nesses três novos personagens; EOF, MoveNext e fields: EOF = Retorna true se o cursor estiver no ultimo registro $rs = $bd->Execute($sql); if(!$rs->EOF) { //Faz alguma coisa… MoveNext = Como o nome sugere, move o cursor para o próximo registro, ex.: $rs = $bd->Execute($sql); while(!$rs->EOF) { // Faz alguma coisa… $rs->MoveNext(); } // fields $id = $nome = $funcao = = Retorna o registro de acordo com o índice informado, ex.: $rs->fields[0]; $rs->fields[1]; f$rs->ields[2]; Voltando a nossa tabela funcionario: Conferindo o resultado