Jump to content

[Resolvido] POST vazio - Problema sério


Recommended Posts

Posted (edited)

Ora bem, vou começar por situar toda a gente.

Eu estou a fazer um jogo de browser, é o meu projecto pessoal já há uns anos.

Á medida que vou ganhando mais capacidades, vou descartando código velho, e eventualmente recomeçar do zero quando chego a situações em que acho que o meu código tem muito que melhorar.

Esta é a terceira vez que começo o projecto do zero, e nunca pensei que me fosse dar problemas tão graves, tão cedo, e tão estúpidos.

Durante a criação do sistema de registo, quando fui para testar o que pensava ser um sistema já terminado (outros testes foram feitos a outros componentes do sistema, o ultimo era à componente server-side), apercebi-me que algo estava muito mal.

Em primeiro lugar, o meu script PHP estava a lançar uma excepção por a password ser demasiado curta, o que chamou imediatamente a minha atenção.

var_dump($_POST); indicava um array vazio. Outros métodos indicavam a mesma coisa.

php://input, indicava a mesma coisa.

verifiquei o php.ini, todos os valores estão em condições.

não há campos disabled no form, o js não está a mudar nada relevante, até mudei para o método GET para testar, e a query string ia vazia.

Inclusivamente, usei o firebug para procurar a origem do problema, e a única coisa que consegui determinar é que o browser não manda nada no POST.

Testei tanto com o Firefox como o Chrome.

Não faço mais ideia do que possa ser o problema, a única conclusão a que consegui chegar é que provém do cliente e não do servidor.

Tinha esperanças que alguém detectasse alguma coisa que me escapou, e me ajudasse a resolver isto.

Eis excertos relevantes do código fonte da página:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd%22>
<html xmlns="http://www.w3.org/1999/xhtml%22>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link rel="stylesheet" href="./resources/css/_override.css" type="text/css" />
<link rel="stylesheet" href="./resources/css/frame.css" type="text/css" />
<link rel="stylesheet" href="./resources/css/register.css" type="text/css" />
 <script type="text/javascript" src="./resources/js/jquery.min.js" ></script>
<script type="text/javascript" src="./resources/js/register.js" ></script>
<title>Titallus</title>
</head>


<body>
<div id="topbar">
</div>
<div id="root">
<div id="header">
<div id="logo" class="headblock">
</div>
<div id="nav" class="headblock">
 <div id="playercount">
 <span class="navblock">
 Registered: 0	 </span>
 |
 <span class="navblock">
 Active: 0	 </span>
 |
 <span class="navblock">
 Online: 0	 </span>
 </div>
 <div id="menu">
 <span class="navblock">
 <a href="./">Home</a>	 </span>
 |
 <span class="navblock">
 <a href="./?m=login">Login</a>	 </span>
 |
 <span class="navblock">
 <span class="here">Register</span>	 </span>
 |
 <span class="navblock">
 <a href="./?m=rules">Rules</a>	 </span>
 |
 <span class="navblock">
 <a href="http://forum.titallus.com%22>Forum</a>
 </span>
 </div>
</div>
</div>
<div id="content-wrapper">
<div id="register">
<form action="./?m=form&f=register" method="post">
<div class="row secure">
Note that all of these fields, except for the nickname, are used only to log into the account and proving account ownership.
Keep them secret. Also, use a nickname diferent from your username, for security reasons.
</div>
<div class="row">
<div class="row-desc">
Username
</div>
<div class="row-data">
<input type="text" id="user" maxlength="16" />
</div>
<div class="row-error error" id="user-error">
*
</div>
</div>
<div class="row">
<div class="row-desc">
Nickname
</div>
<div class="row-data">
<input type="text" id="nick" maxlength="16" />
</div>
<div class="row-error error" id="nick-error">
*
</div>
</div>
<div class="row">
<div class="row-desc">
Password
</div>
<div class="row-data">
<input type="password" id="pass" />
</div>
<div class="row-error error" id="pass-error">
*
</div>
</div>
<div class="row">
<div class="row-desc">
Confirm
</div>
<div class="row-data">
<input type="password" id="conf" />
</div>
<div class="row-error ok" id="conf-error">
*
</div>
</div>
<div class="row">
<div class="row-desc">
E-mail
</div>
<div class="row-data">
<input type="text" id="mail" maxlength="128" />
</div>
<div class="row-error error" id="mail-error">
*
</div>
</div>
<div class="row legal">
By registering, you agree to our Terms and Conditions and the Privacy Policy, both present in the Legal Stuff section of this website.
</div>
<div class="row">
<div class="submit">
<input type="submit" value="Register" id="submit" disabled="disabled" />
</div>
</div>
</form>
</div> </div>
<div id="footer">
<span>
 LordFokas ©2012 - All Rights Reserved
