Jump to content


Photo

Acessando Access Com Php Sem Odbc


  • Faça o login para participar
25 replies to this topic

#1 Prog

Prog

    ...

  • Ex-Admins
  • 3761 posts
  • Sexo:Masculino
  • Localidade:Rio de Janeiro/RJ
  • Interesses:TI, Software Livre, Design Digital e Rock'n'Roll.

Posted 04/11/2004, 10:08

Olá Senhores...

Há tempos fiz um script que criava relatórios via CrystalReports e obtive um resultado excelente. Hoje resolvi fazer os mesmos testes conectando a uma base de dados Access, mas não tive o resultado esperado.

ps.: o código correto e funcional encontra-se mais abaixo


Aparentemente tudo funciona perfeitamente, com excessão do ponteiro... o método movenext não funciona, sendo assim, ele entra num loop infinito e exibe somente a informação do primeiro registro.

Se alguém souber de algo que possa resolver o problema, acredito que seja de grande valia para algumas pessoas do fórum.
------
Mero mortal!

#2 Jonas Felipe

Jonas Felipe

    Programador PHP :D

  • Usuários
  • 520 posts
  • Sexo:Não informado
  • Localidade:Aqui em ksa
  • Interesses:nenhum =]

Posted 04/11/2004, 16:13

uma sugestão... já tentou em vez de movenext, por next ou move_next... estou procurando algo para transformar o resultado em array achei apenas para conexões ODBC...
sem cabeça pra assinatura agora :P

#3 brunoalves

brunoalves

    Linux user #392843

  • Ex-Admins
  • 1018 posts
  • Sexo:Não informado
  • Localidade:Rio de Janeiro

Posted 04/11/2004, 16:22

Não sei se isto pode ajudar, mas quando eu usava o access, sempre que abria um recordset, eu tinha que ir para o último registro e depois para o primeiro, para que o mesmo ficasse populado (movelast depois movefirst).

Não sei como está agora, tem muito tempo que não uso isto.

Editando: se eu não fizesse isso ele ficava sempre no primeiro registro, ai não chegava ao final da tabela nunca :)

Abraço.

Edição feita por: brunoalves, 04/11/2004, 16:23.


#4 Prog

Prog

    ...

  • Ex-Admins
  • 3761 posts
  • Sexo:Masculino
  • Localidade:Rio de Janeiro/RJ
  • Interesses:TI, Software Livre, Design Digital e Rock'n'Roll.

Posted 05/11/2004, 15:13

É como se ele não criasse o ponteiro no banco de dados ou não reconhecesse...

Os métodos de manipulação de ponteiro não funcionam:
- movefirst, movelast e movenext.

Simplesmente aparece sempre o primeiro registro. Mais sugestões?

Caso contrário, vou dar a experiência como mal sucedida.
------
Mero mortal!

#5 Jonas Felipe

Jonas Felipe

    Programador PHP :D

  • Usuários
  • 520 posts
  • Sexo:Não informado
  • Localidade:Aqui em ksa
  • Interesses:nenhum =]

Posted 06/11/2004, 01:01

olá... bom... usando essa classe COM (cuja a msm nao tenhu conhecimento O.O) nao funciona... então opta por odbc ;)

testa ae (to sem tempo :X mauz :/)
obs: código retirado do site www.php.net official ;p
PHP

$con = odbc_connect('MSAccessDriver','','');

if ($con)
{
echo "odbc connected<br>";
$sql = "select * from Results";

//this function will execute the sql satametn in
//correspondance to the table in the db
$exc = odbc_exec($con,$sql);
}
else
echo "odbc not connected<br>";

if($exc)
{
echo "selection completed<br>";
while($row = odbc_fetch_row($exc) )
 echo $row->id."<br>";
}
else
echo "selection failed<br>";
 
?>


desculpa pelo "poco caso" feito deste post realmente to sem tempo aqui e to podre de sono :/
sem cabeça pra assinatura agora :P

