Clipper On Line • Ver Tópico - passar item da base como referência em PHP
Página 1 de 2

passar item da base como referência em PHP

MensagemEnviado: 20 Mai 2014 23:20
por cjp
Colegas,

Estou tentando fazer uma função simples em PHP, em que o usuário vai clicar em um dos itens listados da base de dados, abrindo uma nova tela com detalhes sobre o registro da base escolhido pelo usuário.

Fiz, em princípio, um primeiro PHP, que lista os itens da base para o usuário escolher, assim:

<html>
<head>
  <title>Consulta</title>
</head>
<body>
<?php
$txtArquivo = "COMPRAS.DBF";
$txtCampo = "PRODUTO";
$txtPesquisa = ($_POST["filtro3"]);

$dsn = "DRIVER={Microsoft dBase Driver (*.dbf)};DBQ=".dirname($_SERVER['SCRIPT_FILENAME'])."/meusarq/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);
   if ($i==1)
      {echo "<td><a href='dproduto.php' target='_top'>".$compname."</a></td>";}
   else
      {echo "<td>$compname</td>";}
  }
  echo "</tr>";
}
echo "</table>";
odbc_close($conn);
?>
</body>
</html>


Até aqui tá tudo certo.

O segundo PHP, que vai exibir os detalhes do item escolhido, está assim:

<html>
<head>
<title>Detalhes do produto</title>
</head>
<body>

<?php
$dsn = "DRIVER={Microsoft dBase Driver (*.dbf)};DBQ=".dirname($_SERVER['SCRIPT_FILENAME'])."/meusarq/agenda/;";
$conn= odbc_connect($dsn,"","");
$r= 6;
if(!$conn)
{ exit("conexao falhou: ".odbc_errormsg()); }
$sql="SELECT * FROM COMPRAS";
$rs=odbc_exec($conn,$sql);
if (!$rs)
{exit("Error in SQL");}

while( false !== ( $Row = @odbc_fetch_array( $rs ) ) ) {
}
odbc_fetch_row($rs,$r);
$prd = odbc_result($rs,"produto");
$prm = odbc_result($rs,"prmaximo");

echo '<br>';
echo '<br>';
echo '<p>';
echo '<strong>'."Produto: ".'</strong>';
echo '<font face="arial" color="red" size="21">'.$prd.'</font>';
echo '<br>';
echo '<p>';
echo '<p>';
echo "Preço máximo: ";
echo $prm;
odbc_close($conn);
?>
</body>
</html>


Ainda vou aprimorar estes PHPs. Mas o que estou precisando agora é passar para o segundo PHP o item da base escolhido pelo usuário no primeiro.

Onde coloquei $r=6, na linha 10 do segundo PHP, eu queria colocar algo como $r=nr do item escolhido.

Imaginei que isso poderia ser obtido por alguma cláusula da tag <a href>, mas não achei nada assim pesquisando.

Alguém sabe me dizer como fazer isso?

passar item da base como referência em PHP

MensagemEnviado: 21 Mai 2014 07:56
por Toledo
Pelo que pude observar, nos dois arquivos PHP você está consultado o mesmo arquivo DBF: COMPRAS.DBF

Bom, se for isto mesmo, então você pode fazer o seguinte:

- No primeiro arquivo PHP:

