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.