#6 Prog

Prog

    ...

  • Ex-Admins
  • 3761 posts
  • Sexo:Masculino
  • Localidade:Rio de Janeiro/RJ
  • Interesses:TI, Software Livre, Design Digital e Rock'n'Roll.

Posted 06/11/2004, 09:11

Olá Jonas...

Entendo que é possivel usar conexão via ODBC, porém, o foco do assunto é outro, não quero realmente ter uma solução como esta, apenas fiz uma experiência e observei a "falha". Talvez seja impossivel fazer com objetos COM, apenas compartilhei com o fórum e, talvez, encontrasse outros curiosos que realizassem mais testes...

ps.: ainda não fiz testes com a base de dados do Access em outras versões, apenas com Access 2000.
------
Mero mortal!

#7 Prog

Prog

    ...

  • Ex-Admins
  • 3761 posts
  • Sexo:Masculino
  • Localidade:Rio de Janeiro/RJ
  • Interesses:TI, Software Livre, Design Digital e Rock'n'Roll.

Posted 06/11/2004, 09:28

É possivel encontrar alguns posts, de usuários, na própria documentação do PHP... vou fazer mais testes depois.

Referência:
(en) http://www.php.net/m...R/class.com.php
------
Mero mortal!

#8 Prog

Prog

    ...

  • Ex-Admins
  • 3761 posts
  • Sexo:Masculino
  • Localidade:Rio de Janeiro/RJ
  • Interesses:TI, Software Livre, Design Digital e Rock'n'Roll.

Posted 08/11/2004, 09:28

Bem... fiz os teste com o arquivo em formato Access 97... o script teve o mesmo comportamento.

Podemos concluir que fazer um script para conectar-se a uma base de dados do Access via objetos COM, é impossivel ou eu sou muito burro. *rs*
------
Mero mortal!

#9 Prog

Prog

    ...

  • Ex-Admins
  • 3761 posts
  • Sexo:Masculino
  • Localidade:Rio de Janeiro/RJ
  • Interesses:TI, Software Livre, Design Digital e Rock'n'Roll.

Posted 08/11/2004, 09:51

*rs* Como já havia mencionado... eu sou muito burro, ou quase.

Bem, é perfeitamente possivel usar objetos COM para conectar-se a base de dados Access.

Segue o código correto:

PHP
<?php

$pathDb
=realpath("Dados.mdb");
$cx = new COM("ADODB.Connection");
$cx->open("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=$pathDb");
$rs = new COM("ADODB.RecordSet");
$rs->open("select * from tabela",$cx,3,3);
$total = $rs->recordcount;
$num = 1;
echo
"Total de registros: $total<br>";
while (!
$rs->eof) {
$info = $rs->fields("campo");
echo
"$info->value<br>";
$rs->movenext();
}
$rs->close;
$cx->close;
$rs = null;
$cx = null;

?>


O problema estava em como eu chamava os métodos, é obrigatório o uso dos () parentêses.

Sendo assim, os métodos de manipulação de ponteiros funcionam desta forma:
- movefirst(), movelast() e movenext().
------
Mero mortal!

#10 Jonas Felipe

Jonas Felipe

    Programador PHP :D

  • Usuários
  • 520 posts
  • Sexo:Não informado
  • Localidade:Aqui em ksa
  • Interesses:nenhum =]

Posted 08/11/2004, 10:22

aoiuehaiueae digamos funções ;p
mas... tem algum tipo de parametro que pode ser passado com o movenext? tipo colocar um inteiro exemplo
movenext(2); ele iria pular 1 registro? :blink:
sem cabeça pra assinatura agora :P

#11 Prog

Prog

    ...

  • Ex-Admins
  • 3761 posts
  • Sexo:Masculino
  • Localidade:Rio de Janeiro/RJ
  • Interesses:TI, Software Livre, Design Digital e Rock'n'Roll.