Procure por:
while (odbc_fetch_row($rs))
{

Troque por:
$id=0;
while (odbc_fetch_row($rs))
{
$id++;

Procure por:
{echo "<td><a href='dproduto.php' target='_top'>".$compname."</a></td>";}

Troque por:
{echo "<td><a href='dproduto.php?id=".$id."' target='_top'>".$compname."</a></td>";}


- No segundo arquivo PHP:

Procure por:
$r= 6;

Troque por:
$r= $_GET['id'];


Abraços,

passar item da base como referência em PHP

MensagemEnviado: 21 Mai 2014 17:04
por cjp
Funcionou, obrigado.

Mas ainda tenho um problema: como no primeiro PHP, a lista dos campos da base está filtrada (não estão listados todos os campos), ao passar o $id para o segundo PHP, ele passa o número na lista filtrada. Daí o segundo PHP vai procurar por esse número na base não filtrada, e não bate o mesmo registro.

Tentei retirar o filtro do segundo PHP, pensando que supostamente ficaria mantido o primeiro, mas não deu certo (dá erro).

Também tentei refazer o filtro no segundo PHP exatamente igual ao do primeiro, mas também não deu certo.

E, por fim, tentei substituir o $id pelo próprio nome do produto, mas daí a consulta fica em branco. Imaginei que isso pudesse ser por causa de espaços em branco. Tentei usar a trim(), mas também ficou em branco.

Como posso resolver isso?

passar item da base como referência em PHP

MensagemEnviado: 25 Mai 2014 12:20
por Toledo
cjp escreveu:Mas ainda tenho um problema: como no primeiro PHP, a lista dos campos da base está filtrada (não estão listados todos os campos), ao passar o $id para o segundo PHP, ele passa o número na lista filtrada. Daí o segundo PHP vai procurar por esse número na base não filtrada, e não bate o mesmo registro.

Bom, neste caso então você teria que passar no $id um campo do banco de dados ou algo do tipo recno(), que seja único para depois possa ser possível fazer um filtro com este dado.

cjp escreveu:tentei substituir o $id pelo próprio nome do produto, mas daí a consulta fica em branco.

Mas neste caso não pode ocorrer de ter mais de um produto com o mesmo nome? Não existe no bando de dados (tabela) um campo tipo código do produto, algo que seja único?
Para campos que pode conter caracteres especiais, que é o caso do nome do produto, para passar como referência em uma URL, você terá que usar a função urlencode() para codificar o conteúdo do campo. Depois, no segundo PHP, decodificar a variável ($r) com a função urldecode().

Abraços,

passar item da base como referência em PHP

MensagemEnviado: 06 Jun 2014 00:51
por cjp
O nome do produto é único sim na base.

Fiz algumas modificações no primeiro PHP, incorporando o que estava no segundo. Ficou assim:

<html>
<head>
  <title>Consulta</title>
</head>
<body>
<?php
$txtArquivo = "COMPRAS.DBF";
$txtCampo = "PRODUTO";
$int = "INTERVALO";
$txtP1 = ($_POST["filtro3"]);
$txtP2 = strtoupper($txtP1);
$txtP3 = strtolower($txtP1);
$txtP4 = ucfirst($txtP1);
$dsn = "DRIVER={Microsoft dBase Driver (*.dbf)};DBQ=".dirname($_SERVER['SCRIPT_FILENAME'])."/meusarq/agenda/;";
$conn= odbc_connect($dsn,"","");
if(!$conn)
{ exit("conexao falhou: ".odbc_errormsg()); }
$sql="SELECT * FROM ".$txtArquivo." WHERE ".$int.">0 and (".$txtCampo." LIKE '%".$txtP1."%' OR ".$txtCampo." LIKE '%".$txtP2."%' OR ".$txtCampo." LIKE '%".$txtP3."%' OR ".$txtCampo." LIKE '%".$txtP4."%')";
$rs=odbc_exec($conn,$sql);
if (!$rs)
{exit("Error in SQL");}

$i = 0;
$fieldCount = odbc_num_fields($rs);

echo "Resultado da pesquisa:";
$tid=produto;
while (odbc_fetch_row($rs))
{
  echo "<tr>";
  $i = 0;
  while ($i < $fieldCount)
  {
   $i++;
   $fieldName = odbc_field_name($rs, $i);
   $compname=odbc_result($rs,$fieldName);
   $compname2=trim($compname);
   if ($i==1)
      {echo '<br>';
     echo '<br>';
     echo "<td>$compname2</td>";}
   elseif ($i==51)
      {echo '<br>';
     echo "Preço máximo: "."<td>$compname2</td>";}
  }
  echo '<br>';
  echo "<table align='center' border='0' cellpadding='0' cellspacing='0' width='49%'>";
  echo "<form action='dproduto.php?id=".urlencode($tid)."' method='post'>";
  echo "<input size='35' type='number' name='preco' id='preco' value='Digite aqui o preço do produto' onfocus='this.value = '';' onblur='if (this.value == '') {this.value = 'Digite aqui parte o preço do produto';}'>";
  echo "   <input size='38' name='submit' type='submit' id='Confirmar' value='Confirmar'>";
  echo "</tr>";
  echo "</table>";
  echo "</form>";
}
odbc_close($conn);
?>
</body>
</html>


Até aqui parece tudo correto.

O segundo PHP, que ainda vou alterar para dar prosseguimento ao que quero, precisa pegar o produto escolhido e o preço digitado. Por enquanto, está assim:

<html>
<head>
<title>Detalhes do produto</title>
</head>
<body>

<?php
$dsn = "DRIVER={Microsoft dBase Driver (*.dbf)};DBQ=".dirname($_SERVER['SCRIPT_FILENAME'])."/meusarq/agenda/;";
$conn= odbc_connect($dsn,"","");
$r= $_GET['urldecode(id)'];
if(!$conn)
{ exit("conexao falhou: ".odbc_errormsg()); }
$sql="SELECT * FROM COMPRAS";
$rs=odbc_exec($conn,$sql);
if (!$rs)
{exit("Error in SQL");}

while( false !== ( $Row = @odbc_fetch_array( $rs ) ) ) {
}
odbc_fetch_row($rs,$r);
$prd = odbc_result($rs,"produto");
$prm = odbc_result($rs,"prmaximo");

echo '<br>';
echo '<br>';
echo '<p>';
echo '<strong>'."Produto: ".'</strong>';
echo '<font face="arial" color="red" size="21">'.$prd.'</font>';
echo '<br>';
echo '<p>';
echo '<p>';
echo "Preço máximo: ";
echo $prm;
odbc_close($conn);
?>
</body>
</html>


A passagem do nome do produto não está funcionando, e não sei como passar os dois argumentos ao mesmo tempo. Peço sua ajuda.

passar item da base como referência em PHP

MensagemEnviado: 06 Jun 2014 08:54
por Toledo
Inácio, acho que fica mais fácil você incluir neste seu arquivo DBF um campo tipo código ou recno, onde você vai gravar um código único sequencial para cada registro. Ai depois é só passar este código único por referência no PHP, no lugar do nome do produto.

cjp escreveu:e não sei como passar os dois argumentos ao mesmo tempo

Você pode passar quantas variáveis quiser, basta separar cada uma com & (e comercial), por exemplo:
echo "<form action='dproduto.php?id=".urlencode($tid)."&id2=".urlencode($tid2)."' method='post'>";

Depois no segundo PHP você pega as variáveis:
$r= urldecode($_GET['id']);
$r2= urldecode($_GET['id2']);


Abraços,

passar item da base como referência em PHP

MensagemEnviado: 07 Jun 2014 00:03
por cjp
Acresci o campo "código" na base, colocando nele o número da linha (recno()).

Não está funcionando, e creio que seja porque não estou conseguindo definir corretamente a variável. O primeiro PHP está assim:

<html>
<head>
  <title>Consulta</title>
</head>
<body>
<?php
$txtArquivo = "COMPRAS.DBF";
$txtCampo = "PRODUTO";
$int = "INTERVALO";
$txtP1 = ($_POST["filtro3"]);
$txtP2 = strtoupper($txtP1);
$txtP3 = strtolower($txtP1);
$txtP4 = ucfirst($txtP1);
$dsn = "DRIVER={Microsoft dBase Driver (*.dbf)};DBQ=".dirname($_SERVER['SCRIPT_FILENAME'])."/meusarq/agenda/;";
$conn= odbc_connect($dsn,"","");
if(!$conn)
{ exit("conexao falhou: ".odbc_errormsg()); }
$sql="SELECT * FROM ".$txtArquivo." WHERE ".$int.">0 and (".$txtCampo." LIKE '%".$txtP1."%' OR ".$txtCampo." LIKE '%".$txtP2."%' OR ".$txtCampo." LIKE '%".$txtP3."%' OR ".$txtCampo." LIKE '%".$txtP4."%')";
$rs=odbc_exec($conn,$sql);
if (!$rs)
{exit("Error in SQL");}

$i = 0;
$fieldCount = odbc_num_fields($rs);

echo "Resultado da pesquisa:";
$tid=codigo;
$tid2=preco;
while (odbc_fetch_row($rs))
{
  echo "<tr>";
  $i = 0;
  while ($i < $fieldCount)
  {
   $i++;
   $fieldName = odbc_field_name($rs, $i);
   $compname=odbc_result($rs,$fieldName);
   $compname2=trim($compname);
   if ($i==1)
      {echo '<br>';
     echo '<br>';
     echo "<td>$compname2</td>";}
   elseif ($i==51)
      {echo '<br>';
     echo "Preço máximo: "."<td>$compname2</td>";}
  }
  echo '<br>';
  echo "<table align='center' border='0' cellpadding='0' cellspacing='0' width='49%'>";
  echo "<form action='dproduto.php?id=".($tid)."&id2=".($tid2)."' method='post'>";
  echo "<input size='35' type='number' name='preco' id='preco' value='Digite aqui o preço do produto' onfocus='this.value = '';' onblur='if (this.value == '') {this.value = 'Digite aqui parte o preço do produto';}'>";
  echo "   <input size='38' name='submit' type='submit' id='Confirmar' value='Confirmar'>";
  echo "</tr>";
  echo "</table>";
  echo "</form>";
}
odbc_close($conn);
?>
</body>
</html>


Tirei o urlencode porque os campos não têm mais caracteres especiais, já que o são numéricos.

Veja que defini as variáveis $tid e $tid2 como codigo e preco, respectivamente. A primeira é agora um campo da base, mas a segunda não; é (ou era pra ser) o valor digitado pelo usuário no combobox. Acho que não fiz isso certo, mas não sei como fazer.

Mas nem mesmo a primeira, que é um campo da base, está dando certo.

O segundo PHP, por enquanto, está assim:

<html>
<head>
<title>Detalhes do produto</title>
</head>
<body>

<?php
$dsn = "DRIVER={Microsoft dBase Driver (*.dbf)};DBQ=".dirname($_SERVER['SCRIPT_FILENAME'])."/meusarq/agenda/;";
$conn= odbc_connect($dsn,"","");
$r= $_GET['id'];
$r2= $_GET['id2'];
echo "Teste1";
echo "Código: ".$r;
echo "Preço: ".$r2;
if(!$conn)
{ exit("conexao falhou: ".odbc_errormsg()); }
$sql="SELECT * FROM COMPRAS WHERE CODIGO=".$r;
$rs=odbc_exec($conn,$sql);
if (!$rs)
{exit("Error in SQL");}

while( false !== ( $Row = @odbc_fetch_array( $rs ) ) ) {
}
odbc_fetch_row($rs,$r);
$prd = odbc_result($rs,"produto");
$prm = odbc_result($rs,"prmaximo");

echo '<br>';
echo '<br>';
echo '<p>';
echo "Teste2";
echo "Código: ".$r;
echo "Produto: ".$prd;
echo "Preço: ".$r2;
odbc_close($conn);
?>
</body>
</html>


O resultado tem sido invariavelmente este:

Teste1Código: codigoPreço: preco

Teste2Código: codigoProduto: Preço: preco


Então, ele não está resultando nem o conteúdo da base, nem o valor digitado pelo usuário.

Como resolvo isso?

passar item da base como referência em PHP

MensagemEnviado: 07 Jun 2014 08:21
por Toledo
cjp escreveu:$tid=codigo;
$tid2=preco;

Inácio, nós já sabemos que o tratamento de campos de um DBF em PHP não é a mesma coisa como fazemos com o Harbour ou Clipper.

cjp escreveu:$compname=odbc_result($rs,$fieldName);

A maneira correta é usando a função odbc_result(), leia o manual.

cjp escreveu:mas a segunda não; é (ou era pra ser) o valor digitado pelo usuário no combobox.

Quando você quer recuperar o valor de algum campo de um formulário, que é o caso do preço digitado pelo usuário, você tem que ver qual o método usado no formulário (Form):
cjp escreveu:echo "<form action='dproduto.php?id=".($tid)."&id2=".($tid2)."' method='post'>";

O método post é diferente da passagem de variáveis usando uma URL (método GET), então a recuperação no segundo PHP tem que ser o seguinte:
$r2= $_POST['preco'];

Então, neste caso, não precisa passar a segunda variável na URL do form ("&id2=".($tid2).).

Abraços,

passar item da base como referência em PHP

MensagemEnviado: 07 Jun 2014 12:29
por cjp
Mas não é com o odbc_result que eu estou fazendo?

Sei que o Teste1 deve estar errado, porque não tem o odbc_result. Mas o Teste2 não deveria dar certo?

E o preço não tem como fazer odbc_result, porque ele não é campo da base.

Mudei para o post, mas ainda não funcionou. O código está retornando sempre 1000, que é o último código da base. Será que é porque o combobox está dentro de um while?

O primeiro PHP ficou assim:

<html>
<head>
  <title>Consulta</title>
</head>
<body>
<?php
$txtArquivo = "COMPRAS.DBF";
$txtCampo = "PRODUTO";
$int = "INTERVALO";
$txtP1 = ($_POST["filtro3"]);
$txtP2 = strtoupper($txtP1);
$txtP3 = strtolower($txtP1);
$txtP4 = ucfirst($txtP1);
$dsn = "DRIVER={Microsoft dBase Driver (*.dbf)};DBQ=".dirname($_SERVER['SCRIPT_FILENAME'])."/meusarq/agenda/;";
$conn= odbc_connect($dsn,"","");
if(!$conn)
{ exit("conexao falhou: ".odbc_errormsg()); }
$sql="SELECT * FROM ".$txtArquivo." WHERE ".$int.">0 and (".$txtCampo." LIKE '%".$txtP1."%' OR ".$txtCampo." LIKE '%".$txtP2."%' OR ".$txtCampo." LIKE '%".$txtP3."%' OR ".$txtCampo." LIKE '%".$txtP4."%')";
$rs=odbc_exec($conn,$sql);
if (!$rs)
{exit("Error in SQL");}

$i = 0;
$fieldCount = odbc_num_fields($rs);

echo "Resultado da pesquisa:";
$tid=codigo;
while (odbc_fetch_row($rs))
{
  echo "<tr>";
  $i = 0;
  while ($i < $fieldCount)
  {
   $i++;
   $fieldName = odbc_field_name($rs, $i);
   $compname=odbc_result($rs,$fieldName);
   $compname2=trim($compname);
   if ($i==1)
      {echo '<br>';
     echo '<br>';
     echo "<td>$compname2</td>";}
   elseif ($i==51)
      {echo '<br>';
     echo "Preço máximo: "."<td>$compname2</td>";}
  }
  echo '<br>';
  echo "<table align='center' border='0' cellpadding='0' cellspacing='0' width='49%'>";
  echo "<form action='dproduto.php?id=".($tid)."' method='post'>";
  echo "<input size='35' type='number' name='preco' id='preco' value='Digite aqui o preço do produto' onfocus='this.value = 'Digite o preço';' onblur='if (this.value == '') {this.value = 'Digite aqui o preço do produto';}'>";
  echo "   <input size='38' name='submit' type='submit' id='Confirmar' value='Confirmar'>";
  echo "</tr>";
  echo "</table>";
  echo "</form>";
}
odbc_close($conn);
?>
</body>
</html>


E o segundo assim:

<html>
<head>
<title>Detalhes do produto</title>
</head>
<body>

<?php
$dsn = "DRIVER={Microsoft dBase Driver (*.dbf)};DBQ=".dirname($_SERVER['SCRIPT_FILENAME'])."/meusarq/agenda/;";
$conn= odbc_connect($dsn,"","");
$r= $_GET['id'];
$r2= $_post['preco'];
echo "Teste1";
echo "Código: ".$r;
echo "Preço: ".$r2;
if(!$conn)
{ exit("conexao falhou: ".odbc_errormsg()); }
$sql="SELECT * FROM COMPRAS WHERE CODIGO=".$r;
$rs=odbc_exec($conn,$sql);
if (!$rs)
{exit("Error in SQL");}

while( false !== ( $Row = @odbc_fetch_array( $rs ) ) ) {
}
odbc_fetch_row($rs,$r);
$cod = odbc_result($rs,"codigo");
$prd = odbc_result($rs,"produto");
$prm = odbc_result($rs,"prmaximo");

echo '<br>';
echo '<br>';
echo '<p>';
echo "Teste2";
echo "Código: ".$cod;
echo "Produto: ".$prd;
echo "Preço: ".$r2;
odbc_close($conn);
?>
</body>
</html>


Está retornando assim:

Teste1Código: codigoPreço: 

Teste2Código: 1000.0Produto: Preço:

passar item da base como referência em PHP

MensagemEnviado: 08 Jun 2014 18:10
por Toledo
cjp escreveu:Mas não é com o odbc_result que eu estou fazendo?

O que eu quis dizer foi que não está certo este código $tid=codigo;, o correto é usar a função odbc_result(). Então se você entrar no link que lhe passei sobre a odbc_result(), nesta função você tem que passar dois parâmetros, o primeiro (result_id) que é o retorno da função odbc_exec(), no seu código seria a variável $rs. Já o segundo parâmetro (field), diz o seguinte:
field pode ser um inteiro contendo o número da coluna que você quer; ou pode ser uma string contendo o nome do campo.

Então tá bem claro, você deve informar o número da posição do campo CODIGO na estrutura da tabela no banco de dados ou o nome do campo CODIGO, por exemplo:

$tid=odbc_result($rs,'codigo');


Então, acho que estou deixando bem claro que $tid=codigo; não vai dar certo e o correto é $tid=odbc_result($rs,'codigo');.

cjp escreveu:Mudei para o post, mas ainda não funcionou.

Pode confiar, o certo realmente é $r2= $_POST['preco'];, mas olhando o seu primeiro PHP, observei o seguinte:

1 - na linha 30 você está usando o comando tr (echo "<tr>";), mas você só vai poder usar este comando se antes você abrir alguma tabela (<table>).
2 - na linha 52 você criou um form, então como seu código está com a estrutura da tabela quebrada, não entendi se a cada linha de um produto vai aparecer um campo (não é combobox como você diz, combobox é outra coisa) para digitar o preço e com um botão Confirma, quer dizer, vai ter para cada produto um campo de preço e um botão confirma, ou se o campo preço e o botão confirma vai aparecer apenas uma vez no final da página.

Então a primeira coisa é acerta a estrutura da tabela, e depois se o campo preço e o botão Confirma aparecer várias vezes para cada um dos produtos, neste caso o nome de cada um dos botões "Confirma" (name='submit') tem que ser diferentes, não pode ser submit para todos, coloque algo tipo submit1, submit2, etc.

Outro detalhe é o nome do campo preço, se vai dar certo deixar o mesmo nome para vários produtos, isto é, se o campo preço aparecer várias vezes. Ai é só fazendo um teste, mas eu acho que pode dar certo, somente o nome do botão que não pode repetir.

Agora outro detalhe é saber de que tipo é o campo CODIGO no banco de dados, se é numérico ou texto (alfanumérico). Se for texto, alfanumérico, então no segundo PHP no comando SELECT você tem que usar:

$sql="SELECT * FROM COMPRAS WHERE CODIGO='".$r."'"; 


Inácio, vou ser sincero com você, sem conhecimentos intermediário (o ideal seria avançado) de HTML, PHP e MySQL, você vai ter que batalhar bastante.

Lembrando, não tenho experiência nenhuma com DBF em PHP, vou observando o que acho que está errado.

Abraços,

passar item da base como referência em PHP

MensagemEnviado: 17 Jun 2014 01:07
por cjp
Sigo batalhando, caro Toledo.

Vi realmente que, do jeito que estava fazendo, não iria funcionar mesmo.

Mudei e funcionou até certo ponto.

Agora estou com um problema apenas para cadastrar na base de dados o preço digitado pelo usuário.

Sei que DBF em PHP não é tua praia, como vc mesmo disse, mas certamente vc sabe muito mais que eu.

Meu primeiro PHP está assim:

<html>
<head>
  <title>Consulta</title>
</head>
<body>
<?php
$txtArquivo = "COMPRAS.DBF";
$txtCampo = "PRODUTO";
$int = "INTERVALO";
$txtP1 = ($_POST["filtro3"]);
$txtP2 = strtoupper($txtP1);
$txtP3 = strtolower($txtP1);
$txtP4 = ucfirst($txtP1);
$dsn = "DRIVER={Microsoft dBase Driver (*.dbf)};DBQ=".dirname($_SERVER['SCRIPT_FILENAME'])."/meusarq/agenda/;";
$conn= odbc_connect($dsn,"","");
if(!$conn)
{ exit("conexao falhou: ".odbc_errormsg()); }
$sql="SELECT * FROM ".$txtArquivo." WHERE ".$int.">0 and (".$txtCampo." LIKE '%".$txtP1."%' OR ".$txtCampo." LIKE '%".$txtP2."%' OR ".$txtCampo." LIKE '%".$txtP3."%' OR ".$txtCampo." LIKE '%".$txtP4."%')";
$rs=odbc_exec($conn,$sql);
if (!$rs)
{exit("Error in SQL");}

$i = 0;
$fieldCount = odbc_num_fields($rs);

echo "Resultado da pesquisa:";
echo '<br>';
$tid=odbc_result($rs,'codigo');
while (odbc_fetch_row($rs))
{
  echo "<tr>";
  $i = 0;
  while ($i < $fieldCount)
  {
   $i++;
   $fieldName = odbc_field_name($rs, $i);
   $compname=odbc_result($rs,$fieldName);
   $compname2=trim($compname);
   $tid=odbc_result($rs,'codigo');
   if ($i==1)
     {echo '<br>';
     echo "<td><a href='dproduto.php?id=".($tid)."' target='_top'>".$compname2."</a></td>";}
   elseif ($i==51)
      {echo '<br>';
     echo "Preço máximo: "."<td>$compname2</td>";}
  }
echo '<br>';
}
odbc_close($conn);
?>
</body>
</html>


O segundo está assim:

<html>
<head>
<title>Detalhes do produto</title>
</head>
<body>

<?php
$dsn = "DRIVER={Microsoft dBase Driver (*.dbf)};DBQ=".dirname($_SERVER['SCRIPT_FILENAME'])."/meusarq/agenda/;";
$conn= odbc_connect($dsn,"","");
$r= $_GET['id'];
if(!$conn)
{ exit("conexao falhou: ".odbc_errormsg()); }
$sql="SELECT * FROM COMPRAS WHERE CODIGO=".$r;
$rs=odbc_exec($conn,$sql);
if (!$rs)
{exit("Error in SQL");}

while( false !== ( $Row = @odbc_fetch_array( $rs ) ) ) {
}
odbc_fetch_row($rs,$r);
$cod = odbc_result($rs,"codigo");
$prd = odbc_result($rs,"produto");
$prm = odbc_result($rs,"prmaximo");

echo '<br>';
echo '<br>';
echo '<p>';
echo "Produto: ".$prd;
echo '<br>';
echo '<br>';
echo "Preço máximo: ".$prm;
echo '<br>';
echo '<br>';
echo "Anote o preço: ".$r2;
echo '<br>';
  echo '<br>';
  echo "<table align='center' border='0' cellpadding='0' cellspacing='0' width='49%'>";
  echo "<form action='cadprec.php?id=".($tid)."' method='post'>";
  echo "<input size='35' type='number' name='preco' id='preco' value='Digite aqui o preço do produto' onfocus='this.value = 'Digite o preço';' onblur='if (this.value == '') {this.value = 'Digite aqui o preço do produto';}'>";
  echo "   <input size='38' name='submit' type='submit' id='Confirmar' value='Confirmar'>";
  echo "</tr>";
  echo "</table>";
  echo "</form>";

odbc_close($conn);
?>
</body>
</html>


Até aqui tá funcionando perfeitamente.

O terceiro está assim:

<html>
<head>
  <title>Cadastrando preço</title>
</head>
<body>
<?php
$reg= $_GET['id'];
$prec= $_GET['tid'];
$dsn = "DRIVER={Microsoft dBase Driver (*.dbf)};DBQ=".dirname($_SERVER['SCRIPT_FILENAME'])."/meusarq/agenda/;";
$conn= odbc_connect($dsn,"","");
if(!$conn)
{ exit("conexao falhou: ".odbc_errormsg()); }
else

echo "Registro: ".$reg;
echo '<br>';
echo "Preço digitado: ".$prec;
echo '<br>';

$sql="SELECT * FROM COMPRAS WHERE CODIGO=".$reg;
$rs=odbc_exec($conn,$sql);
if (!$rs)
{exit("Error in SQL");}

while( false !== ( $Row = @odbc_fetch_array( $rs ) ) ) {
}
odbc_fetch_row($rs,$reg);
$cod = odbc_result($rs,"codigo");

$db = dbase_open("meusarq/agenda/compras.dbf", 2);
$registro = dbase_get_record_with_names($db, $cod);

echo '<br>';
echo "Código: ".$cod;
echo "Registro: ".$registro;

print "data : ".$registro[data];
// ";
echo '<br>';
print "produto : ".$registro[produto];
//";
echo '<br>';
print "preço máximo : ".$registro[prmaximo];
//";
echo '<br>';

dbase_close($db);

?>



Já verifiquei com o echo $reg que está passando corretamente o código do produto selecionado.

O problema mesmo é alterar o registro da base. Para isso, estou usando a sugestão do Rochinha neste post: viewtopic.php?f=28&t=12863.

Primeiro problema: os prints estão retornando vazios, como se nada tivesse na base, o que não é verdade. Não sei se está correta a forma como estou pegando os dados, mas me parece que sim. Mas até menos mal, pois o que eu quero mesmo não é isso.

O segundo problema, principal: como colocar o preço digitado pelo usuário na base.

Não sei porque o $tid não está sendo passado corretamente do segundo para o terceiro php. E, portanto, o $prec está vazio. Creio que estou fazendo algo errado aqui, mas ainda não consegui identificar o que.

Além disso, tem o problema da alteração mesma do registro na base. Em Harbour, seria fácil dar um replace campo_tal with $prec. Mas, pelo que consta no post do Rochinha, a forma de fazer isso em PHP seria: if (!dbase_replace_record($db, $registro, 2)) ;

Pra isso, eu teria que ter em $registro todos os dados do registro inteiro, não apenas de um campo, embora eu queira alterar apenas um campo. E justamente nesta base, que tem mais de 20 campos, complica um pouco.

Teria como eu pegar para o $registro todos os dados que já estão na base, alterar apenas o campo que eu quero, e recolocar? O post do Rochinha indica que dbase_get_record() pegaria os dados, mas eu não saberia como alterar a array antes de recolocá-la.

Help me, please.

passar item da base como referência em PHP

MensagemEnviado: 17 Jun 2014 09:37
por Toledo
cjp escreveu:Não sei porque o $tid não está sendo passado corretamente do segundo para o terceiro php.

Inácio, no seu segundo PHP a variável $tid não existe, em lugar nenhum do segundo PHP você está declarando esta variável. Ela existe no primeiro PHP, mas no segundo não.
No segundo PHP existe duas variáveis que tem o código do produto, que você pode usar no lugar da $tid, são as variáveis $r e $cod.

cjp escreveu:Teria como eu pegar para o $registro todos os dados que já estão na base,...

Inácio, igual a você, eu também não entendo nadinha de manutenção de registros de DBF com PHP, mas uma coisa que eu sempre procuro fazer quando estou num campo desconhecido é procurar exemplos e descobrir o que cada função faz.
No seu terceiro PHP, você está usando a seguinte função:
$registro = dbase_get_record_with_names($db, $cod);

Então vamos tentar entender o que esta função faz?
Na página oficial do PHP tem tudo o que precisamos, então veja:
http://www.php.net/manual/en/function.dbase-get-record-with-names.php
Tá em inglês, mas dá para entender que está função já faz o que você quer, ela retorna em um array o conteúdo de todos os campos do DBF.

A única coisa que me deixou em dúvida é como passar o valor correto no segundo parâmetros desta função, que é o número do registro (não o código do produto) no arquivo DBF. No seu código acima você está passando $cod que é o código do produto, então acho que isto pode não retornar o registro correto, principalmente se no DBF os códigos não estiverem em sequência, ou pular algum código quando foi feito o cadastros dos produtos.
cjp escreveu:... alterar apenas o campo que eu quero, e recolocar?

Bom, para gravar o registro você terá que usar a função dbase_replace_record(), então vamos ao manual do PHP novamente:
http://php.net/manual/en/function.dbase-replace-record.php
O primeiro parâmetro tá fácil, é o retorno da função dbase_open(), que você já está usando no seu terceiro PHP.
O segundo parâmetro também está fácil, é o retorno da função dbase_get_record_with_names().
O terceiro parâmetro é o que fiquei em dúvida de como passar o valor correto.

Bom, então o conteúdo dos campos que será gravado está no segundo parâmetro, que é um array. Então, basta modificar o conteúdo da array antes de usar a função dbase_replace_record(), por exemplo:
$registro['preco'] = $prec;


Agora uma observação:

No seu terceiro PHP tem o seguinte código:
$prec= $_GET['tid'];

Acho que você está tentando pegar o valor do preço que foi digitado pelo usuário no segundo PHP, então vamos relembrar o que eu já disse aqui neste tópico.
Toledo escreveu:Quando você quer recuperar o valor de algum campo de um formulário, que é o caso do preço digitado pelo usuário, você tem que ver qual o método usado no formulário (Form):

cjp escreveu echo "<form action='dproduto.php?id=".($tid)."&id2=".($tid2)."' method='post'>";

O método post é diferente da passagem de variáveis usando uma URL (método GET), então a recuperação no segundo PHP tem que ser o seguinte:

$r2= $_POST['preco'];

Então, troque $prec= $_GET['tid']; por $prec= $_POST['preco'];

Abraços,

passar item da base como referência em PHP

MensagemEnviado: 17 Jun 2014 14:08
por cjp
Acertei e funcionou.

Quanto ao parâmetro, não tem problema, pois o campo código corresponde exatamente ao número do registro. Então, $cod é o número do código, campo da base, mas é também o número do registro na base.

Mas ainda estou com os seguintes problemas:

1) Está retornando vazio nos conteúdos de $registro[data], $registro[produto] e $registro[prmaximo], não entendo por que, pois testei que está abrindo a base.

2) O maior problema que eu não sei como resolver é como alterar a array $registro para colocar o preço digitado pelo usuário, em substituição ao que estava na base.

