Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Lab Design

Conexão ZEND adapter Sql Server

Recommended Posts

Pessoal, seguinte:

Eu preciso publicar uma aplicação desenvolvida no ZF porém utilizando MS Sql Server.

O meu config está desta forma:

[general]

;db.adapter = PDO_MSSQL

db.adapter = PDO_ODBC

db.config.host = dominiodocliente

db.config.username = username

db.config.password = password

db.config.dbname = dbname

 

1) -Na locaweb (aqueles fdp dão com uma mão mas tiram com a outra) não está disponível o PDO_MSSQL, somente para quem contrata cloud. Os disponíveis são PDO_DBLIB e PDO_ODBC.

- Já tentei configurar de várias formas mas o ZF não consegue conexão: O erro apresentado é:

 

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[iM002] SQLConnect: 0 [unixODBC][Driver Manager]Data source name not found, and no default driver specified' in ...

Como eu posso alterar esse config para conseguir a conexão, já que toda a aplicação depende do adapter?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pessoal, seguinte:

Eu preciso publicar uma aplicação desenvolvida no ZF porém utilizando MS Sql Server.

O meu config está desta forma:

[general]

;db.adapter = PDO_MSSQL

db.adapter = PDO_ODBC

db.config.host = dominiodocliente

db.config.username = username

db.config.password = password

db.config.dbname = dbname

 

1) -Na locaweb (aqueles fdp dão com uma mão mas tiram com a outra) não está disponível o PDO_MSSQL, somente para quem contrata cloud. Os disponíveis são PDO_DBLIB e PDO_ODBC.

- Já tentei configurar de várias formas mas o ZF não consegue conexão: O erro apresentado é:

 

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[iM002] SQLConnect: 0 [unixODBC][Driver Manager]Data source name not found, and no default driver specified' in ...

Como eu posso alterar esse config para conseguir a conexão, já que toda a aplicação depende do adapter?

 

 

Segundo vários post que vi na net me parece que não é possivel utilizar pdo_odbc ou po_dblib em abstração e como a aplicação faz uso desse recurso, a única opção seria migrar o site do cliente para uma plataforma windows com php, uma vez que nela está disponível o pdo_mssql.

Conforme os testes no meu xampp/windows esse pdo funciona perfeitamente com sql server, porém em nenhuma dos tres planos de hospedagem que são compartilhados, a locaweb instala esse módulo.

 

Fiz um teste, publiquei parte da aplicação num dominio de outro cliente que está hospedado em windows e funcionou de primeira mas as os arquivos css e imagens não são enviados ao browser. Talvez o IIS não interprete o .htaccess com o comando RewriteEngine off dentro da pasta public.

Compartilhar este post


Link para o post
Compartilhar em outros sites

É lamentável quando precisamos do suporte:

Eu abri um chamado la na locaweb, eles simplesmente fecharam o chamando informando: Não damos suporte a programação mas somente a infra-estrutura. E agora eu pergunto: Esse problema não está relacionado a infra-estrutura?

No mínimo eles podiam investigar e propor uma solução. Foi o tempo que a gente podia contar com eles.

 

Bom resumindo descobri toda a causa do problema e isso servirá de ajuda para quem precisar publicar com ZF em servidores linux la na locaweb.

 

1) Baixei um class pdo_odbc da internet e coloquei na pasta Db/Adapter/Pdo do Zend.

2) Meu arquivo config.ini ficou da seguinte forma:

[general]

db.adapter = PDO_ODBC

db.config.host = host_sql_server

db.config.username = userId

db.config.password = password

db.config.dbname = username

db.config.driver = dblib

 

embora eu esteja descartando tudo isso diretamente no teste.

 

2) Alterei o pdo_odbc

   protected function _dsn()
   {
       // baseline of DSN parts
       $dsn = $this->_config;

       // don't pass the username and password in the DSN
       unset($dsn['username']);
       unset($dsn['password']);
       unset($dsn['driver_options']);
       unset($dsn['port']);

       // this driver supports multiple DSN prefixes
       // @see http://www.php.net/manual/en/ref.pdo-dblib.connection.php
       if (isset($dsn['pdoType'])) {
           switch (strtolower($dsn['pdoType'])) {
               default:
                   $this->_pdoType = 'dblib';
                   break;
           }
           unset($dsn['pdoType']);
       }

       if (isset($dsn['dbname'])) {
           $dsn = $this->_pdoType . ':' . $dsn['dbname'];
       } else {
           // use all remaining parts in the DSN
           foreach ($dsn as $key => $val) {
               $dsn[$key] = "$key=$val";
           }

           $dsn = $this->_pdoType . ':' . implode(';', $dsn);
       }
       //return $dsn;
       $_pdoType = "dblib";
       $_host = "hostMSSQL";
       $_dbname = "database";
       $dbuser = "userId";
       $dbPass = "password";
       $dsn = "$_pdoType:$_host;$_dbname".", $dbuser, $dbPass";
// forcei aqui seguindo um exemplo do http://iperfly.blogspot.com/2008/08/introduo-ao-pdo-php-data-objects.html
//que testei fora do Zend e funcionou
       return $dsn;
   }

depois preciso corrigir isso com mais calma.

 

3) Alterei o Abstract da pasta Db/Adapters/Pdo

 

       if (isset($this->_config['persistent']) && ($this->_config['persistent'] == true)) {
           $this->_config['driver_options'][PDO::ATTR_PERSISTENT] = true;
       	}
      	try {
           if ($this->_pdoType=='odbc')
				$this->_connection = new PDO(
                "dblib:host=myhost; dbname=database", 'userid', 'password'
            	);
			else
				$this->_connection = new PDO(
                $dsn,
                $this->_config['username'],
                $this->_config['password'],
                $this->_config['driver_options']
            	);

 

Notem que ele cria o driver_options que no caso do dblib, dá um erro portanto eu fiz um if e coloquei diretamente a string e funcionou.

 

Agora é organizar essa bagunça tentando manter esses dados no config.ini mas o mais importante é que consegui autenticar o usuário e acessar uma página restrita, coisa que vinha tentando a pelo menos uns tres dias, considerando que tudo já estava funcionando bem antes no meu xampp/windows usando o pdo_mssql

Compartilhar este post


Link para o post
Compartilhar em outros sites

A locaweb tem a biblioteca FreeDTS instalado nos servidores. Para conectar utilizando a PDO_MSSQL basta adicionar as configurações o parâmentro db.config.pdoType = "dblib" no config.ini

 

Exemplo:

 

db.adapter = Pdo_Mssql
db.config.host = localhost
db.config.username = usuario
db.config.password = senha
db.config.dbname = banco
db.config.pdoType = "dblib"

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.