XOOPS + PDO

  • Identifique-se para criar novos tópicos neste fórum
  • Visitantes anônimos não podem postar neste fórum
 
Administração  Membro   Postagens: 2360

Você já pode testar a classe para usar a PDO no XOOPS. Fiz uns pequenos testes com mysql, mas seria excelente se puderem testar em maior escala e com outros bancos de dados.

Procedimentos:

Baixar.

- database.php,

- xoops_version.php,

- index.html,

- sqlutility.php

Em :

<XOOPS_ROOT_PATH>/class/database/drivers/pdo_mysql/   

(criar a pasta pdo_mysql)

Baixar:

Teste_pdo_xoops.php  em.

<XOOPS_ROOT_PATH>/

No mainfile.php:

Altere    essa linha:   

//define('XOOPS_DB_TYPE', 'mysql');

Para :

Define('XOOPS_DB_TYPE', 'pdo_mysql');

Obs. Se a porta não for a default, você pode definir no mainfile a constante.

XOOPS_DB_PORT (

Define('XOOPS_DB_PORT', 'nro.da porta'); )

Para testar com outros bancos:

Em:

Define('XOOPS_DB_TYPE', 'pdo_mysql');

Troque mysql pelo seu banco.

Ex. páginasql (postgree), oci (oracle)

Outros drivers em :

    https://xoops.net.br/docs-php-manual-pt/ref.pdo.php#pdo.drivers.

Exemplo para postgree (pgsql):

Copie a pasta.

<XOOPS_ROOT_PATH>/class/database/drivers/pdo-mysql/

Para:

<XOOPS_ROOT_PATH>/class/database/drivers/pdo-pgsql/

O arquivo sqlutility.php será verificado para detectar se tem comandos específicos do mysql, devendo ser trocado para o correspondente no novo banco desejado.

No arquivo database.php será alterado o nome da classe . Localize os trecho:

Pdo_mysql.

E troque por:

Pdo_pgsql.

Esse teste pode ser feito instalando-se um novo módulo.

-------------------------------------------------------

- Mostrar texto das mensagens anteriores -

Executem:

Teste_pdo_xoops.php

No raiz do XOOPS para verem alguns testes.

Este arquivo entre outras coisas, mostrará um var_dump da $xoopsDB e $xoopsUser.

Se conseguir , indica que fez conexão, leu banco, passou para session, etc.

Além de procurar testar as várias funções existentes na classe.

Alguns links muito importantes:

Referência do PDO

https://xoops.net.br/docs-php-manual-pt/ref.pdo.php

    

Drivers para o PDO

https://xoops.net.br/docs-php-manual-pt/ref.pdo.php#pdo.drivers.

Funções que podem ser usadas com pdo.

https://xoops.net.br/docs-php-manual-pt/function.PDO-construct.php

A montagem da classe XoopspdoDatabase em database.php foi pensando em manter a compatibilidade com o codigo atual do xoops.

Testei no XOOPS 1.0 "Janus" Final'

Mas é possível usar todas as outras funcionalidades da pdo, na construção dos módulos, como controle de transações, etc.

Encontrei um método que poderá falhar em algum módulo.

No método.

$xoopsDB->getAffectedRows()

, é necessário passar o $result de.

($result=$xoopsDB->query($sql))

Caso contrário, não será possível retornar a informação:

Conforme pesquisado no codigo do kernel do XOOPS, ele é usado no arquivo:

Kernel/session.php - linha 151

Para corrigir faça o seguinte:

//$this->db->queryF($sql);

Comente linha 151 e 152

//if (!$this->db->getAffectedRows()) {

$result=$this->db->queryF($sql);

Acrescente essas 2 linhas.

If (!$this->db->getAffectedRows($result)) {

Procure esta chamada getAffectedRows nos outros módulos instalados e faça o mesmo.

Antes não era passado parâmetros para ele, mas na pdo para saber o nro. de linhas afetadas , ela usa um método do PDOstatment , isso quer dizer que precisaria passar parâmetro, no caso o $result.

Exemplo de uso antes:

$sql=' update '.$xoopsDB->('users')."  set URL='abcde'  ";

$result=$xoopsDB->queryf($sql);

Echo 'Linhas afetadas:  ',$xoopsDB->getAffectedRows();

Agora:

$sql=' update '.$xoopsDB->('users')."  set URL='abcde'  ";

$result=$xoopsDB->queryf($sql);

Echo 'Linhas afetadas:  ',$xoopsDB->getAffectedRows($result);

Façam uma busca nos módulos que utilizam , procurando por getAffectedRows , para inserirem o parâmetro necessário.

A diferença básica da classe anterior para mysql e essa é que antes a propriedade conn do objeto $xoopsDB continha o id de conexão com o Banco.

Nessa classe pdo, a propriedade conn do $xoopsDB conterá uma instância da classe pdo. Por isso podemos usar as outras funcionalidades.

- Mostrar texto das mensagens anteriores -

Vejam um exemplo para recuperar o resultado de uma query para um objeto, o que antes não era possível fazer usando o objeto $xoopsDB.

$sql='select * from '.$xoopsDB->prefix('users');

$result=$xoopsDB->queryf($sql);  

// $result antes era um resource , agora  é um PDOstatment  (objeto  da pdo com  métodos proprios)

$obj=$result->fetchObject();     

//  Vejam que o método  fetchObject  foi  chamado a partir  do  $result.

//  Podemos  ainda, passar como parâmetro no fetchObject o nome da classe que desejamos instanciar.

// Isso é muito útil para recuperar dados do banco e popular objetos persistentes.

//  Se não passar nome da classe , será getado um objeto básico  StdClass.

Vejam um exemplo de como seria usar transações:

$xoopsDB->conn->beginTransaction();   //  inicia transação.

 

$xoopsDB->conn->commit();  // grava as transações:

 

$xoopsDB->conn->rollBack();   // desfaz as transações.

Um ponto importantíssimo que deve ser observado ao instalar módulos:

Verifique no xoops_version.php do módulo e procure as linhas que contenham :

$modversion['sqlfile']['mysql'] = "sql/arquivo.sql";

E inclua outra igual, trocando o índice mysql por pdo_mysql.

$modversion['sqlfile']['pdo_mysql'] = "sql/arquivo.sql";

Clausula LIMIT

Minha ideia inicial era fazer com que o limit (clausula encontrada na sql do Mysql) , pudesse ser usada com o objeto $xoopsDB de forma transparente, independente do banco de dados.

No início cheguei a pensar que a pdo fosse tratar isso, mas ollhando atentamente a documentação, percebi que s ela NÃO se propõe a ser uma classe de abstração para acesso ao Banco de Dados e isso deve ser feito por outra classe.

Então a aplicação do usuário deverá tratar isso e passar a sql já pronta para pdo executar.

Divirtam-se!

  Pesquisa avançada






Entrada

Codinome:


Senha:





Perdeu a senha?  |Cadastre-se!


Quem nos visita
Há 26 visitantes neste momento... (17 na seção Fóruns)

Associados: 0
Anônimos: 26

outros...

Banner XOOPS Cube