3) Como faço para permitir números decimais no campo preço a ser digitado? Parece que o type 'number' não permite. Pesquisei no manual de HTML e não achei nenhuma opção.

4) A função dbase_replace_record() está retornando o seguinte erro:

PHP Warning:  dbase_replace_record() [<a href='function.dbase-replace-record'>function.dbase-replace-record</a>]: Wrong number of fields specified in C:\Inetpub\Wwwroot\inaciobr\cadprec.php on line 45


Vi no manual do PHP que

The number of items must be equal to the number of fields in the database, otherwise dbase_replace_record() will fail.


A questão é que $registro tem (ou deveria ter) justamente o número correto de campos, afinal, ela foi tirada justamente da base, e eu nem alterei nada (porque ainda não sei alterar).

A não ser que a $registro = dbase_get_record_with_names($db, $cod) esteja dando algum erro, mas eu não consigo verificar isso. Só consegui verificar que if ($db) está retornando true e que $cod retorna o número correto do campo da base.

Meu terceiro PHP está assim:

<html>
<head>
  <title>Cadastrando preço</title>
</head>
<body>
<?php
$reg= $_GET['id'];
$prec= $_POST['preco'];
$dsn = "DRIVER={Microsoft dBase Driver (*.dbf)};DBQ=".dirname($_SERVER['SCRIPT_FILENAME'])."/meusarq/agenda/;";
$conn= odbc_connect($dsn,"","");
if(!$conn)
{ exit("conexao falhou: ".odbc_errormsg()); }
else

