Arkilus 0 Postado Janeiro 17, 2007 Share Postado Janeiro 17, 2007 (editado) SQL em PHP com o PEAR::MDB2 Introdução As conexões com um banco de dados SQL estão presentes em 95% das páginas que utilizam algum tipo de controle de dados, mas o grande problema é que nem sempre quem escreve esses scripts sabe fazê-lo de forma segura e sustentável. A forma mais comum e usada hoje em dia para uma conexão MySql seria o clássico mysql_connect(...). Acontece que essa forma de conexão obriga todos os utilizadores do script a usarem MySql, que nem sempre é o banco de dados desejado. Para contornar isso, um grupo de programadores da PEAR* decidiram criar um package (uma classe) que melhorasse as conexões SQL e ao mesmo tempo fosse compatível e fácil de ser usado em diversos tipos de bancos de dados, assim surgiu o package PEAR::DB, posteriormente substituído pela mais nova solução para SQL em PHP: o PEAR::MDB2. *PEAR é um repositório de packages (classes) PHP criado e mantido por centenas de programadores, com o intuito de criar e melhorar a usabilidade do PHP. Eles disponibilizam diversos pacotes que estão em constantes melhorias e cada qual com uma utilidade mais incrível que o outro. Tamanhas são as utilidades dos pacotes PEAR que as versões mais novas do PHP já são distribuídas com o PEAR e seus pacotes mais usados já instalados. Mais informações no site www.pear.php.net Se você utiliza uma versão do PHP ou um servidor recentes, é muito provável que já tenha tanto o PEAR como o básico do pacote MDB2 instalados. Instalando o MDB2 e o suporte para MySql e MySql Improved Caso o MDB2 não esteja instalado, siga os seguintes passos para baixar e instalar ele no PEAR (em Windows, mas em Linux é praticamente a mesma coisa): Vá em Iniciar -> Executar -> Digite cmd e dê enter O prompt de comando se abrirá, então navegue até a pasta em que esta o PEAR (normalmente /php/pear).Por exemplo, se a pasta do php estiver em C:\server\, digite cd C:\server\php Digite as seguintes linhas, aguardando o tempo de download/instalação de cada uma: pear install MDB2 pear upgrade MDB2 pear install MDB2_Driver_Mysql pear install MDB2_Driver_Mysqli Pronto, agora o pacote MDB2 está instalado e com suporte a MySql e MySql Improved Utilizando o PEAR::MDB2 **Conexão ****Incluindo o pacote A primeira coisa a se observar, é que para podermos usar um package da PEAR é necessário dar um include no arquivo principal deste, no nosso caso, devemos adicionar o arquivo MDB2.php no início de tudo (não é necessária a especificação do caminho): require_once('MDB2.php'); ****Declaração da DSN Feito isso, devemos nos conectar ao banco de dados. As conexões dos packages da PEAR (DB e MDB2) seguem uma sintaxe um pouco diferente da comumente utilizada pelos famosos mysql_connect, ou pg_connect, etc. Começando por uma DSN, que é uma string que possui uma forma especifica de declaração, englobando os dados da conexão: phptype://usuario:password@host/databaseOnde: phptype = Tipo de DB, valores aceitos: fbsql: FrontBase ibase: InterBase mssql: Microsoft SQL Server mysql: MySQL mysqli: MySQL Improved oci8 : Oracle 7/8/9 pgsql: PostgreSQL querysim: QuerySim sqlite: SQLite [*]usuario = Nome de usuário [*]password = Senha [*]host = Host [*]database = Nome da DB Exemplo: $dsn = 'mysqli://josh:waitzkin@localhost/chess'; Uma outra forma de declarar a DSN seria através de uma array: $dsn = array( 'phptype' => 'mysqli', 'username' => 'josh', 'password' => 'waitzkin', 'hostspec' => 'localhost', 'database' => 'chess' ); ****Conectando Declarada a DSN, falta chamar o método de conexão, existem três: connect : era mais usado no package PEAR::DB, mas caiu em desuso com o MDB2 (mas preservado). singleton : é usado para evitar que se sejam criadas duas conexões com a mesma DSN. Caso já haja alguma, ele retonará um erro. factory : é o mais utilizado e recomendado para a maioria das tarefas Para chamá-los devemos precedê-los de MDB2:: e usar como argumento a DSN: $con =& MDB2::factory($dsn); # ou $con =& MDB2::factory('mysqli://josh:waitzkin@localhost/chess'); Então será retornado um objeto referente a esta conexão. ATENÇÃO!*************************************************************** Para que o uso do MDB2 funcione corretamente é necessário o uso de um objeto-referência do objeto original em vez de uma cópia: $con =& MDB2::factory($dsn);e NÃO $con = MDB2::factory($dsn);*************************************************************** **Interagindo com o Banco de Dados ****Pesquisas - Query Simples Para recuperarmos dados da DB (SELECT, SHOW, EXPLAIN, etc) utilizamos o método query. Ele deve ser chamado através do objeto da conexão: $result =& $con->query($sql_query);Será retornado um handler para o resultado, e através dele podem ser usados outros métodos (atente novamente para o uso de referências - &). Exemplos: $result =& $con->query('SELECT * FROM table WHERE column=1'); $select = 'SELECT column FROM table WHERE column=0 ORDER BY date'; $result =& $con->query($select); - Número de linhas Retornadas Para verificar o número de linhas retornadas devemos usar o método numRows() do objeto-resultado. Exemplo: $rows = $result->numRows(); - Retirando dados do objeto-resultado *Para os próximos exemplos estarei usando a seguinte tabela: *Supondo que $result seja o resultado dessa query Após realizada a query, devemos chamar outro método caso desejemos usar os dados retornados: o fetchRow(). Este método aceita como parâmetro a forma como o resultado deve ser retornado, existem três tipos: MDB2_FETCHMODE_ORDERED - Modo padrão, retorna uma array em que cada chave numérica corresponde á coluna mais á esquerda, em ordem crescente e começando pelo 0. $row =& $result->fetchRow(MDB2_FETCHMODE_ORDERED); Resultado: $row[0] = "Valor1" $row[1] = 1 $row[2] = "Valor3" Retorno do print_r($row): Array ( [0] => Valor1 [1] => 1 [2] => Valor3 ) MDB2_FETCHMODE_ASSOC - Esse modo retorna uma array em que cada chave é o nome da coluna correspondente. $row =& $result->fetchRow(MDB2_FETCHMODE_ASSOC); Resultado: $row["coluna1"] = "Valor1" $row["coluna2"] = 1 $row["coluna3"] = "Valor3" Retorno do print_r($row): Array ( [coluna1] => Valor1 [coluna2] => 1 [coluna3] => Valor3 ) MDB2_FETCHMODE_OBJECT - Esse modo retorna um objeto em que cada coluna é tratada como um atributo. $row =& $result->fetchRow(MDB2_FETCHMODE_OBJECT); Resultado: $row->coluna1 = "Valor1" $row->coluna2 = 1 $row->coluna3 = "Valor3" Retorno do print_r($row): stdClass Object ( [coluna1] => Valor1 [coluna2] => 1 [coluna3] => Valor3 ) MDB2_FETCHMODE_DEFAULT - Esse método retorna uma array na forma default configurada no PEAR, que por padrão é o ORDERED - Configurando o padrão FETCHMODE da conexão Alternativamente podemos configurar um FETCHMODE padrão para a conexão com que vamos trabalhar através do método setFetchMode(). Feito isso, caso chamemos, por exemplo, um fetchRow() (sem argumento), a forma retornada seria a indicada nesse método. Uso: $con->setFetchMode(MDB2_FETCHMODE_ORDERED); // ou $con->setFetchMode(MDB2_FETCHMODE_ASSOC); //ou $con->setFetchMode(MDB2_FETCHMODE_OBJECT); A cada chamada á função fetchRow() será retornada uma linha, e false caso a última linha já tenha sido lida. - Lendo todas as linhas retornadas Para ler todas as linhas retornadas existem duas formas: º Loop while($row =& $result->fetchRow(MDB2_FETCHMODE_ASSOC)) { echo "<pre>"; print_r($row); echo "</pre>"; // Ações... } Saída: Array ( [coluna1] => Valor1 [coluna2] => 1 [coluna3] => Valor3 ) Array ( [coluna1] => V1 [coluna2] => 2 [coluna3] => V3 ) º Método fetchAll() Esse método retorna uma array bidimensional contendo todas as linhas do objeto-resultado. $row =& $result->fetchAll(MDB2_FETCHMODE_ASSOC); Saída do print_r($row): Array ( [0] => Array ( [coluna1] => Valor1 [coluna2] => 1 [coluna3] => Valor3 ) [1] => Array ( [coluna1] => V1 [coluna2] => 2 [coluna3] => V3 ) ) º query() + fetchAll() = queryAll() Uma maneira mais rápida e prática e fazer isso tudo seria o uso do método queryAll(): $row =& $con->queryAll("SELECT * FROM test", MDB2_FETCHMODE_ASSOC); A saída desse código seria a MESMA que a mostrada acima no método fetchAll(), porém, deve-se notar que o uso desse método impossibilita o uso de outros, como por exemplo o numRows() - que ainda assim pode ser contornado por funções de array. ****DMQ - Data Manipulation Queries - Query Simples Para executar-se queries de manipulação de dados (INSERT, UPDATE, DELETE), não mais deve ser o usado o método query() e sim o exec() Esse método retornará um erro caso seja usado com queries que não sejam DMQs, como SELECT. $nrows =& $con->exec($sql_query);Será retornado o número de linhas afetadas (note que no MDB2 não há mais o método affectedRows()). Exemplos: $nrows =& $con->exec("INSERT INTO test(coluna1, coluna2, coluna3) VALUES ('v_col1', 3, 'v_col3')"); $del = "DELETE FROM test WHERE coluna2='3'"; $nrows =& $con->exec($del); ****Tratamento de erros Para evitar problemas tanto no código como de segurança, deve-se sempre fazer uma verificação se a ação não resultou em um erro, para tanto usamos o método PEAR::isError($objeto-resultado). Verificado que existe um erro, podemos obter a mensagem enviada pelo MDB2 através do método getMessage() Exemplos: $result =& $cnt->query("SELECT * FROM tabela_inexistente"); if(PEAR::isError($result)) { die($result->getMessage()); } Saída: MDB2 Error: no such table#####################======================##################### Exemplo completo de como deveria ser escrito um script utilizando o PEAR::MDB2 : // Inclusão do pacote require_once('MDB2.php'); // Declaração da DSN $dsn = array( 'phptype' => 'mysqli', 'username' => 'josh', 'password' => 'waitzkin', 'hostspec' => 'localhost', 'database' => 'chess' ); // Conectando $con =& MDB2::factory($dsn); if(PEAR::isError($con)) die($con->getMessage()); // Configurando o FETCHMODE padrão $con->setFectchMode(MDB2_FETCHMODE_OBJECT); // Realizando um SELECT $select = "SELECT * FROM test"; $sel_res =& $con->query($select); if(PEAR::isError($sel_res)) die($sel_res->getMessage()); elseif($sel_res->numRows() < 1) die("DataBase error: no rows returned"); else { while($row =& $sel_res->fetchRow()) { /*...*/ } } // Realizando um INSERT $insert = "INSERT INTO test(coluna1, coluna2, coluna3) VALUES ('v_col1', 4, 'v_col3')"; $nrows =& $con->exec($insert); if(PEAR::isError($nrows)) die($nrows->getMessage()); elseif($nrows < 1) die("DataBase error: no rows affected"); #####################======================##################### Alguns sites para se ler sobre o assunto: Oficial da PEAR: www.pear.php.net/manual/en/package.database.mdb2.php Migrando do DB para o MDB2: www.phpied.com/db-2-mdb2 CODESCHMIE: codeschmie.de/archives/127-MDB2-Cheatsheet.html #####################======================##################### Quaisquer dúvidas é só postar! Enjoy Editado Março 9, 2007 por Arkilus Link para o comentário https://xtibia.com/forum/topic/39091-sql-em-php-com-o-pearmdb2/ Compartilhar em outros sites More sharing options...
Nostradamus 6 Postado Janeiro 17, 2007 Share Postado Janeiro 17, 2007 Ótimo tutorial, Arkilus sempre mostrando seu potencial. Além de tudo, é mais seguro que o tão famoso mysql_connect Link para o comentário https://xtibia.com/forum/topic/39091-sql-em-php-com-o-pearmdb2/#findComment-221868 Compartilhar em outros sites More sharing options...
Diogo 29 Postado Fevereiro 13, 2007 Share Postado Fevereiro 13, 2007 Prefiro o mysql_connect Link para o comentário https://xtibia.com/forum/topic/39091-sql-em-php-com-o-pearmdb2/#findComment-246661 Compartilhar em outros sites More sharing options...
Posts Recomendados