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

Pessoal, no estudo de caso de um controle de finanças pessoal, ele esta dando uns erro que não consigo resolver

[code]

Exclusão de registros

<?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);
?>

[/code] 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

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.

[quote=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.[/quote]

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 ?

[quote=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 ?[/quote]
Sim retorna a data 2013-03-28 e

todos os resultados possuem datas.

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

esqueci de perguntar,

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

pq -1?

qualquer duvida mande ai.

[quote=perdeu]esqueci de perguntar,

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

pq -1?

qualquer duvida mande ai.[/quote]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]

[quote=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[/quote]
Com a função pg_fetch_array no while deu certo vlw “perdeu” pela atenção

ficou assim:

[code]

Exclusão de registros

<?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

”;
pg_close($con);
?> [/code]

deu certo? falta alguma coisa?

manda o retorno do print_r() do $meses.

[quote=perdeu]deu certo? falta alguma coisa?

manda o retorno do print_r() do $meses.[/quote]
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

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

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?

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.

Então blz, vlw pela dica

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

SQL INJECTOR