echo "Registro: ".$reg;
echo '<br>';
echo "Preço digitado: ".$prec;
echo '<br>';

$sql="SELECT * FROM COMPRAS WHERE CODIGO=".$reg;
$rs=odbc_exec($conn,$sql);
if (!$rs)
{exit("Error in SQL");}

while( false !== ( $Row = @odbc_fetch_array( $rs ) ) ) {
}
odbc_fetch_row($rs,$reg);
$cod = odbc_result($rs,"codigo");

$db = dbase_open("meusarq/agenda/compras.dbf", 2);
if ($db)
    {$registro = dbase_get_record_with_names($db, $cod);}
else
    {echo "Não abriu a base";}

echo '<br>';

echo "data : ".$registro[data];
echo '<br>';
echo "produto : ".$registro[produto];
echo '<br>';
echo "preço máximo : ".$registro[prmaximo];
echo '<br>';

if (!dbase_replace_record($db, $registro, $cod))
{echo 'Não foi possível alterar registro no banco de dados';}

dbase_close($db);

?>

passar item da base como referência em PHP

MensagemEnviado: 17 Jun 2014 15:18
por Toledo
cjp escreveu:1) Está retornando vazio nos conteúdos de $registro[data], $registro[produto] e $registro[prmaximo], não entendo por que, pois testei que está abrindo a base.

