Clipper On Line • Ver Tópico - combobox no PHP
Página 1 de 2

combobox no PHP

MensagemEnviado: 18 Out 2013 20:30
por cjp
Caros colegas,

Alguém poderia me ensinar a criar um combobox num PHP, para listar os arquivos existentes numa pasta do FTP?

Eu não entendo quase nada de PHP. Tenho um arquivo assim:

<html>
  <body>
    <form action="filtrar.php" method="post">
      <label>Escolha a base:</label>
      <input type="text" name="filtro2" id="filtro2" value="Digite aqui o nome da base a ser pesquisada" onfocus="this.value = '';" onblur="if (this.value == '') {this.value = 'Digite aqui o nome da base a ser pesquisada';}">
      <input type="submit" id="Pesquisar" value="Pesquisar">
   </form>
  </body>
</html>


Eu queria substituir a digitação do nome da base pelo usuário por um combobox no qual o usuário tivesse uma lista das bases existentes para que ele escolhesse entre os arquivos existentes, sem ter que digitar o nome do arquivo. Como faço isso?

combobox no PHP

MensagemEnviado: 18 Out 2013 21:40
por Toledo
Inácio, este exemplo eu não testei, mas acho que vai dar certo.

<html>
<body>
  <form action="filtrar.php" method="post">
   <label>Escolha a base:</label>
   <select name="filtro2">
<?php
   foreach (glob("*.dbf") as $arquivo) {
    $arq_ = str_replace(".DBF","",strtoupper($arquivo));
?>
    <option value="<?php echo $arq_; ?>"><?php echo $arq_; ?></option>
<?php
   }
?>
   </select>
   <input type="submit" id="Pesquisar" value="Pesquisar">
</form>
</body>
</html>


Abraços,

combobox no PHP

MensagemEnviado: 18 Out 2013 22:11
por cjp
Funcionou perfeitamente. Muito obrigado.

Tem como escolher as bases de dentro de uma subpasta do FTP, e não na raiz?

Outra coisa: será que dá pra fazer o mesmo com os campos da base?

Estou com o PHP assim:

<html>
<body>
  <form action="filtrar.php" method="post">
      <label>Pesquisar por:</label>
      <input type="text" name="filtro" id="filtro" value="Digite aqui parte do texto procurado" onfocus="this.value = '';" onblur="if (this.value == '') {this.value = 'Digite aqui parte do texto procurado';}">
   <label>Escolha a base:</label>
   <select name="filtro2">
<?php
   foreach (glob("*.dbf") as $arquivo) {
    $arq_ = str_replace(".DBF","",strtoupper($arquivo));
?>
    <option value="<?php echo $arq_; ?>"><?php echo $arq_; ?></option>
<?php
   }
?>
      <label>No campo:</label>
      <input type="text" name="filtro3" id="filtro3" value="Digite aqui o nome do campo a ser pesquisado" onfocus="this.value = '';" onblur="if (this.value == '') {this.value = 'Digite aqui o nome do campo a ser procurado';}">
   </select>
   <input type="submit" id="Pesquisar" value="Pesquisar">
</form>
</body>
</html>


Queria trocar o campo filtro3 para outro combobox com os campos da base, evitando que o usuário tenha que digitar o campo da base.

combobox no PHP

MensagemEnviado: 18 Out 2013 23:40
por Toledo
Inácio, para fazer a busca em uma subpasta basta informar o caminho, por exemplo:

foreach (glob("/pasta/*.dbf") as $arquivo) {


Agora, sobre um novo combobox com o nome dos campos do arquivo DBF, eu nunca usei arquivos DBF com PHP, então não sei se existe alguma função que retorna a estrutura do arquivo.

Outra coisa é que só com PHP não tem como fazer isto, pois todo script PHP é executado dentro do servidor, gerando o HTML que é então mostrado para o usuário. Então, quando o HTML (gerado pelo PHP) é apresentado na tela do computador do usuário, todo o código PHP já foi executado, ficando impossível saber previamente qual será o DBF escolhido pelo usuário.
Neste caso, junto com o PHP, teria que usar JavaScript, jQuery e Ajax para poder montar o combobox com os campos do arquivo.

Abraços,

combobox no PHP

MensagemEnviado: 19 Out 2013 00:49
por cjp
Muito obrigado, Toledo.

Mas eu devo ter feito alguma coisa errada na mudança da ordem dos campos, pois está dando o seguinte erro:

PHP Warning:  odbc_exec() [<a href='function.odbc-exec'>function.odbc-exec</a>]: SQL error: [Microsoft][ODBC dBase Driver] Syntax error in FROM clause., SQL state 37000 in SQLExecDirect in C:\Inetpub\Wwwroot\inaciobr\filtrar.php on line 13


O primeiro arquivo está assim:

<html>
<body>
   <label>Escolha a base:</label>
   <select name="filtro">
<?php
   foreach (glob("meusarq/agenda/*.dbf") as $arquivo) {
    $arq_ = str_replace(".DBF","",strtoupper($arquivo));
?>
    <option value="<?php echo $arq_; ?>"><?php echo $arq_; ?></option>
<?php
   }
?>
      <label>No campo:</label>
      <input type="text" name="filtro2" id="filtro2" value="Digite aqui o nome do campo a ser pesquisado" onfocus="this.value = '';" onblur="if (this.value == '') {this.value = 'Digite aqui o nome do campo a ser procurado';}">
  <form action="filtrar.php" method="post">
      <label>Pesquisar por:</label>
      <input type="text" name="filtro3" id="filtro3" value="Digite aqui parte do texto procurado" onfocus="this.value = '';" onblur="if (this.value == '') {this.value = 'Digite aqui parte do texto procurado';}">
   </select>
   <input type="submit" id="Pesquisar" value="Pesquisar">
</form>
</body>
</html>


E o segundo:

<?
$txtBase  = $_POST["filtro"];
$txtCampo = $_POST["filtro2"];
$txtFiltro  = $_POST["filtro3"];

$dsn = "DRIVER={Microsoft dBase Driver (*.dbf)};DBQ=".dirname($_SERVER['SCRIPT_FILENAME']).";";
$conn= odbc_connect($dsn,"","");
if(!$conn)
{ exit("conexao falhou: ".odbc_errormsg()); }
$sql="SELECT * FROM ".$txtBase." WHERE ".$txtCampo." LIKE '%".$txtFiltro."%'";
echo $sql;
echo $dns;
$rs=odbc_exec($conn,$sql);
if (!$rs)
{exit("Error in SQL");}

echo "<table BORDER=1><tr>";
echo "<th>data</th>";
echo "<th>".txtCampo."</th></tr>";
while (odbc_fetch_row($rs))
{
$compname=odbc_result($rs,"data");
$conname=odbc_result($rs,$txtCampo);
echo "<tr><td>$compname</td>";
echo "<td>$conname</td></tr>";
}
odbc_close($conn);
echo "</tr></table>";
?>



O que eu fiz de errado?

Entendi o que vc falou quanto ao campo da base. Mas eu pensei que daria pra fazer em PHPs separados. No primeiro, o usuário escolhe o arquivo. Daí outro PHP seria chamado para o usuário escolher o campo da base.

De qualquer forma, para isso eu ainda precisaria de alguma função que retornasse a estrutura do arquivo, né?

combobox no PHP

MensagemEnviado: 19 Out 2013 09:55
por Toledo
Olá Inácio, todas as linguagens (Clipper, PHP, Java, etc) tem uma estrutura de programação para execução dos comandos, como estruturas sequencial, de seleção, de repetição, etc. Cada comando tem que estar no lugar certo, senão pode prejudicar o seu resultado final.

No Clipper/Harbour, se tiver algum comando errado ou fora do lugar será alertado na compilação. No PHP (HTML) não existe isto, então você só vai saber se fez alguma errada na hora de abrir a página no seu site.

Bom, eu não analisei os comandos de manipulação de arquivos DBF no PHP, mas no código HTML que está no seu primeiro arquivo, faça o seguinte:

<form action="filtrar.php" method="post">
O comando acima, que está na linha 15 do seu arquivo, deve ser movido para linha 3, uma linha após ao comando <body>.

</select>
Mova também o comando acima, que está na linha 18, para a linha 13, uma linha antes de <label>No campo:</label>.

cjp escreveu:Mas eu pensei que daria pra fazer em PHPs separados. No primeiro, o usuário escolhe o arquivo. Daí outro PHP seria chamado para o usuário escolher o campo da base.

Sim, tem que ser usado um outro PHP para pegar a estrutura do arquivo DBF escolhido pelo usuário, mas combinando PHP com jQuery, Ajax e JavaScript (JSON) vai deixar a execução deste novo PHP invisível, sem ter que refazer a página toda do seu site.

cjp escreveu:De qualquer forma, para isso eu ainda precisaria de alguma função que retornasse a estrutura do arquivo, né?

Sem ter como saber qual a estrutura do arquivo, vai ficar difícil.

Abraços,

combobox no PHP

MensagemEnviado: 19 Out 2013 10:59
por cjp
Entendo perfeitamente o que vc diz, Toledo. O problema é que, como não conheço a estrutura da linguagem PHP, acabo às vezes fazendo besteira e não sei consertar.

Fiz as alterações que vc recomendou e funcionou em parte. Quando tiro o acesso à subpasta, funciona perfeitamente. Mas com o acesso à subpasta, dá o seguinte erro:

PHP Warning:  odbc_exec() [<a href='function.odbc-exec'>function.odbc-exec</a>]: SQL error: [Microsoft][ODBC dBase Driver] Syntax error in FROM clause., SQL state 37000 in SQLExecDirect in C:\Inetpub\Wwwroot\inaciobr\filtrar.php on line 13


O arquivo PHP está assim:

<html>
<body>
  <form action="filtrar.php" method="post">
   <label>Escolha a base:</label>
   <select name="filtro">
<?php
   foreach (glob("meusarq/agenda/*.dbf") as $arquivo) {
    $arq_ = str_replace(".DBF","",strtoupper($arquivo));
?>
    <option value="<?php echo $arq_; ?>"><?php echo $arq_; ?></option>
<?php
   }
?>
   </select>
      <label>No campo:</label>
      <input type="text" name="filtro2" id="filtro2" value="Digite aqui o nome do campo a ser pesquisado" onfocus="this.value = '';" onblur="if (this.value == '') {this.value = 'Digite aqui o nome do campo a ser procurado';}">
      <label>Pesquisar por:</label>
      <input type="text" name="filtro3" id="filtro3" value="Digite aqui parte do texto procurado" onfocus="this.value = '';" onblur="if (this.value == '') {this.value = 'Digite aqui parte do texto procurado';}">
   <input type="submit" id="Pesquisar" value="Pesquisar">
</form>
</body>
</html>


A pasta meusarq e a subpasta agenda existem no FTP e o arquivo agcom.dbf, que estou testando, está nessa pasta. Não entendo por que não funciona.

Quanto à outra questão, não veria problema de mudar a página do site, deixando o combobox com os campos da base escolhida aparecendo numa página seguinte, se isso dispensar o uso de Jquery e outras coisas que não conheço. O único problema é como saber a estrutura do arquivo, que eu não sei, e acho que você também não sabe. Vou postar esta questão novamente no post correspondente, para tentar obter uma solução. Obrigado.

combobox no PHP

MensagemEnviado: 19 Out 2013 11:24
por Toledo
Inácio, tente tirar o nome da subpasta dentro do combobox, fazendo o seguinte:

Procure por:
$arq_ = str_replace(".DBF","",strtoupper($arquivo));


e INCLUIR na linha SEGUINTE o comando:
$arq_ = str_replace("MEUSARQ/AGENDA/","",$arq_);


Bom, volto a lembrar que não sei como funciona o uso de arquivos DBF em um script em PHP, mas acho que o comando dirname($_SERVER['SCRIPT_FILENAME']), que está no arquivo filtrar.php, vai pegar os arquivos DBFs que estão na mesma pasta onde está sendo executado o arquivo filtrar.php. Então, acho que o script não vai usar os arquivos que estão na pasta MEUSARQ/AGENDA/.

cjp escreveu:... se isso dispensar o uso de Jquery e outras coisas que não conheço. O único problema é como saber a estrutura do arquivo...

O uso de jQuery com PHP não é o problema, isto eu domino bem, mas não saber como pegar a estrutura do arquivo DBF é que dificulta tudo.

Abraços,

combobox no PHP

MensagemEnviado: 19 Out 2013 11:37
por cjp
Fiz as alterações que vc recomendou. Funciona, mas só com os arquivos da raiz do FTP. De fato ele não acessa a subpasta.

Teria como colocar o PHP na subpasta e executá-lo por lá?

Ok, vamos esperar pra ver se o Rochinha me informa como acessar a estrutura do DBF. Obrigado.

combobox no PHP

MensagemEnviado: 26 Out 2013 17:42
por cjp
Toledo, o Rochinha me respondeu, passou a função que retorna os campos da base. Veja como ficou:

<?
    $dsn = "DRIVER={Microsoft dBase Driver (*.dbf)};DBQ=".dirname($_SERVER['SCRIPT_FILENAME']).";";
    $conn= odbc_connect($dsn,"","");
    if(!$conn)
        { exit("conexao falhou: ".odbc_errormsg()); }
   
        $sql="SELECT * FROM agcom WHERE compr LIKE '%".$txtFiltro."%'";
        $rs=odbc_exec($conn,$sql);
   
        if (!$rs)
            {exit("Error in SQL");}
   
            $i = 0;
            $fieldCount = odbc_num_fields($rs);
            echo " <table$css_table>\n";
            echo " <tr$css_tr>\n";

            while ($i < $fieldCount)
            {
                $i++;
                $fieldName = odbc_field_name($rs, $i);
                echo "  <th$css_th>$fieldName</th>\n";
            }
            echo " </tr>\n";
        odbc_close($conn);
?>


Agora eu preciso da tua ajuda para fazer o combobox para o usuário escolher os campos da base.

combobox no PHP

MensagemEnviado: 27 Out 2013 00:45
por Toledo
Inácio, como no meu servidor eu não consigo abrir arquivos DBF no meu PHP, então o código que segue em anexo não foi testado, mas acho que vai dar certo. Faz o teste ai e depois me dê um retorno.

Em anexo segue vários arquivos (PHP e JS) que você deve enviar para o seu servidor e depois chamar o arquivo agcom.php para testes.

Bom, se não der certo estes arquivos, e se for possível, você poderia criar um usuário/senha temporária no seu servidor de FTP para que eu possa fazer alguns teste. Se for possível, é só enviar o usuário e senha por MP.

Abraços

combobox no PHP

MensagemEnviado: 27 Out 2013 23:48
por cjp
De fato não funcionou. Te mandei em MP o meu usuário e senha.

combobox no PHP

MensagemEnviado: 28 Out 2013 09:39
por Toledo
Inácio, você não tinha enviado para o seu servidor o arquivo jquery.js e sem ele o preenchimento do Combobox não ia funcionar.

Bom, como os seus arquivos DBF estão em uma pasta diferente onde os arquivos PHP estão sendo executados, tive que fazer algumas alterações nos arquivos agcom.php, campos.php e filtrar.php, onde estava DBQ=".dirname($_SERVER['SCRIPT_FILENAME']).";" troque por:

DBQ=".dirname($_SERVER['SCRIPT_FILENAME'])."/meusarq/agenda/;"

Atenção: estas alterações eu já fiz, você não precisa editar os arquivos.

Também tive que refazer completamente o arquivo filtrar.php, para que pudesse criar a tabela com os nomes dos campos e conteúdo de cada campo do arquivo DBF selecionado.

Eu atualizei o arquivo que está em anexo na minha mensagem anterior, então seria bom você copiar o arquivo novamente, caso futuramente tenha que fazer alguma modificação.

Abraços,

combobox no PHP

MensagemEnviado: 29 Out 2013 23:43
por cjp
Caro Toledo,

Muitíssimo obrigado por sua ajuda.

Funcionou perfeitamente. Já salvei os arquivos que vc alterou.

Só percebi dois pequenos probleminhas:

1) quando faço a consulta em uma determinada base, ao retornar depois à tela de consulta com a tecla Backspace (não há outra forma de voltar), se tento consultar novamente na mesma base, ela não abre o segundo combobox (onde se escolhe o campo); é necessário abrir primeiro outra base e depois voltar à base anterior; não é grande problema, posso deixar assim; mas, por preciosismo, se for possível consertar isso, seria bom;