</span>
<span class="float-r">
 <a href="./?m=news">News</a>
 <span class="footer-sep">|</span>
 <a href="./?m=support">Support</a>
 <span class="footer-sep">|</span>
 <a href="./?m=legal">Legal Stuff</a>
 <span class="footer-sep">|</span>
 <a href="http://devblog.titallus.com%22>DevBlog</a>
 <span class="footer-sep">|</span>
 <a href="./?m=changelog">Changelog</a>
</span>
</div>
</div>
</body>
</html>

var jsbuffer;
$(document).ready(function(){
$("input").blur(regval);
$("input").keyup(regval);
$("input").click(regval);
$("input").change(regval);
regval();
});
function setError(id, status, message){
$(id).removeClass("error").removeClass("ok");
if(status == true){
$(id).addClass("error");
}else{
$(id).addClass("ok");
}
$(id).html(message);
}
function setLock(status){
if(status == false){
$("#submit").removeAttr("disabled");
}else{
$("#submit").attr("disabled", "disabled");
}
}
function checkUser(){
var user = $("#user").val();
if(user.length < 6){
setError("#user-error", true, "Minimum 6 characters!");
return false;
}
$.ajax({url: "./?m=ajax&f=user&fd=" + user, async: false}).done(function(data){
jsbuffer = data;
});
if(jsbuffer != "OK"){
setError("#user-error", true, "Username already taken!");
return false;
}else{
setError("#user-error", false, "The username is valid!");
return true;
}
}
function checkNick(){
var nick = $("#nick").val();
if(nick.length < 3){
setError("#nick-error", true, "Minimum 3 characters!");
return false;
}
if(nick.toUpperCase() == $("#user").val().toUpperCase()){
setError("#nick-error", true, "User and Nick can't be equal!");
return false;
}
$.ajax({url: "./?m=ajax&f=nick&fd=" + nick, async: false}).done(function(data){
jsbuffer = data;
});
if(jsbuffer != "OK"){
setError("#nick-error", true, "Nickname already taken!");
return false;
}else{
setError("#nick-error", false, "The nickname is valid!");
return true;
}
}
function checkPass(){
var pass = $("#pass").val();
if(pass.length < 6){
setError("#pass-error", true, "Minimum 6 characters!");
return false;
}
setError("#pass-error", false, "The password is valid!");
return true;
}
function checkConf(){
if($("#pass").val() == $("#conf").val()){
setError("#conf-error", false, "The passwords match!");
return true;
}else{
setError("#conf-error", true, "The passwords don't match!");
return false;
}
}
function checkMail(){
var emailPattern = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/;
var mail = $("#mail").val();
if(!emailPattern.test(mail)){
setError("#mail-error", true, "Invalid Email address!");
return false;
}
$.ajax({url: "./?m=ajax&f=mail&fd=" + mail, async: false}).done(function(data){
jsbuffer = data;
});
if(jsbuffer != "OK"){
setError("#mail-error", true, "Address already in use!");
return false;
}else{
setError("#mail-error", false, "The address is valid!");
return true;
}
}
function regval(){
var user = checkUser();
var nick = checkNick();
var pass = checkPass();
var conf = checkConf();
var mail = checkMail();
setLock(!(user && nick && pass && conf && mail));
}
Edited by yoda
Posted (edited)

Boas,

todos os teus inputs não tem o atributo name definido, o que vai no $_POST é o name não o id.

//Está assim
<input type="password" id="pass" />

//Devia ser assim
<input type="password" id="pass" name="pass" />

Espero ter ajudado

Edited by yoda
  • Vote 1

Tiago Tavares

Posted (edited)

O que fui ensinado nas aulas, depois de já ter vários anos de experiência com HTML, é que tanto faz. Se um input tiver um ID, esse ID é usado em vez do Name. Eu nem sequer fazia ideia disso.

No entanto, ontem à tarde, durante os ultimos testes que fiz, pus um name em todos os campos, e mesmo assim nada funcionou. Para mais, até vou testar uma coisa com o Firebug, vou voltar a por names em tudo e analisar o pacote HTML enviado, a ver se funciona com names e há outro problema por trás, ou é tudo a mesma coisa. No entanto, continuo a crer que não seja problema do Name.

EDIT: WTF?

Ontem testei a por os names nos inputs, continuava com o mesmo erro. Testei hoje, o pacote HTTP vai certinho, com tudo la dentro.

Ou alguma coisa me escapou ontem durante os testes, ou então não sei. De qualquer forma, a minha consideração pelo ensino superior voltou a descer, e sinto-me um idiota, por ao fim de mais de 6 anos de experiência com HTML ter cometido um erro destes.

A única coisa que me chateia é, porque é que ontem por volta desta hora quando testei com names não resolveu o problema, e hoje foi á primeira? :/

Obrigadão, tiagotavares!

Podem fechar, está resolvido.

Edited by lordfokas
Posted

O que fui ensinado nas aulas, depois de já ter vários anos de experiência com HTML, é que tanto faz. Se um input tiver um ID, esse ID é usado em vez do Name. Eu nem sequer fazia ideia disso.