Troque $registro[data], $registro[produto] e $registro[prmaximo] por $registro['data'], $registro['produto'] e $registro['prmaximo']

cjp escreveu:2) O maior problema que eu não sei como resolver é como alterar a array $registro para colocar o preço digitado pelo usuário, em substituição ao que estava na base.

Você tentou o que eu sugeri na minha mensagem anterior???
Toledo escreveu:Então, basta modificar o conteúdo da array antes de usar a função dbase_replace_record(), por exemplo:

$registro['preco'] = $prec;


cjp escreveu:3) Como faço para permitir números decimais no campo preço a ser digitado? Parece que o type 'number' não permite. Pesquisei no manual de HTML e não achei nenhuma opção.

Vou fazer um busca depois e passo o que achei.

cjp escreveu:4) A função dbase_replace_record() está retornando o seguinte erro:

Dê uma olhada no exemplo que está no link que passei na mensagem anterior sobre a função dbase_replace_record(). Lá fala alguma coisa sobre um campo deleted.

Abraços,

passar item da base como referência em PHP

MensagemEnviado: 18 Jun 2014 00:08
por cjp
1) Troquei mas não resolveu. Fico com a dúvida: será que $registro está em branco, ou se tem conteúdo que não está sendo exibido? Não tem uma forma de testar?

