Clipper On Line • Ver Tópico - passar item da base como referência em PHP
Mudar para estilo Clássico
Discussão sobre outras linguagens de programação.
Postar uma resposta

passar item da base como referência em PHP

18 Jun 2014 10:00

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:
Código:
$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.

Código:
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:
Código:
<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

18 Jun 2014 23:24

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:

Código:
<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

19 Jun 2014 08:34

Ok Inácio, então como lhe orientei na mensagem anterior, vamos analisar o seu código e tentar descobrir onde está o erro!

Código:
$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:
Código:
$reg= $_GET['id'];

e troque por:
Código:
$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

19 Jun 2014 13:26

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:

Código:
<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

19 Jun 2014 17:02

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

20 Jun 2014 13:30

Toledo, estranhamente, desde ontem, não estou mais conseguindo acessar a base de dados no FTP. Está dando o seguinte erro:

Código:
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).
Postar uma resposta