Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Sign in to follow this  
ClaudioxPT

Problemas em projecto.

Recommended Posts

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

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

Share this post


Link to post
Share on other 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?  🤔

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.

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.