2) Fiz, mas não sei se funcionou; não sei como testar.

3) Ok.

4) Vi. Vc deve estar falando desta nota, né:

Note:
If you're using dbase_get_record() return value for this parameter, remember to reset the key named deleted.


Embora eu não esteja usando dbase_get_record(), e sim dbase_get_record_with_names(), e nesta não haja a mesma observação no manual, creio que a questão possa ser a mesma.

Pelo que eu entendi, a função pegaria para a array os campos da base, acrescendo o campo para indicar se o registro está ou não deletado. É isso? Neste caso, a array tem um campo a mais do que a base, e esse campo teria que ser excluído para ser recolocado na base. Estou correto?

Se eu estiver certo, a pergunta que resta é: como excluir esse campo? O manual diz "reset the key named deleted". Mas como resetar? Tentei fazer assim: $registro['deleted']="", mas não funcionou.

passar item da base como referência em PHP

MensagemEnviado: 18 Jun 2014 10:00
por Toledo
cjp escreveu:1) Troquei mas não resolveu. Fico com a dúvida: será que $registro está em branco, ou se tem conteúdo que não está sendo exibido? Não tem uma forma de testar?

Inácio, a única maneira é verificar o código para ver se você não fez nada errado. Então vamos analisar o seu código do terceiro PHP:
$sql="SELECT * FROM COMPRAS WHERE CODIGO=".$reg;

