Ir para o conteúdo
ClaudioxPT

Problemas em projecto.

Mensagens Recomendadas

ClaudioxPT

Boas

Eu tenho vindo a desenvolver ( á medida que aprendo ao ler o manual oficial e outro á parte ), um projecto para um CMS o mais simples possível, mas até agora tenho tido alguns problemas que tenho vindo a contornar com "soluções alternativas" ( vindas da imaginação de inexperiente em programação, pelo que susceptíveis a erros ), pelo que gostaria de pedir ajuda a solucionar algumas delas e principalmente um problema em que estou preso "de todo".

Problema 1 (não é problema mas o error log queixa-se):

<?php if ($_GET['ind']==1){
   require 'resources/includes/pages/projects.php';
   } elseif ($_GET['ind']==2) {
require 'resources/includes/pages/changelog.php';
} elseif ($_GET['ind']==3) {
require 'resources/includes/pages/about.php';
} elseif ($_GET['ind']==4) {
require 'resources/includes/pages/contact.php';
} else {include 'resources/includes/pages/home.php';}
   ?>

Neste bloco de codigo o log queixa-se da variavel vinda do $_GET ('ind')

[07-Dec-2011 21:41:24] PHP Notice:  Undefined index: ind in C:\Program Files (x86)\Apache Software Foundation\Apache2.2\htdocs\index.php on line 20

Ele está á espera que eu faça o que? Que defina a variavel antes de ter de a usar?  :hmm:

Problema 2(==$problema1['description']):

Tenho um logotipo diferente para cada dia:

<?php
$sem = date("w");
echo '<img id="logo" src="resources/scripts/logo/logo'.$sem.'.png" width="227" height="71"/>';
?>

E a queixa é:

[07-Dec-2011 21:41:24] PHP Warning:  date(): It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected 'Europe/London' for '0.0/no DST' instead in C:\Program Files (x86)\Apache Software Foundation\Apache2.2\htdocs\resources\scripts\logo\logo.php on line 2

Problema 3:

Num local onde defino constantes para um login tenho:

define (USRN,'admin');
define (PASSWD,'b068075388033d239021bb1fc1781fabeec51588086e6d656a8441197f83c88d4fc55206782d77cd6ea878e2cca786942a6611a8925ad9e8f0692088e8584848');

E ai ele queixa-se de:

[07-Dec-2011 21:47:38] PHP Notice:  Use of undefined constant USRN - assumed 'USRN' in C:\Program Files (x86)\Apache Software Foundation\Apache2.2\htdocs\resources\config.php on line 2

[07-Dec-2011 21:47:38] PHP Notice:  Use of undefined constant PASSWD - assumed 'PASSWD' in C:\Program Files (x86)\Apache Software Foundation\Apache2.2\htdocs\resources\config.php on line 3

Indefinida?  :bored: Então como é que funciona?

Anyway, até aqui tudo funciona, apesar de gerar relatórios de erros...

Mas este problema não vai mesmo ao sitio, já perdi 3/4 horas des do inicio do gestor do login e até agora ficou assim:

login.php