2) na base AGTEL.DBF, ele não está localizando o nome Luiz, que existe na base; tanto procurando por Luiz, como por luiz, por LUIZ ou por uiz, em nenhuma hipótese ele acha; mas se procuro por L, ele acha todos com a letra L, inclusive Luiz; este é só um exemplo; parece que o mesmo se aplica a todos os nomes desta base que estão com iniciais maiúsculas (mas não integralmente com maiúsculas).

Também gostaria de saber se existe como fazer consulta semelhante para campos que não são caracteres. Já verifiquei que a consulta funciona com caracteres, mas meio defeituosa. Exemplo: se procuro por 1000 num campo numérico, ele vai achar 1000, mas também vai achar 10000, 5100 etc. Idem para campos data. Se for possível fazer uma consulta específica, seria ótimo.

combobox no PHP

MensagemEnviado: 30 Out 2013 09:58
por Toledo
Olá Inácio, fiz mais algumas alterações nos arquivos agcom.php e filtrar.php para tentar resolver estes problemas, mas consegui corrigir apenas o problema com o combobox quando se usa o BackSpace para retornar a página anterior.

cjp escreveu:2) na base AGTEL.DBF, ele não está localizando o nome Luiz, que existe na base; tanto procurando por Luiz, como por luiz, por LUIZ ou por uiz, em nenhuma hipótese ele acha;

