Clipper On Line • Ver Tópico - passar item da base como referência em PHP

passar item da base como referência em PHP

Discussão sobre outras linguagens de programação.

Moderador: Moderadores

 

passar item da base como referência em PHP

Mensagempor cjp » 20 Mai 2014 23:20

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?
Inacio de Carvalho Neto
cjp
Usuário Nível 5

Usuário Nível 5
 
Mensagens: 1162
Data de registro: 19 Nov 2010 21:29
Cidade/Estado: paraná
Curtiu: 8 vezes
Mens.Curtidas: 12 vezes

passar item da base como referência em PHP

Mensagempor Toledo » 21 Mai 2014 07:56

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,
Toledo - Clipper On Line
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
Avatar de usuário

Toledo
Administrador

Administrador
 
Mensagens: 3076
Data de registro: 22 Jul 2003 18:39
Cidade/Estado: Araçatuba - SP
Curtiu: 251 vezes
Mens.Curtidas: 254 vezes

passar item da base como referência em PHP

Mensagempor cjp » 21 Mai 2014 17:04

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?
Inacio de Carvalho Neto
cjp
Usuário Nível 5

Usuário Nível 5
 
Mensagens: 1162
Data de registro: 19 Nov 2010 21:29
Cidade/Estado: paraná
Curtiu: 8 vezes
Mens.Curtidas: 12 vezes

passar item da base como referência em PHP

Mensagempor Toledo » 25 Mai 2014 12:20

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,
Toledo - Clipper On Line
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
Avatar de usuário

Toledo
Administrador

Administrador
 
Mensagens: 3076
Data de registro: 22 Jul 2003 18:39
Cidade/Estado: Araçatuba - SP
Curtiu: 251 vezes
Mens.Curtidas: 254 vezes

passar item da base como referência em PHP

Mensagempor cjp » 06 Jun 2014 00:51

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.
Inacio de Carvalho Neto
cjp
Usuário Nível 5

Usuário Nível 5
 
Mensagens: 1162
Data de registro: 19 Nov 2010 21:29
Cidade/Estado: paraná
Curtiu: 8 vezes
Mens.Curtidas: 12 vezes

passar item da base como referência em PHP

Mensagempor Toledo » 06 Jun 2014 08:54

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,
Toledo - Clipper On Line
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
Avatar de usuário

Toledo
Administrador

Administrador
 
Mensagens: 3076
Data de registro: 22 Jul 2003 18:39
Cidade/Estado: Araçatuba - SP
Curtiu: 251 vezes
Mens.Curtidas: 254 vezes

passar item da base como referência em PHP

Mensagempor cjp » 07 Jun 2014 00:03

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?
Inacio de Carvalho Neto
cjp
Usuário Nível 5

Usuário Nível 5
 
Mensagens: 1162
Data de registro: 19 Nov 2010 21:29
Cidade/Estado: paraná
Curtiu: 8 vezes
Mens.Curtidas: 12 vezes

passar item da base como referência em PHP

Mensagempor Toledo » 07 Jun 2014 08:21

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,
Toledo - Clipper On Line
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
Avatar de usuário

Toledo
Administrador

Administrador
 
Mensagens: 3076
Data de registro: 22 Jul 2003 18:39
Cidade/Estado: Araçatuba - SP
Curtiu: 251 vezes
Mens.Curtidas: 254 vezes

passar item da base como referência em PHP

Mensagempor cjp » 07 Jun 2014 12:29

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:
Inacio de Carvalho Neto
cjp
Usuário Nível 5

Usuário Nível 5
 
Mensagens: 1162
Data de registro: 19 Nov 2010 21:29
Cidade/Estado: paraná
Curtiu: 8 vezes
Mens.Curtidas: 12 vezes

passar item da base como referência em PHP

Mensagempor Toledo » 08 Jun 2014 18:10

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,
Toledo - Clipper On Line
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
Avatar de usuário

Toledo
Administrador

Administrador
 
Mensagens: 3076
Data de registro: 22 Jul 2003 18:39
Cidade/Estado: Araçatuba - SP
Curtiu: 251 vezes
Mens.Curtidas: 254 vezes

passar item da base como referência em PHP

Mensagempor cjp » 17 Jun 2014 01:07

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.
Inacio de Carvalho Neto
cjp
Usuário Nível 5

Usuário Nível 5
 
Mensagens: 1162
Data de registro: 19 Nov 2010 21:29
Cidade/Estado: paraná
Curtiu: 8 vezes
Mens.Curtidas: 12 vezes

passar item da base como referência em PHP

Mensagempor Toledo » 17 Jun 2014 09:37

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,
Toledo - Clipper On Line
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
Avatar de usuário

Toledo
Administrador

Administrador
 
Mensagens: 3076
Data de registro: 22 Jul 2003 18:39
Cidade/Estado: Araçatuba - SP
Curtiu: 251 vezes
Mens.Curtidas: 254 vezes

passar item da base como referência em PHP

Mensagempor cjp » 17 Jun 2014 14:08

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);

?>
Inacio de Carvalho Neto
cjp
Usuário Nível 5

Usuário Nível 5
 
Mensagens: 1162
Data de registro: 19 Nov 2010 21:29
Cidade/Estado: paraná
Curtiu: 8 vezes
Mens.Curtidas: 12 vezes

passar item da base como referência em PHP

Mensagempor Toledo » 17 Jun 2014 15:18

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,
Toledo - Clipper On Line
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
Avatar de usuário

Toledo
Administrador

Administrador
 
Mensagens: 3076
Data de registro: 22 Jul 2003 18:39
Cidade/Estado: Araçatuba - SP
Curtiu: 251 vezes
Mens.Curtidas: 254 vezes

passar item da base como referência em PHP

Mensagempor cjp » 18 Jun 2014 00:08

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.
Inacio de Carvalho Neto
cjp
Usuário Nível 5

Usuário Nível 5
 
Mensagens: 1162
Data de registro: 19 Nov 2010 21:29
Cidade/Estado: paraná
Curtiu: 8 vezes
Mens.Curtidas: 12 vezes

Próximo



Retornar para Outras linguagens de programação

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 2 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro