Página 2 de 2

passar item da base como referência em PHP

Enviado: 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:

Código: Selecionar todos

$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: Selecionar todos

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 ... ample-1148
Veja o "remove the 'deleted' entry".

Sobre o campo do formulário para digitar o preço, tente o seguinte:

Código: Selecionar todos

<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

Enviado: 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:

Código: Selecionar todos

<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

Enviado: 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!

Código: Selecionar todos

$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: Selecionar todos

$reg= $_GET['id'];
e troque por:

Código: Selecionar todos

$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

Enviado: 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:

Código: Selecionar todos

<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

Enviado: 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

Enviado: 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:

Código: Selecionar todos

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