A busca feita pela função SELECT do MySQL é "case sensitive", ela faz distinção entre letras maiúsculas e minúsculas, então no arquivo filtrar.php eu converti o conteúdo do campo de busca (filtro3) para MAIÚSCULA antes de fazer a busca no arquivo DBF, então é por isto que se no campo do arquivo DBF contém textos com letras em maiúsculas e minúsculas a busca não retorna nada.
Tentei usar no SELECT a função UPPER(), para converter o conteúdo do campo escolhido para maiúsculas, mas não deu certo.
$sql="SELECT * FROM ".$txtArquivo." WHERE UPPER(".$txtCampo.") LIKE '%".$txtPesquisa."%'";

Ocorre algum erro que nem é apresentada uma mensagem de erro, então fiquei sem saber qual o motivo do erro, acho que a função UPPER() não é aceitável em SELECT em arquivos DBFs. Volto a lembrar que não tenho experiência nenhuma com uso de arquivos DBF com PHP.
Bom, neste caso não posso lhe ajudar muito, então se não for apresentada uma outra solução, acho que você vai ter que converter todos os textos em letras maiúsculas nos campos dos seus arquivos DBF.

cjp escreveu:Também gostaria de saber se existe como fazer consulta semelhante para campos que não são caracteres. Já verifiquei que a consulta funciona com caracteres, mas meio defeituosa. Exemplo: se procuro por 1000 num campo numérico, ele vai achar 1000, mas também vai achar 10000, 5100 etc. Idem para campos data. Se for possível fazer uma consulta específica, seria ótimo.

No arquivo filtrar.php na busca (SELECT) é usado o comando LIKE que é igual ao operador $ (contém) do Clipper, então o valor 100 está contido em 10000, 5100, etc.
Fiz uma alteração no arquivo filtrar.php para verificar se a busca é um valor numérico, mas não consegui testar para ver se ia dar certo, pois são tantos arquivos DBF existentes no seu site, que eu fiquei perdido sem saber qual deles tem algum campo numérico para que eu possa escolher para teste.
Agora sobre as datas, nem tentei nada, pois não sei como é o tratamento de campos DATA de arquivos DBF no PHP, que formato é: DD/MM/AAAA, AAAA/MM/DD, AAAA-MM-DD, etc.

Inácio, sem saber estes detalhes acima, fica complicado tentar resolver, mas estou a sua disposição caso encontre alguma saída, alguma luz para estes problemas.

Outra coisa, seria bom você estudar os códigos que estão nos arquivos PHP, para tentar entender o que eu fiz, só assim você poderá aprender alguma coisa e não ficar dependendo completamente de ajuda. O Rochinha passou o endereço www.php.net que tem todas as funções utilizadas no exemplo dele para tratamento de arquivos DBF com PHP, segue abaixo também alguns outros sites que podem ajudar no seu aprendizado:
- Manual PHP
- Manual MySQL
- Funções HTML
E use e abuse do www.google.com.br, que é uma fonte inesgotável de informação.

Obs.: os arquivos atualizados estão em anexo na minha mensagem anterior.

Abraços,

combobox no PHP

MensagemEnviado: 04 Nov 2013 16:13
por cjp
Muitíssimo obrigado, amigo.

Salvei os arquivos e vou fazer uns testes.

Sei que preciso estudar bastante, e estou tentando, mas é que me faltam os conhecimentos básicos (além de também faltar tempo). De qualquer forma, vou persistir nas tentativas.

De toda forma, reitero meus agradecimentos pela tua sempre pronta disposição para ajudar.

combobox no PHP

MensagemEnviado: 09 Abr 2014 00:16
por cjp
Caro Toledo, e demais colegas,

Estou estudando o Manual PHP, que é bastante claro e fácil de entender, e tentando fazer algumas funções. Até já consegui praticamente terminar uma funçãozinha bem simples, a seguir:

<html>
<head>
  <title>Leitura</title>
</head>
<body>
<?php