No entanto, ontem à tarde, durante os ultimos testes que fiz, pus um name em todos os campos, e mesmo assim nada funcionou. Para mais, até vou testar uma coisa com o Firebug, vou voltar a por names em tudo e analisar o pacote HTML enviado, a ver se funciona com names e há outro problema por trás, ou é tudo a mesma coisa. No entanto, continuo a crer que não seja problema do Name.

onde tiveste aulas ???

IRC : sim, é algo que ainda existe >> #p@p
Posted (edited)

Viva,

@lordfokas

Lê estas informações:

http://www.w3.org/TR/html401/interact/forms.html#successful-controls

"A successful control must be defined within a FORM element and must have a control name."

Depois se clicares em control_name...

http://www.w3.org/TR/html401/interact/forms.html#control-name

"A control's "control name" is given by its name attribute"

Lê tudo...

Edited by taviroquai
Posted

@HappyHippyHippo, Escola Superior de Tecnologia e Gestão, do Instituto Politécnico de Leiria.

Os professores também se enganam. Há la muitos professores nabos, que não fazem ideia do que estão a fazer, mas este certamente não é um deles.

@taviroquai, obrigado, depois desta experiência, já não me volto a enganar nisto.

Enfim, com as experiências é que se aprende... Bem que este era um daqueles erros para cometer no inicio, não ao fim de uma mão cheia de anos nisto.

Faz sempre bem no entanto... Foi assim que aprendi HTML: a mal. E PHP. E Javascript. E Java. E provavelmente outras linguagens que de repente não me surgem.

De qualquer forma, obrigado pela ajuda 👍

Posted (edited)

O que fui ensinado nas aulas, depois de já ter vários anos de experiência com HTML, é que tanto faz. Se um input tiver um ID, esse ID é usado em vez do Name. Eu nem sequer fazia ideia disso.

No entanto, ontem à tarde, durante os ultimos testes que fiz, pus um name em todos os campos, e mesmo assim nada funcionou. Para mais, até vou testar uma coisa com o Firebug, vou voltar a por names em tudo e analisar o pacote HTML enviado, a ver se funciona com names e há outro problema por trás, ou é tudo a mesma coisa. No entanto, continuo a crer que não seja problema do Name.

EDIT: WTF?

Ontem testei a por os names nos inputs, continuava com o mesmo erro. Testei hoje, o pacote HTTP vai certinho, com tudo la dentro.

Ou alguma coisa me escapou ontem durante os testes, ou então não sei. De qualquer forma, a minha consideração pelo ensino superior voltou a descer, e sinto-me um idiota, por ao fim de mais de 6 anos de experiência com HTML ter cometido um erro destes.

A única coisa que me chateia é, porque é que ontem por volta desta hora quando testei com names não resolveu o problema, e hoje foi á primeira? :/

Obrigadão, tiagotavares!

Podem fechar, está resolvido.

Eu estou agora a frequenter o ensino superior, ainda não tive nenhuma unidade curricular de desenvolvimento web e estou bastante curioso de saber como os professores leccionam as aulas.

E sim não é a fazer testes, a ler livros e ouvir os profs falar que se aprende programação é mesmo a dar com a cabeça na parede vezes e vezes sem conta 😄

Edited by tiagotavares

Tiago Tavares

Posted

Depende dos testes, não sei a que te estavas a referir.

Eu testo constantemente tudo o que produzo, quando crio por exemplo um script PHP, gosto de o fazer estoirar de todas as maneiras possíveis antes de fazer uma release. Se não tentares explorar todas as possiveis falhas, por mais certezas que tenhas que as coisas estão protegidas, e não testares tudo intensivamente, não tens como ter a certeza que tudo funciona bem.

É raro em PHP haver uma falha nos meus scripts, e quando há, é sempre algo que eu não me lembrei de experimentar.

Não só é saudavel para o código que produzes, como acabas sempre a aprender coisas novas com isso.

Os livros, epá, é relativo. Depende dos livros. Eu quando leio um livro de programação, geralmente é documentação e não tutoriais. Gosto de sites como php.net e w3schools porque dão te uma especificação detalhada de tudo o que tens disponivel. Esses são bons. Mas nunca te vão ensinar nada, só te ajudam a ter menos trabalho quando precisas de desenvolver uma funcionalidade nova.

No meio disso tudo, o que sobra mesmo são as horas perdidas a praticar. Leva tempo, e dá muitas chatices, mas é recompensador, e tenho o orgulho de dizer que tudo o que sei de PHP aprendi ás minhas custas, apenas com ajuda da documentação das funções, e algumas horas a pesquisar no google por causa de erros esquisitos. Não tive aulas onde me ensinassem, nem tão pouco segui tutoriais ou copiei código. Quanto mais esforço tiveres a produzir algo, melhor o resultado final, dentro de limites razoáveis obviamente.

Uma coisa é certa, depois disto vai ser mais fácil para mim questionar aquilo que acho que sei, e não tomar os meus conhecimentos como garantidos. Sinceramente acho que me fez bem.

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
×
×
  • Create New...

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.