Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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.
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?
É 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
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"
>
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.
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.