$txtArquivo = "LEITURA.DBF";
$dsn = "DRIVER={Microsoft dBase Driver (*.dbf)};DBQ=".dirname($_SERVER['SCRIPT_FILENAME'])."/agenda/;";
$conn= odbc_connect($dsn,"","");
if(!$conn)
{ exit("conexao falhou: ".odbc_errormsg()); }
// go bottom
$mat=materia;
$qtd=quantidade;
while ($qtd>2)
{
$qtd==($qtd-3);
}
if($qtd=1)
  {
  if($mat="PENAL")
   { $mat="CIVIL"; }
  elseif($mat="CIVIL")
   { $mat="ADM"; }
  else
   { $mat="PENAL"; }
  }
  elseif($qtd=2)
  {
echo 2; 
  if($mat="PENAL")
   { $mat="ADM"; }
  elseif($mat="CIVIL")
   { $mat="PENAL"; }
  else
   { $mat="CIVIL"; }
  }
  echo $mat;
odbc_close($conn);
?>
</body>
</html>


Só estou enfrentando um pequeno problema nela, que não é propriamente de PHP, mas do uso de DBF em PHP. O problema está na linha:

go bottom


que está acima comentada, pois está dando erro.

Sei que não deve ser esse o comando correto, já que este é o comando que uso em Harbour.

Eu queria justamente um comando equivalente a esse. A ideia é ir ao final da base de dados, para desse último registro tirar os dados que tomo a seguir.

Como o número de registros na base é variável, não é possível especificar previamente o registro. O que eu pretendo é tomar sempre o último registro da base, seja ele qual for.

Consultei o tópico viewtopic.php?f=28&t=12863, em que o Rochinha arrola várias funções para uso de DBF no PHP, mas esta opção que eu preciso não está lá demonstrada.

Agradeço desde já qualquer ajuda.

combobox no PHP

MensagemEnviado: 09 Abr 2014 11:04
por Toledo
Inácio, volto a dizer que uso de DBF com PHP não é o meu forte, então fico meio limitado em lhe ajudar. Mas os comandos que estamos acostumados a usar no Harbour para manipulação de arquivos DBF, não são aceitos em script PHP. Você vai ter que usar o comando SELECT com os parâmetros certos para retornar os registros que você quer.
O comando SELECT tem opção para retornar os registros de forma ASCendente (ASC) ou DESCendente (DESC), como se fosse usado o Go Top ou Go Bottom.

Exemplo de SELECT com DESC:
$sql="SELECT * FROM LEITURA ORDER BY materia DESC";


Veja mais detalhes sobre o comando SELECT:
http://dev.mysql.com/doc/refman/4.1/en/select.html

Procure também nos seus códigos PHP usando DBF que deve ter muitos comandos usando SELECT.

Abraços,

combobox no PHP

MensagemEnviado: 10 Abr 2014 01:27
por cjp
Aparentemente não funcionou. Coloquei assim:

<html>
<head>
  <title>Leitura</title>
</head>
<body>
<?php

$txtArquivo = "LEITURA.DBF";
$dsn = "DRIVER={Microsoft dBase Driver (*.dbf)};DBQ=".dirname($_SERVER['SCRIPT_FILENAME'])."/agenda/;";
$conn= odbc_connect($dsn,"","");
if(!$conn)
{ exit("conexao falhou: ".odbc_errormsg()); }
$mat="SELECT * FROM LEITURA ORDER BY materia DESC";
$qtd=quantidade;
while ($qtd>2)
{
$qtd==($qtd-3);
}
if($qtd=1)
  {
  if($mat="PENAL")
   { $mat="CIVIL"; }
  elseif($mat="CIVIL")
   { $mat="ADM"; }
  else
   { $mat="PENAL"; }
  }
  elseif($qtd=2)
  {
echo 2; 
  if($mat="PENAL")
   { $mat="ADM"; }
  elseif($mat="CIVIL")
   { $mat="PENAL"; }
  else
   { $mat="CIVIL"; }
  }
  echo $mat;
odbc_close($conn);
?>
</body>
</html>


De fato eu sabia que o go bottom não funcionaria em PHP, estava apenas tentando descobrir algo equivalente.

Eu sei que DBF com PHP não é o teu forte (menos ainda o meu), mas até naquilo que não é teu forte vc é bom.

A este propósito, te pergunto: é mais fácil usar o SQL no PHP? Estou tentando aprender a usar o SQL em Harbour, mas ainda não passei das preliminares (estou buscando ajuda no fórum). No PHP é mais fácil do que no Harbour? Ou, pelo menos, é mais fácil no PHP usar SQL do que DBF?

combobox no PHP

MensagemEnviado: 10 Abr 2014 08:26
por Toledo
cjp escreveu:Aparentemente não funcionou.

Você apenas montou um query com o SELECT, mas não executou ele, então não vai acontecer nada mesmo.

O ideal é saber o que está fazendo e o que tem que fazer. Então veja outros códigos que você já fez usando estes comando PHP com DBF.

http://www.pctoledo.com.br/forum/viewtopic.php?f=28&t=12863&start=30#p84474
Este é apenas um exemplo, mas você tem outros códigos ai para servir como base.

Acho que você deveria saber quais os comandos que você teria que usar, acho que a base seria esta:

1 - Executar o query: odbc_exec()
http://www.php.net/manual/pt_BR/function.odbc-exec.php

2 - Obter as linhas do resultado da consulta SELECT: odbc_fetch_row()
http://www.php.net/manual/pt_BR/function.odbc-fetch-row.php

3 - Pegar os dados de cada linha: odbc_result()
http://www.php.net/manual/pt_BR/function.odbc-result.php

Se você procurar ai nos seus códigos, com certeza você vai ver que já usou estes comandos antes.