Posted 08/11/2004, 13:26

Nops... todos estes métodos (movefirst(), movelast() e movenext()) não recebem parametros.

Para pular para um determinado registro, pode ser utilizado o move(), este sim recebe parametros.

Ex:
recordsetobject.Move(NumRecords, Start)
no caso do PHP
recordsetobject->Move(NumRecords, Start);
------
Mero mortal!

#12 Xandão Grunge

Xandão Grunge

    12 Horas

  • Usuários
  • 158 posts
  • Sexo:Não informado
  • Localidade:Chavantes

Posted 01/12/2004, 15:17

pessoal, não manjo de programação Orientaçada a Objetos. Pelo que sei o PHP 5 é O.O. né? Este script que o prog roda em PHP 4.3?

Eu até entendi o que faz as linhas. Mas uma perguntinha besta: aqueles "->" significam sinal de atrabuição? Se sim, qual a diferença para o "="? Onde posso achar algo que explique mais desta programação do PHP O. O. ?

Agradeço a atenção,
Xandão Grunge.
Xandão Grunge B)

#13 Prog

Prog

    ...

  • Ex-Admins
  • 3761 posts
  • Sexo:Masculino
  • Localidade:Rio de Janeiro/RJ
  • Interesses:TI, Software Livre, Design Digital e Rock'n'Roll.

Posted 01/12/2004, 16:12

Funciona em PHP 4.3?
Sim... no script estou usando os recursos do PHP de criar objetos COM, objetos esses que apenas existem no Windows, isso é o que faz tudo no Windows interagir, por isto no tópico há o comentário informando que tal script apenas funcionará no Windows.
Sendo mais específico, o suporte a componentes COM foram incluidos apartir de qualquer versão 4 do PHP.

Referência:
(pt) http://www.php.net/m..._BR/ref.com.php

Orientação a Objeto?
Como estamos trabalhando com componentes do Windows, os objetos são instanciados, ou seja criados, como acontece em outras linguagens (ex.: ASP), e para manipular tais objetos é necessário ter acesso aos seus métodos, em PHP, os métodos dos objetos são acessados com este símbolo "->".
Não é necessário ter um conhecimento aprofundado de Orientação a Objeto para fazer a manipulação de conexões com banco de dados via ADO.

Se quiser ler mais sobre os componentes ADO:
(en) http://www.devguru.c.../ado_intro.html

PHP5 é OO?
Mais ou menos... o PHP5 veio com um suporte melhor a programação orientada a objeto, o que não impede os desenvolvedores de programar da "maneira clássica". Com outras versões do PHP tb é possivel programar orientado a objeto.
------
Mero mortal!

#14 Xandão Grunge

Xandão Grunge

    12 Horas

  • Usuários
  • 158 posts
  • Sexo:Não informado
  • Localidade:Chavantes

Posted 04/12/2004, 14:29

Boa tarde Pessoal!

Conforme as instruções desse tópico, fiz um script que lesse um .mdb e ele rodou. O Único problema foi num campo do tipo data, onde ele exibia uns números estranhos. Alguém saberia explicar o pq disso, e como resolver isto?

Agradeço a atenção,
Xandão Grunge. B)
Xandão Grunge B)

#15 Prog

Prog

    ...

  • Ex-Admins
  • 3761 posts
  • Sexo:Masculino
  • Localidade:Rio de Janeiro/RJ
  • Interesses:TI, Software Livre, Design Digital e Rock'n'Roll.

Posted 06/12/2004, 08:53

Xandão...

O valor da data retornado é no formato timestamp do unix, para ter a "conversão" ao formato normal, use esta função:

PHP
<?php

echo date("d/m/Y",$info->value);

?>
------
Mero mortal!




0 user(s) are reading this topic

0 membro(s), 0 visitante(s) e 0 membros anônimo(s)

IPB Skin By Virteq