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 Toledo » 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:
$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,
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 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:

<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.
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 » 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!

$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,
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 » 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:

<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.
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 » 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,
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 » 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:

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

Anterior



Retornar para Outras linguagens de programação

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 0 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