Nos links que passei acima tem todos os comandos que você pode usar em PHP com DBF, então salve link desta página para futuras consultas.

cjp escreveu:De fato eu sabia que o go bottom não funcionaria em PHP

Vendo o código de suas tentativas, eu não consegui entender a razão de dar um "go bottom"!!! No seu código você usa um While e parece somar um determinado campo do DBF. Bom, se você está usando um While é que vai passar por vários registros. Então eu não entendi porque tem que ir para o final do DBF.

cjp escreveu:é mais fácil usar o SQL no PHP? ... é mais fácil no PHP usar SQL do que DBF?

Não é que seja mais fácil, mas para mim é mais fácil porque tenho mais experiência com SQL do que DBF.
cjp escreveu:No PHP é mais fácil do que no Harbour?

São linguagens diferentes, então aquela que você dominar mais, sempre será a mais fácil.

Abraços,

combobox no PHP

MensagemEnviado: 10 Abr 2014 15:56
por cjp
Na verdade eu parti desse outro exemplo que vc mencionou, que eu tinha feito com a tua ajuda (e também a ajuda do Rochinha, que fez a ponte com o uso do DBF). Fiz algumas modificações nesse exemplo anterior para chegar ao atual.

O modelo anterior é este:

<html>
<head>
  <title>Consulta</title>
</head>
<body>
<?php
$txtArquivo = $_POST["filtro"];
$txtCampo = $_POST["filtro2"];
$txtPesquisa = strtoupper($_POST["filtro3"]);

$dsn = "DRIVER={Microsoft dBase Driver (*.dbf)};DBQ=".dirname($_SERVER['SCRIPT_FILENAME'])."/agenda/;";
$conn= odbc_connect($dsn,"","");
if(!$conn)
{ exit("conexao falhou: ".odbc_errormsg()); }
if (ctype_digit($txtPesquisa)) {
  $sql="SELECT * FROM ".$txtArquivo." WHERE ".$txtCampo." = '".$txtPesquisa."'";
} else {
  $sql="SELECT * FROM ".$txtArquivo." WHERE ".$txtCampo." LIKE '%".$txtPesquisa."%'";
}
$rs=odbc_exec($conn,$sql);
if (!$rs)
{exit("Error in SQL");}

$i = 0;
$fieldCount = odbc_num_fields($rs);
echo '<table Border="1"><tr>';
while ($i < $fieldCount)
{
   $i++;
   $fieldName = odbc_field_name($rs, $i);
   echo "<th>$fieldName</th>";
}
echo "</tr>";
while (odbc_fetch_row($rs))
{
  echo "<tr>";
  $i = 0;
  while ($i < $fieldCount)
  {
   $i++;
   $fieldName = odbc_field_name($rs, $i);
   $compname=odbc_result($rs,$fieldName);
   echo "<td>$compname</td>";
  }
  echo "</tr>";
}
echo "</table>";
odbc_close($conn);
?>
</body>
</html>


E de fato ele tem alguns dos comandos que vc mencionou agora. Eu os retirei pois não sabia no que eles contribuiriam. Vou estudar melhor para corrigir o problema.

Vou te explicar a razão do "go bottom":

Esta função, que eu já tenho rodando em harbour sem problema, faz uma coisa bem simples: ela pega o último registro de uma base de dados DBF, que tem os seguintes campos: data, materia, quantidade, para descobrir qual será a próxima matéria. São 3 matérias possíveis: CIVIL - ADM - PENAL, que se sucedem nesta ordem. Em cada registro da base está tem a data sucessiva (todos os dias), a primeira matéria do dia e a quantidade do dia. O objetivo da função é saber qual será a primeira matéria do dia seguinte. Então, se, por exemplo, o último registro está com data de ontem, com matéria inicial ADM e quantidade 4, a matéria de hoje (dia seguinte) será PENAL, pois ontem já foi ADM - PENAL - CIVIL - ADM. Entendeu?

O while é apenas para fazer esse cálculo, ele não visita todos os registros da base. O objetivo da função é pegar o último registro (e daí o go bottom), ver qual foi a matéria inicial e a quantidade, para calcular qual será a próxima matéria. Observe como eu fiz o while:

 while ($qtd>2)
{
$qtd==($qtd-3);
}


Como são 3 matérias, a ideia do while é pegar o resto da divisão da quantidade por 3.

Depois disso, eu fiz o if e elseif, assim:

 if($qtd=1)
  {
  if($mat="PENAL")
   { $mat="CIVIL"; }
  elseif($mat="CIVIL")
   { $mat="ADM"; }
  else
   { $mat="PENAL"; }
  }
  elseif($qtd=2)
  {
  if($mat="PENAL")
   { $mat="ADM"; }
  elseif($mat="CIVIL")
   { $mat="PENAL"; }
  else
   { $mat="CIVIL"; }
  }


A ideia desse if/elseif é determinar a matéria de acordo com o resto da divisão pega no while anterior. Então, se o resto da divisão ($qtd) for 1, a matéria será a seguinte à do último registro (outro if/elseif dentro do primeiro: se a matéria do último registro for PENAL, a próxima será CIVIL; se for CIVIL, a próxima será ADM; se for ADM, a próxima será PENAL). Se o resto da divisão for 2, a matéria será duas próximas à do último registro (se for PENAL, será ADM...). Se o resto for 0, não precisa fazer nada, pois a matéria será a mesma.

Entendeu?

Como disse, ainda preciso estudar melhor estas funções. Por enquanto, fiz assim, mas ainda não funcionou:

<html>
<head>
  <title>Leitura</title>
</head>
<body>
<?php