<?php
if ($_SESSION['admin']==true){
header('Location: administration.php');
}
if(!isset($_POST['login_usrn']) && !isset($_POST['login_passwd'])){
echo 'Log in into your account';
}elseif(isset($_POST['login_usrn'])&& $_POST['login_usrn'] <> NULL && isset($_POST['login_passwd']) && $_POST['login_passwd'] <> NULL){
require 'resources/scripts/login/login_verify.php';
}else{
echo '<b>Username/Password combination failure!</b>';
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Login</title>
</head>
<body>
<form action="login.php" method="post" name="xxx"><input name="login_usrn" type="text" value="Username" size="30" maxlength="50" /><br/><input name="login_passwd" type="password" size="30" maxlength="50" /><br/>
<input name="xxx" type="checkbox" value="" /><input name="xxx" type="submit" value="Submit" /></form>
</body>
</html>

login_verify.php

<?php
require 'resources/config.php';
if ($_POST['login_usrn']==USRN && hash('sha512',$_POST['login_passwd'])==PASSWD){
session_start();
$_SESSION['admin'] = true;
header('Location:administration.php');
}else{
echo 'Login failure';
}
?>

A config.php tem as constantes que mostrei no 3º problema e o administration.php, apenas um echo para saber quando lá chegar.

Qual é o problema perguntam...

O código funciona perfeitamente e mete logica, mas o problema é que for some reason, nunca chega ao fim.

Após um pouco de teste de linha a linha (fui comentando o codigo e metendo echos pelo caminho, para ver onde chegava ), e cheguei á conclusão que o problema está no

header('Location:administration.php');

, sendo que não faz o seu trabalho e ainda faz com que a pagina volte ao ponto "0".

O script não manda NENHUM output para o browser antes de chegar ao header, então porque é que ele não consegue redireccionar?

E sim, eu sei que este sistema de login está muito rudimentar, mas para já serve, e quando percisar de mais utilizadores, etc... logo o ligo a uma BD.

Alguem pode ajudar nos problemas que expus?

Cumprimentos

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
mjamado

Isso é muita pergunta junta...  :cheesygrin:

Neste bloco de codigo o log queixa-se da variavel vinda do $_GET ('ind') Ele está á espera que eu faça o que? Que defina a variavel antes de ter de a usar?  :hmm:

Claro! Nalgumas linguagens, tens mesmo um fatal error se tentares usar uma variável não definida...

Para verificares se a variável já foi definida (no teu caso, como é do $_GET, há-de vir do cliente - e não está a vir, senão não dava esse notice), usa o isset, assim:

if(isset($_GET['ind']))
{
    // o teu código
}

Já agora, considera usar um switch em vez desses elseif todos.

Numa nota relacionada, a esmagadora maioria dos programadores de PHP ignora os notice, desde que não escalem para algo pior. As máquinas de produção raramente têm o nível de erros para tão baixo. Mas fazes melhor em não os ignorar, e tratá-los convenientemente.

Tenho um logotipo diferente para cada dia:

<?php
$sem = date("w");
echo '<img id="logo" src="resources/scripts/logo/logo'.$sem.'.png" width="227" height="71"/>';
?>

Não tens uma timezone definida, ou está mal definida, no php.ini. Procura a linha com date.timezone nesse ficheiro e declara uma timezone válida (se a linha não existir, acrescenta).

Problema 3:

Num local onde defino constantes para um login tenho:

define (USRN,'admin');
define (PASSWD,'b068075388033d239021bb1fc1781fabeec51588086e6d656a8441197f83c88d4fc55206782d77cd6ea878e2cca786942a6611a8925ad9e8f0692088e8584848');

E ai ele queixa-se de:Indefinida?  :bored: Então como é que funciona?

O nome das constantes, quando se usa o define, tem de estar entre aspas ou plicas.

Mas este problema não vai mesmo ao sitio, já perdi 3/4 horas des do inicio do gestor do login e até agora ficou assim:Após um pouco de teste de linha a linha (fui comentando o codigo e metendo echos pelo caminho, para ver onde chegava ), e cheguei á conclusão que o problema está no
header('Location:administration.php');

, sendo que não faz o seu trabalho e ainda faz com que a pagina volte ao ponto "0".

O script não manda NENHUM output para o browser antes de chegar ao header, então porque é que ele não consegue redireccionar?

Assim de repente, o problema mais óbvio que tens é que esta condição:

if ($_SESSION['admin']==true)

... nunca vai ser verdadeira. Porquê? Porque não abriste a sessão antes de a tentar ler. O session_start que tens no login_verify.php tem de saltar de lá para outro sítio onde seja executado antes da instrução acima.


"Para desenhar um website, não tenho que saber distinguir server-side de client-side" - um membro do fórum que se auto-intitula webdesigner. Temo pelo futuro da web.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
ClaudioxPT
Claro! Nalgumas linguagens, tens mesmo um fatal error se tentares usar uma variável não definida...

if(isset($_GET['ind']))
{
    // o teu código
}

Fixed!

Já agora, considera usar um switch em vez desses elseif todos.

A partir de quantos elseif's é recomendado utilizar um switch?

Isso traz melhorias de performance ou é apenas "por um codigo mais limpo"?

Numa nota relacionada, a esmagadora maioria dos programadores de PHP ignora os notice, desde que não escalem para algo pior. As máquinas de produção raramente têm o nível de erros para tão baixo. Mas fazes melhor em não os ignorar, e tratá-los convenientemente.

O que me chamou á vista deles é que estavam a causar ficheiros gigantescos de log's(300Mb+), pelo que tentei corrigir o que pude. Mas se diz que é realmente melhor os ter corrigidos, então assim o farei.

Não tens uma timezone definida, ou está mal definida, no php.ini. Procura a linha com date.timezone nesse ficheiro e declara uma timezone válida (se a linha não existir, acrescenta).

Já coloquei o seguinte:

[Date]
; Defines the default timezone used by the date functions
; http://php.net/date.timezone
date.timezone = "Europe/Lisbon"

Fiz reset ao apache, e está igual. Continua a não reconhecer o fuso.

O nome das constantes, quando se usa o define, tem de estar entre aspas ou plicas.

Fixed

Assim de repente, o problema mais óbvio que tens é que esta condição:

if ($_SESSION['admin']==true)

... nunca vai ser verdadeira. Porquê? Porque não abriste a sessão antes de a tentar ler. O session_start que tens no login_verify.php tem de saltar de lá para outro sítio onde seja executado antes da instrução acima.

Não entendi.

Falando só da parte da sessão: No login.php, verifica se tem privilegio na sessão existente, e caso sim, redirecciona para o painel administrativo. (Adicionei agora ao if o isset para ignorar o resto caso não haja sessão existente)

if (isset($_SESSION['admin']) && $_SESSION['admin']==true){
header('Location: administration.php');
}

Depois no login_verify.php, visto que só cá chega caso não exista sessão, limita-se a (após validação de dados)criar uma sessão e definir os privilégios.

Não entendi o que está mal na sessão, mas não vejo(nem tenho) problema ai. Não sei porque mas o

header('Location:administration.php');

é que está a ser problemático.

Se o comento, o código consegue chegar ao fim.

Cumprimentos

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
ClaudioxPT

O timezone ficou corrigido quando fiz update ao php...

Ele devia de querer que reiniciasse o pc para se adaptar ao timezone, mas pelos vistos actualiza-lo fez o mesmo. :cheesygrin:

Quando á parte problemática já sei, e ao mesmo tempo continuo sem saber a razão do problema...

Para confirmar se o problema era mesmo o header, substitui-o por um echo a avisar que tinha passado por ali, e realmente passou.

Meti o header a apontar para http://www.google.com e o bixo foi lá parar.

Até que fui a ver se a causa era o administration.php...

É essa a causa, o porquê não sei, mas que é lá isso é...

<?php
//if (!isset($_SESSION) || $_SESSION['admin']!= true){
//header('Location: login.php');
//}
echo 'welcome to the admin panel!';
?>

A parte comentada é a que está a fazer com que volte a ir parar ao login.php, mas não tem logica visto que para o script chegar até esta pagina tem de ter a sessão criada, e o titulo atribuído, porque caso contrario nem até aqui chegava.

Sinceramente não entendo NADA, das sessões. Pelo que li, achei melhor utilizar sessão a um cookie, mas ao mesmo tempo, pelo que entendi, a variavel $_SESSION devia de chegar até aqui, visto que a pagina não chegou a ser fechada pelo caminho. O que está aqui de mal?

EDIT:

ok, não fazia a mínima ideia de que tinha de dar um session_start() de cada vez que quisesse ler os dados da sessão criada... é que não mete lógica nenhuma o nome, visto que indica que é para iniciar/criar a sessão, como tal julgava que a partir do momento em que fosse criada, estivesse sempre disponível até ser "destruída" a sessão ou até á janela do browser ser fechada.

Obrigado pela ajuda prestada

Cumprimentos

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
mjamado
A partir de quantos elseif's é recomendado utilizar um switch?

Isso traz melhorias de performance ou é apenas "por um codigo mais limpo"?

Não há uma quantidade definida. Se estás a usar valores definidos, o switch é só mais elegante.

Em teoria, o uso do switch teria mais performance (visto que o if-elseif tem de verificar todas as condições até à certa, e o switch usaria uma hashtable ou estrutura similar), e isso efectivamente acontece noutras linguagens; infelizmente, alguns testes demonstram que o PHP tem aí um problema qualquer, e a estrutura if-elseif tem um minúsculo ganho de performance em relação ao switch.

Por isso, sim, é só uma questão de elegância e facilidade de interpretação, por troca com uma ligeiríssima penalidade na velocidade de execução.


"Para desenhar um website, não tenho que saber distinguir server-side de client-side" - um membro do fórum que se auto-intitula webdesigner. Temo pelo futuro da web.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.