MySQL não altera dado corretamente
Boas e feliz 2012 a todos.
Estou trabalhando em um projeto que deveria ser tranquilo, se não fosse por uma única linha...
Tenho uma tabela da seguinte maneira:
accounts
/applications/core/interface/imageproxy/imageproxy.php?img=http://img694.imageshack.us/img694/8293/tabela1zf.png&key=f9bfa2dc50803f75f3f9421eceb119aaf7bcc45b4a10f0d16d23e1db582188a4" alt="tabela1zf.png" />
Acontece que o sistema terá uma área onde será possível editar as colunas "login" e "email". E, quando fui testar esta área, ocorreu o seguinte:
O valor de "login" deveria ser qualquer outro (fiz vários testes com strings diferentes), mas se tornou "0" (zero). Não é exibido qualquer erro.
A coluna "email", que recebe o update na mesma query que "login", foi atualizada corretamente. Esta é a única coluna que apresenta este problema.
Então, resolvi fazer mais testes:
1. Mostrar a query com die() na tela, ao invés de executá-la.
Resultado: a query estava sem problemas aparentes. Mas, como queria ter certeza disso, resolvi executá-la usando meu SQL Manager (Adminer - prefiro ele ao PHPMyAdmin). Apenas copiei e colei, da forma em que estava. A consulta foi executada corretamente e a coluna alterada para o valor que eu quisesse.
2. Fazer testes condicionais para saber o verdadeiro valor de $login.
if($login==="admin") {
echo 'admin';
}
if($login==0) {
echo '0';
}
Resultado: Os dois testes retornaram positivo. Desta forma, $login = 'admin' e, ao mesmo tempo, $login = 0.
3. Dar um simples die($login)
Resultado: o valor real de $login (o que eu coloquei) foi exibido na tela. O problema está na execução da query.
4. Editar apenas o email na query
Resultado: não importa. Mesmo que eu não inclua a coluna "login" no UPDATE, ela será atualizada pra "0".
O bendito código:
$_POST = array_map('protect', $_POST);
$err = array();
$login = $_POST['login'];
$email = $_POST['email'];
$id = $_SESSION['id'];
mysql_query("UPDATE accounts SET `login`='$login', `email`='$email' WHERE `id`='$id'") or die(mysql_error());
Obs.: A função protect(), vista em array_map(), nada mais é do que uma que reune mysql_real_escape_string() e htmlspecialchars(), e funciona perfeitamente
O SQL da tabela
CREATE TABLE `accounts` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`login` varchar(255) NOT NULL,
`senha` varchar(32) NOT NULL,
`email` varchar(255) NOT NULL,
`nome` varchar(255) NOT NULL,
`foto` varchar(255) NOT NULL,
`registro` varchar(255) NOT NULL,
`ultimo_login` varchar(255) NOT NULL,
`admin` char(1) NOT NULL,
`sexo` char(1) NOT NULL,
`nascimento` varchar(10) NOT NULL,
`sobre` text NOT NULL,
`campo` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
O formulário
<form method="post" action="{$home}account/alterarcontapost">
<p><label for="login">Login</label><br/>
<input type="text" name="login" id="login" value="$qry[login]"></p>
<p><label for="email">E-mail</label><br/>
<input type="text" name="email" id="email" value="$qry[email]"></p>
(...)
<input type="submit" value="Gravar">
</form>
Obs.: A variável $home apenas retorna a URL onde minha aplicação está rodando. O array $qry é vindo de um mysql_fetch_array(), para obter os dados atuais, gravados na tabela, e está funcionando normalmente.
Alguém faz ideia do que possa ser?
Desde já, agradeço.
P.S: Por enquanto, estou fazendo uma gambiarrinha aqui que, antes da função rodar, obtém o login que estava e, no final da função, repõe o login correto. POG, I am your father. Mas ainda me interesso em saber o porquê do problema. Alguém sabe?
Discussão (2)
Carregando comentários...