[RESOLVIDO]Problema com estudo de caso... Livro: PHP pra quem conhece PHP

14 respostas
javahunter
Pessoal, no estudo de caso de um controle de finanças pessoal, ele esta dando uns erro que não consigo resolver
<html>
<body>
<h2 align="center">Exclusão de registros</h2>
<?php
include 'valida_cookies.inc';
$usuario = $_COOKIE["usuario"];
$meses = array("Jan","Fev","Mar","Abr","Mai","Jun","Jul","Ago","Set","Out","Nov","Dez");
// - obtém todos os registros do usuário --
include "conecta_banco.inc";
$res = pg_query($con, "select id, descricao, data, valor from receitas_despesas where usuario='$usuario' order by data desc");
$num_linhas = pg_num_rows($res);
for($i=0; $i<$num_linhas; $i++)
{
	$id = $res[$i][0];
	$descricao = $res[$i][1];
	$data = $res[$i][2];
	$valor = $res[$i][3];
	list($ano,$mes,$dia) = explode("-",$data);
	$nome_mes = $meses[$mes-1];
	
	echo "$nome_mes/$ano - $descricao (R\$$valor) ";
	echo "<a href=\"elimina.php?id=$id\">Excluir</a><br>";
}
pg_close($con);
?>
</body>
</html>
e dispara essas mensagens no browser

Notice: Undefined offset: 2 in C:\Apache2.2\htdocs\Controle Financas\excluir.php on line 18

Notice: Undefined offset: 1 in C:\Apache2.2\htdocs\Controle Financas\excluir.php on line 18

Notice: Undefined offset: -1 in C:\Apache2.2\htdocs\Controle Financas\excluir.php on line 19
/ - (R$) [color=darkblue]Excluir[/color]

alguem me da uma força

14 Respostas

javahunter

Também as vezes é porque o ano de lançamento do livro é de 2000 antes de Cristo.

No livro ele usa a função split, tive que troca pra explode porque split é uma função extinta do PHP.

E o foco do código é em MySQL, mas estou usando o PostgreSQL e fazendo as devidas alterações.

douglaskd

javahunter:
Também as vezes é porque o ano de lançamento do livro é de 2000 antes de Cristo.

No livro ele usa a função split, tive que troca pra explode porque split é uma função extinta do PHP.

E o foco do código é em MySQL, mas estou usando o PostgreSQL e fazendo as devidas alterações.

executa essa query direto no sql:

SELECT data FROM receitas_despesas;

retorna a data neste padrão: 2013-03-28 ?

se sim, todos os resultados possuem datas ?

javahunter

douglaskd:
executa essa query direto no sql:

SELECT data FROM receitas_despesas;

retorna a data neste padrão: 2013-03-28 ?

se sim, todos os resultados possuem datas ?


Sim retorna a data 2013-03-28 e

todos os resultados possuem datas.

perdeu

split ja foi depreciado.

esse tipo de erro significa q o indice q vc quer acessar não existe no array.

como vc esta usando o postgres, existe um jeito mto facil de formatar datas, antes do seu select coloque esse comando ele vai tranformar a data no formato brasileiro

$sql = "SET datestyle TO sql, dmy;
           select id, descricao, data, valor from receitas_despesas where usuario='$usuario' order by data desc";
$res = pg_query($con, $sql);

outra dica essa funções mysql_, pg_, mssql_* logo vão ficar obsoletas, use o PDO no lugar.

pg_fetch_all retonar um array com todas as linhas, diferente de pg_fetch_array/assoc q retonar somente uma linha do array.
http://php.net/manual/pt_BR/function.pg-fetch-all.php

perdeu

esqueci de perguntar,

$nome_mes = $meses[$mes-1];

pq -1?

qualquer duvida mande ai.

javahunter

perdeu:
esqueci de perguntar,

$nome_mes = $meses[$mes-1];

pq -1?

qualquer duvida mande ai.

list($ano,$mes,$dia) = explode("-",$data); $nome_mes = $meses[$mes-1];é que a variável [color=darkblue]$data[/color] começa com 1 para Janeiro e vai ate 12 de Dezembro(ela esta sendo usada para pegar os dados do banco), mas a variável [color=darkblue]$mes[/color] começa com o indice 0 de Janeiro a 11 de Dezembro[color=#444444] [/color], por isso o [size=18]-1[/size]

javahunter
perdeu:
split ja foi depreciado.
Notice: Undefined offset: 1

esse tipo de erro significa q o indice q vc quer acessar não existe no array.

como vc esta usando o postgres, existe um jeito mto facil de formatar datas, antes do seu select coloque esse comando ele vai tranformar a data no formato brasileiro

$sql = "SET datestyle TO sql, dmy;
           select id, descricao, data, valor from receitas_despesas where usuario='$usuario' order by data desc";
$res = pg_query($con, $sql);

outra dica essa funções mysql_*, pg_*, mssql_* logo vão ficar obsoletas, use o PDO no lugar.

pg_fetch_all retonar um array com todas as linhas, diferente de pg_fetch_array/assoc q retonar somente uma linha do array.
http://php.net/manual/pt_BR/function.pg-fetch-all.php


Com a função pg_fetch_array no while deu certo vlw "perdeu" pela atenção

ficou assim:
<html>
<body>
<h2 align="center">Exclusão de registros</h2>
<?php
include 'valida_cookies.inc';
$usuario = $_COOKIE["usuario"];
$meses = array("Jan","Fev","Mar","Abr","Mai","Jun","Jul","Ago","Set","Out","Nov","Dez");
// - obtém todos os registros do usuário --
include "conecta_banco.inc";
$res2 = pg_query($con, "select id, descricao, data, valor from receitas_despesas where usuario='$usuario' order by data desc");
$num_linhas = pg_num_rows($res);
while($res = pg_fetch_row($res2))
{
	$id = $res[0];
	$descricao = $res[1];
	$data = $res[2];
	$valor = $res[3];
	list($ano,$mes,$dia) = explode("-",$data);
	$nome_mes = $meses[$mes-1];
	
	echo "$nome_mes/$ano - $descricao (R\$$valor) ";
	echo "<a href=\"elimina.php?id=$id\">Excluir</a><br>";
}
echo "<p align=\"center\"><a href=\"principal.php\">Voltar</a></p>";
pg_close($con);
?>
</body>
</html>
perdeu

deu certo? falta alguma coisa?

manda o retorno do print_r() do $meses.

javahunter

perdeu:
deu certo? falta alguma coisa?

manda o retorno do print_r() do $meses.


Esta tudo certo agora

quando uso o print_r():

Array ( [0] => Jan [1] => Fev [2] => Mar [3] => Abr [4] => Mai [5] => Jun [6] => Jul [7] => Ago [8] => Set [9] => Out [10] => Nov [11] => Dez )

Obrigado pela ajuda

perdeu

blz, q bom, recomendo vc usar o PDO para conexão a banco de dados quando possivel.

javahunter

A vantagem do PDO é se eu precisar mudar de banco de dados, já que vai facilita minha vida

Mais alguma outra vantagem em usa-lo?

perdeu

ele não vai ser depreciado tão cedo assim rs.
tem prepared statements, vc n precisa ficar colocando aspas simples entre os valores string, o q deixa a sintaxe bem mais limpa.

javahunter

Então blz, vlw pela dica

pdpbom

Soh para constar um bom motivo para o uso do PDO :

SQL INJECTOR

Criado 27 de março de 2013
Ultima resposta 1 de abr. de 2013
Respostas 14
Participantes 4