Aqui você está filtrando o registro do produto que tem o código igual ao que o usuário selecionou, então vai retornar APENAS um registro.

while( false !== ( $Row = @odbc_fetch_array( $rs ) ) ) {
}
odbc_fetch_row($rs,$reg);
$cod = odbc_result($rs,"codigo");

Não entendi porque você colocou este While.
Na função odbc_fetch_row($rs,$reg) vai retornar uma linha do resultado do filtro feito anteriormente, onde $rs é o retorno do filtro de APENAS um produto e $reg é o CÓDIGO do produto escolhido pelo usuário (este CÓDIGO pode ser de 1 a 1000).
Então, este último código que destaquei, só vai dar certo se o CÓDIGO do produto escolhido pelo usuário for igual a 1. Se for maior que 1 (de 2 a 1000) não vai retornar nada, então $cod vai ficar vazio.

Como resolver isto?

Como este código que destaquei não tá servindo para nada, então simplesmente excluir estas linhas e se na variável $reg já tem o código do produto escolhido pelo usuário, então alterar a linha $registro = dbase_get_record_with_names($db, $cod);, substituindo $cod por $reg.

cjp escreveu:Pelo que eu entendi, a função pegaria para a array os campos da base, acrescendo o campo para indicar se o registro está ou não deletado. É isso? Neste caso, a array tem um campo a mais do que a base, e esse campo teria que ser excluído para ser recolocado na base. Estou correto?

Exatamente, este campo tem que ser excluído. Como excluir??? Na minha mensagem anterior eu disse:
Toledo escreveu:Dê uma olhada no exemplo que está no link

Então era para olhar o exemplo mesmo que está no link:
http://php.net/manual/en/function.dbase-replace-record.php#example-1148
Veja o "remove the 'deleted' entry".

Sobre o campo do formulário para digitar o preço, tente o seguinte:
<input pattern="[0-9][0-9][0-9],[0-9][0-9]" name="preco" min="1" max="999" step="0.01" type="number">


Abraços,

Abraços,

passar item da base como referência em PHP

MensagemEnviado: 18 Jun 2014 23:24
por cjp
A inserção de decimais deu certo. Obrigado.

Mas o resto ainda não funcionou. Acho que fiz como vc mandou. Veja se está certo:

<html>
<head>
  <title>Cadastrando preço</title>
</head>
<body>
<?php
$reg= $_GET['id'];
$prec= $_POST['preco'];
$dsn = "DRIVER={Microsoft dBase Driver (*.dbf)};DBQ=".dirname($_SERVER['SCRIPT_FILENAME'])."/meusarq/agenda/;";
$conn= odbc_connect($dsn,"","");
if(!$conn)
{ exit("conexao falhou: ".odbc_errormsg()); }
else

echo "Registro: ".$reg;
echo '<br>';
echo "Preço digitado: ".$prec;
echo '<br>';

$sql="SELECT * FROM COMPRAS WHERE CODIGO=".$reg;
$rs=odbc_exec($conn,$sql);
if (!$rs)
{exit("Error in SQL");}

$db = dbase_open("meusarq/agenda/compras.dbf", 2);
if ($db)
    {$registro = dbase_get_record_with_names($db, $reg);}
else
    {echo "Não abriu a base";}

echo '<br>';

echo "data : ".$registro['data'];
echo '<br>';
echo "produto : ".$registro['produto'];
echo '<br>';
echo "preço máximo : ".$registro['prmaximo'];
echo '<br>';
$registro['prmercador']=$prec;
unset($registro['deleted']);


if (!dbase_replace_record($db, $registro, $cod))
{echo 'Não foi possível alterar registro no banco de dados';}

dbase_close($db);

?>


Ainda está dando erro na dbase_replace_record().

E, desabilitando essa função, ainda assim $registro['data'], $registro['produto'] e $registro['produto'] estão retornando vazio ainda.

passar item da base como referência em PHP

MensagemEnviado: 19 Jun 2014 08:34
por Toledo
Ok Inácio, então como lhe orientei na mensagem anterior, vamos analisar o seu código e tentar descobrir onde está o erro!

$sql="SELECT * FROM COMPRAS WHERE CODIGO=".$reg;
$rs=odbc_exec($conn,$sql);
if (!$rs)
{exit("Error in SQL");}

Estas linhas servem para que???? Não servem para NADA, então vamos excluir elas.

Agora vamos para o manual do PHP para ver o que faz e exemplos da função $db = dbase_open("meusarq/agenda/compras.dbf", 2);:
http://www.php.net/manual/en/function.dbase-open.php
De acordo com a descrição da função parece estar tudo certo, mas olhando o exemplo ($db = dbase_open('/tmp/test.dbf', 0);), tem uma barra no início do caminho para o banco de dados. Então por via das dúvidas, vamos colocar a barra no seu código também.