$txtArquivo = "LEITURA.DBF";
$dsn = "DRIVER={Microsoft dBase Driver (*.dbf)};DBQ=".dirname($_SERVER['SCRIPT_FILENAME'])."/agenda/;";
$conn= odbc_connect($dsn,"","");
if(!$conn)
{ exit("conexao falhou: ".odbc_errormsg()); }
$sql="SELECT * FROM LEITURA ORDER BY materia DESC"; // go bottom
$rs=odbc_exec($conn,$sql);
if (!$rs)
{exit("Error in SQL");}
echo "</tr>";
while (odbc_fetch_row($rs))
{
  echo "<tr>";
  $i = 0;
  while ($i < $fieldCount)
  {
   $i++;
   $mat = odbc_field_name($rs, $i);
   $compname=odbc_result($rs,$fieldName);
   echo "<td>$compname</td>";
  }
  echo "</tr>";
}
$qtd=quantidade;
while ($qtd>2)
{
$qtd==($qtd-3);
}
if($qtd=1)
  {
  if($mat="PENAL")
   { $mat="CIVIL"; }
  elseif($mat="CIVIL")
   { $mat="ADM"; }
  else
   { $mat="PENAL"; }
  }
  elseif($qtd=2)
  {
echo 2; 
  if($mat="PENAL")
   { $mat="ADM"; }
  elseif($mat="CIVIL")
   { $mat="PENAL"; }
  else
   { $mat="CIVIL"; }
  }
  echo $mat;
odbc_close($conn);
?>
</body>
</html>

combobox no PHP

MensagemEnviado: 11 Abr 2014 21:38
por Toledo
Inácio, eu não tenho como testar este código para ver se tem algum erro, então faz um teste ai.

<html>
<head>
<title>Leitura</title>
</head>
<body>
<?php
$aMat = array(1 => 'CIVIL', 'ADM', 'PENAL', 'CIVIL', 'ADM');
$txtArquivo = "LEITURA.DBF";
$dsn = "DRIVER={Microsoft dBase Driver (*.dbf)};DBQ=".dirname($_SERVER['SCRIPT_FILENAME'])."/agenda/;";
$conn= odbc_connect($dsn,"","");
if(!$conn)
{ exit("conexao falhou: ".odbc_errormsg()); }
$sql="SELECT * FROM LEITURA"; // seleciona todos os registros
$rs=odbc_exec($conn,$sql);
if (!$rs)
{exit("Error in SQL");}

$r = odbc_num_rows($rs);  //total de registros
odbc_fetch_row($rs,$r);   //seleciona o ultimo registro - go bottom
$mat = odbc_result($rs,"materia");  //pega o conteudo do campo materia
$qtd = odbc_result($rs,"quantidade"); //pega o campo quantidade
$pos = array_search($mat, $aMat);  //procura a posiçao da materia na array

if ($qtd>2) {
   $pos = $pos + ($qtd%3);  //soma a posicao + resto da divisao
} else {
   $pos = $pos + $qtd;  //soma a posicao + quantidade
}

echo $aMat[$pos];  //mostra a proxima materia
odbc_close($conn);
?>
</body>
</html>

Bom, o caminho a seguir é este, então procure no google os comandos que usei e veja como eles funcionam, os comandos com início odbc_ está num link que postei na minha mensagem anterior, os demais comandos são do PHP, então é só entrar no Google e digitar PHP seguido do comando e fazer a busca.

Abraços e boa sorte!

combobox no PHP

MensagemEnviado: 11 Abr 2014 23:18
por cjp
Funcionou perfeitamente.

E eu também entendi perfeitamente todas as partes da função.

Obrigado.

Fiz umas pequenas modificações apenas para conferir se estava tudo certo, daí fiquei com duas dúvidas:

1) Tentei colocar
$dt = obdc_result($rs,"data");

para pegar a data do último registro, mas dá erro:
PHP Fatal error:  Call to undefined function obdc_result() in C:\Inetpub\Wwwroot\inaciobr\leitura.php on line 22


2) Coloquei para mostrar o número do último registro assim:

echo $r;


Mas retorna -1.

Fiz assim:

<html>
<head>
<title>Leitura</title>
</head>
<body>
<?php
$aMat = array(1 => 'CIVIL', 'ADM', 'PENAL', 'CIVIL', 'ADM');
$txtArquivo = "LEITURA.DBF";
$dsn = "DRIVER={Microsoft dBase Driver (*.dbf)};DBQ=".dirname($_SERVER['SCRIPT_FILENAME'])."/agenda/;";
$conn= odbc_connect($dsn,"","");
if(!$conn)
{ exit("conexao falhou: ".odbc_errormsg()); }
$sql="SELECT * FROM LEITURA"; // seleciona todos os registros
$rs=odbc_exec($conn,$sql);
if (!$rs)
{exit("Error in SQL");}

$r = odbc_num_rows($rs); //total de registros
odbc_fetch_row($rs,$r); //seleciona o ultimo registro - go bottom
$matv = odbc_result($rs,"materia"); //pega o conteudo do campo materia
$qtd = odbc_result($rs,"quantidade"); //pega o campo quantidade
$dt = obdc_result($rs,"data");
$pos = array_search($matv, $aMat); //procura a posiçao da materia na array

if ($qtd>2) {
$pos = $pos + ($qtd%3); //soma a posicao + resto da divisao
} else {
$pos = $pos + $qtd; //soma a posicao + quantidade
}

echo "Próxima matéria: ";
echo $aMat[$pos]; //mostra a proxima materia
echo "     Última matéria: ";
echo $matv;
echo "     Última quantidade: ";
echo $qtd;
echo "     Número do registro: ";
echo $r;
odbc_close($conn);
?>
</body>
</html>

combobox no PHP

MensagemEnviado: 12 Abr 2014 01:10
por Toledo
cjp escreveu:$dt = obdc_result($rs,"data");

Amigo, sempre que ocorrer algum erro, analise com muita atenção o comando e tente descobrir onde está o erro. O que ajuda a encontrar onde pode estar o erro e a mensagem de erro, tente entender a mensagem, geralmente a própria mensagem já dá uma dica onde você está errando. Se não domina bem o Inglês, use o tradutor do Google, que é muito bom.

cjp escreveu:Mas retorna -1.

A função que está retornando este resultado é a odbc_num_rows, então de uma olhada nos links que lhe passei em uma das minhas mensagens anteriores:
http://www.php.net/manual/pt_BR/function.odbc-num-rows.php
Veja principalmente o valor que esta função retorna e também as Notas.
Atenção: observe que no lado esquerdo do link acima tem todas as funções de odbc usadas no PHP.

Bom, se está retornando -1, é que a função não está dando certo. Agora porque? Eu não sei! Mas o valor de retorno e as Notas do link da função pode dizer o possível motivo.

Tente incluir o código abaixo antes de $r = odbc_num_rows($rs); para ver se dá certo.

while( false !== ( $Row = @odbc_fetch_array( $rs ) ) ) {
}


Abraços,

combobox no PHP

MensagemEnviado: 14 Abr 2014 00:57
por cjp
Na verdade o problema não é com o inglês, mas sim com a própria linguagem da programação mesmo.

Veja, por exemplo, a linha do erro que te mencionei antes:

PHP Fatal error: Call to undefined function obdc_result() in C:\Inetpub\Wwwroot\inaciobr\leitura.php on line 22


Claro que eu entendo o que está escrito: "Erro fatal PHP: chamada à função indefinida obcd_result() em c:\inetpub\wwwroot\inaciobr\leitura.php na linha 22".

Entretanto, o que eu não entendo é o porque essa função está dando como indefinida. Veja esta parte da função:

 $matv = odbc_result($rs,"materia"); //pega o conteudo do campo materia
$qtd = odbc_result($rs,"quantidade"); //pega o campo quantidade
//$dt = obdc_result($rs,"data");


As duas primeiras linhas foi vc que fez e funcionam corretamente. Na terceira, que eu fiz, está aparentemente tudo igual.

Mas, como disse, essa não é uma questão importante, pois o que eu queria já funcionou. Seria só pra eu entender mesmo como funciona.

Mas tenho uma outra questão, não achei no manual nada a respeito: tem alguma forma de tratamento de tela no PHP? Queria apenas coisas simples, como aumentar tamanho da fonte, cor da tela etc.

combobox no PHP

MensagemEnviado: 14 Abr 2014 08:20
por Toledo
cjp escreveu:Entretanto, o que eu não entendo é o porque essa função está dando como indefinida.

Vou fazer aqui um trocadilho que com certeza você vai descobrir onde está o erro...

Em qualquer linguagem de programa você tem que OBDC ("obedece") os nomes corretos das funções, aqui no caso o nome das funções de ODBC do PHP.

cjp escreveu:Claro que eu entendo o que está escrito: "Erro fatal PHP: chamada à função indefinida obcd_result()

Tem que prestar muita atenção na hora de digitar os comandos, no texto acima você já deu uma outra sequência para a função de ODBC.

cjp escreveu:tem alguma forma de tratamento de tela no PHP? Queria apenas coisas simples, como aumentar tamanho da fonte, cor da tela etc.

Bom, PHP aceita qualquer comando HTML, então você pode usar o comando FONT do HTML:
http://www.w3schools.com/tags/tag_font.asp
Neste link tem todos os comandos HTML (para texto veja: strong, p, i, s, u, span, textarea, b, br, h1, h2, ect)

Mas para apresentar algum comando HTML dentro de instruções PHP (comandos que fica entre <?php e ?>), você tem que colocar os comandos HTML entre aspas simples ( ' ' ) e algumas vezes é necessário "somar" com variáveis do PHP, onde a "concatenação" das variáveis é feita com um ponto final ( . ), diferente do que a gente está acostumado no Harbour, com o operador +. Por exemplo:

echo '<font face="arial" color="red" size="3">'.$aMat[$pos].'</font>';


Abraços,

combobox no PHP

MensagemEnviado: 14 Abr 2014 23:47
por cjp
Fiquei até com vergonha da minha burrice agora. E olha que eu costumo ser bem detalhista. Acho que estou é ficando cego mesmo.

Desculpe, e muito obrigado pela paciência.

Funcionou perfeitamente. E também já comecei a brincar com os comandos HTML, tá ficando bem legal. Muito obrigado.

Vou te encher o saco com mais uma pergunta: como fazer para alterar a cor de fundo da tela em PHP? Tentei usar o comando HTML style, mas não funcionou (e também não deu nenhum erro).

combobox no PHP

MensagemEnviado: 15 Abr 2014 08:49
por Toledo
cjp escreveu:como fazer para alterar a cor de fundo da tela em PHP?

Bom, na verdade a definição da cor de fundo é feito em código HTML, usando o atributo bgcolor da tag body:
http://www.w3schools.com/tags/att_body_bgcolor.asp

Então basta procurar a tag body no seu código e incluir o atributo bgcolor, por exemplo cor de fundo vermelha:
<body bgcolor="#ff0000">

Mais cores, veja:
http://www.color-hex.com

Abraços,