A próxima função usada no seu código é $registro = dbase_get_record_with_names($db, $reg);, mas antes vamos observar o resultado do código echo "Registro: ".$reg;. Você observou qual é o resultado do conteúdo da variável $reg???? Não sei dizer porque, mas tem um .0 no final do código. Acho que o PHP com DBF pensa que um campo numérico seja um valor com decimal.
Então, como nos exemplos da função dbase_get_record_with_names() o segundo parâmetros é um número inteiro, vamos corrigir então o valor da variável $reg:
Procure:
$reg= $_GET['id'];

e troque por:
$reg= str_replace(".0","",$_GET['id']);

Agora vamos analisar este código dbase_replace_record($db, $registro, $cod). Será que ele está certo????
Então, antes de ler as linhas seguintes, tente analisar o código acima e verificar se ele está certo!

Bom, mesmo com todas as correções que fizemos acima, com certeza este código dbase_replace_record($db, $registro, $cod) ainda iria apresentar uma mensagem de erro, mas sempre é bom também analisar as mensagens de erros, que geralmente dá uma dica do que pode estar errado.

A variável $cod não existe, troque por $reg.

Inácio, não tenho certeza se estas correções vão resolver, mas o caminho é este, sempre analisar linha por linha. Tudo o que lhe passei acima, eu descobri olhando o seu código linha a linha, lendo a descrição e olhando os exemplos de cada função.

Abraços,

passar item da base como referência em PHP

MensagemEnviado: 19 Jun 2014 13:26
por cjp
De fato, erro não está dando mais. Mas ainda estão vazios os $registro['...'].

O $reg continua com um .0 no final.

Fiquei com uma dúvida quanto à str_replace: no manual do PHP (http://www.php.net/manual/pt_BR/functio ... eplace.php), pelo que eu entendi, essa função não se aplicaria para campos numéricos, como é o caso do campo registro da minha base.

Minha função está assim:

<html>
<head>
  <title>Cadastrando preço</title>
</head>
<body>
<?php
$reg= str_replace(".0","",$_GET['id']);
$prec= $_POST['preco'];
$dsn = "DRIVER={Microsoft dBase Driver (*.dbf)};DBQ=".dirname($_SERVER['SCRIPT_FILENAME'])."/meusarq/agenda/;";
$conn= odbc_connect($dsn,"","");
if(!$conn)
{ exit("conexao falhou: ".odbc_errormsg()); }
else

echo "Registro: ".$reg;
echo '<br>';
echo "Preço digitado: ".$prec;
echo '<br>';

$db = dbase_open("/meusarq/agenda/compras.dbf", 2);
if ($db)
    {$registro = dbase_get_record_with_names($db, $reg);}
else
    {echo "Não abriu a base";}

echo '<br>';

echo "data : ".$registro['data'];
echo '<br>';
echo "produto : ".$registro['produto'];
echo '<br>';
echo "preço máximo : ".$registro['prmaximo'];
echo '<br>';
$registro['prmercador']=$prec;
unset($registro['deleted']);


if (!dbase_replace_record($db, $registro, $reg))
    {echo 'Não foi possível alterar registro no banco de dados';}

dbase_close($db);

?>


Analisei linha a linha. Não encontrei nenhum erro.

Facilitaria a análise se tivéssemos acesso ao conteúdo de $registro.

passar item da base como referência em PHP

MensagemEnviado: 19 Jun 2014 17:02
por Toledo
cjp escreveu:O $reg continua com um .0 no final.

cjp escreveu:pelo que eu entendi, essa função não se aplicaria para campos numéricos, como é o caso do campo registro da minha base.

Bom, na verdade não é um campo do seu banco de dados e sim uma variável (id) passada como parâmetro por URL (método GET), então ela vem como sendo tipo string. Neste caso, a função str_replace() deveria funcionar.

Foi bom você ter observado isto, pois se id vem como uma string, então $reg também vai ser uma string, mas nas funções dbase_get_record_with_names($db, $reg) e dbase_replace_record($db, $registro, $reg) o $reg teria que ser um número inteiro.

Então vamos fazer um pequeno teste, apenas para ver se $registro vai vir com algum conteúdo:

Neste seu terceiro PHP, troque $reg= str_replace(".0","",$_GET['id']); por $reg= 1;

Ai envia o PHP para o seu site e faça um teste.

Este teste é só para termos certeza que as funções dbase_ vão funcionar. Se $registro mostrar alguma coisa (os dados do produto 1), então o problema está realmente no tipo da variável $reg.

Abraços,

passar item da base como referência em PHP

MensagemEnviado: 20 Jun 2014 13:30
por cjp
Toledo, estranhamente, desde ontem, não estou mais conseguindo acessar a base de dados no FTP. Está dando o seguinte erro:

PHP Warning:  dbase_open() [<a href='function.dbase-open'>function.dbase-open</a>]: unable to open database /meusarq/agenda/COMPRAS.DBF in C:\Inetpub\Wwwroot\inaciobr\cadprec.php on line 21
PHP Warning:  dbase_replace_record() [<a href='function.dbase-replace-record'>function.dbase-replace-record</a>]: Unable to find database for identifier 0 in C:\Inetpub\Wwwroot\inaciobr\cadprec.php on line 39
PHP Warning:  dbase_close() [<a href='function.dbase-close'>function.dbase-close</a>]: Unable to find database for identifier 0 in C:\Inetpub\Wwwroot\inaciobr\cadprec.php on line 42


Já tentei com ou sem a tua última modificação (naturalmente não seria este o problema, mas fiz o teste apenas para confirmar).

Também já tentei colocar o nome da base com maiúsculas ou com minúsculas. No FTP está com tudo maiúscula.

Estava pensando se não facilitaria tudo se eu mudasse a base para MySQL. Vc acha que facilita? Só não consegui ainda fazer a conexão à base de dados MySQL via PHP (ainda não estudei o suficiente isso), mas creio que isso não seja difícil, né?

O único problema que estou vendo nisso é que em um dos meus usuários eu não tenho como instalar o ODBC. Então, pelo Harbour não funcionaria a conexão à base de dados, correto? Não tem mesmo nenhum jeito de funcionar sem o ODBC? Se realmente não tiver, o jeito será eu fazer novamente todo o programa em PHP, mas isso vai me demandar muito trabalho, muito estudo e muito tempo (além de muita encheção do teu saco).