[Resolvido] Formulario em flash e php - PHP - Portugal-a-Programar
[Resolvido] Formulario em flash e php
By tmwh, August 6, 2013 in PHP
Boa noite a todos. Estou com um problema que passo a explicar:
Tenho um formulário feito em flash
Envio os dados por POST para o script PHP
O PHP insere os dados em BD.
Os dados surgem corrompidos na BD por problemas de acentuação.
O problema não está no PHP pois se em vez de usar a variável recebida do formulário:
$nome=ucwords(strtolower($_POST['nome']));
usar uma definida no PHP:
$nome="mário";
aparece correcto na BD.
O problema estará por isso no envio do flash para php.
utiliza o utf8_encode($nome) e utf8_decode($nome).
Boas Nuno. Desde já obrigado pela resposta.
Utilizo utf8_encode($nome) dentro do flash e utf8_decode($nome) no php?
Não. Fazes o utf8_encode($nome) antes de enviar para a base-de-dados e o utf8_decode() quando puxas os dados da base-de-dados
Edited August 8, 2013 by MoshMage
Boas MoshMage. Vou tentar e depois digo qual o resultado.
Edited August 8, 2013 by tmwh
Boas. Testei várias situações e continua a não dar.
Resumindo: esquecendo a parte do formulário em flash e tendo como ponto de partida html, php e mysql: para que consiga introduzir através do inserir.php a variável $nome = "anda lá" correctamente na BD, tenho de ter a BD, tabela e campo com a codificação utf8_general_ci e o index.html, inserir.php e ligacao.php com Europeu Ocidental (charset=iso-8859-1). Esta é a única forma de a variável ser correctamente guardada na BD.
Voltando ao formulário em flash, pelo que andei a ler, o flash já faz a codificação em utf8 a menos que seja indicado para não o fazer.
Considerando que introduzo no formulário "anda lá", se no inserir.php fizer:
$nomeflash=ucwords(strtolower($_POST['nome'])); $nome=utf8_encode($nomeflash); surge na BD "Anda Lã¡".
$nomeflash=ucwords(strtolower($_POST['nome'])); $nome=utf8_decode($nomeflash); surge na BD "Anda L?".
$nome=ucwords(strtolower($_POST['nome'])); surge na BD "Anda Lã¡".
Penso que o problema estará no modo em como estão a ser enviadas as variáveis do flash para o php.
fala um leigo na materia, mas se fizer um print_r antes de enviar os dados para a base dados já vê se os dados chegam bem.
De qual ficheiro? Penso que indiquei tudo no meu comentário anterior mas volto a referir: O index.html, inserir.php e ligacao.php estão em Europeu Ocidental (charset=iso-8859-1). O index.html tem a chamada do inserir.php. Está tudo nesta codificação pois é a unica forma de funcionar a 100%, ou seja, os dados serem correctamente introduzidos na BD. Se aplicar um formulario feito em php e chamando pelo html tudo funciona na perfeição. Por isso penso que o problema reside no envio do flash para php.
Faz um double-check na base-de-dado e ve se os campos para onde estás a enviar o texto estão em ISO8 ou se estão para outra lingua qualer.
Edited August 9, 2013 by MoshMage
Boas MoshMage. Também já tinha referido que a Base de Dados, tabela, e os campos estão em utf8_general_ci.
Com ou sem BOM?
Já agora, usa UTF-8 sem BOM. É o mais testado e sabe-se que funciona. Nota que isto não significa que o que usas não serve.
E sempre estiveram dessa maneira?
E a ligação? É tb em utf-8?
Com ou sem BOM??? agora estou perdido
Andei a pesquisar na BD do servidor online e existe uma mistura de codificações. Deve ser por isso que está a dar o berro.
Como mudo isto tudo para utf8?
Edited August 10, 2013 by tmwh
Qual é a driver que usas para comunicar com a DB? (Se n sabes, indica a função/Objecto que usas)
Edited August 10, 2013 by brunoais
Boas. Tenho um script ligacaotabela.php codificado em utf8 com o seguinte código:
$hostname_ligacaotabela = "localhost";
$database_ligacaotabela = "registo";
$username_ligacaotabela = "root";
$password_ligacaotabela = "pass";
$ligacaotabela = mysql_pconnect($hostname_ligacaotabela, $username_ligacaotabela, $password_ligacaotabela) or trigger_error(mysql_error(),E_USER_ERROR);
Para inserir na BD tenho um script inserir.php codificado em utf8 que recebe os dados do formulário em flash:
<?php require_once('Connections/ligacaotabela.php'); ?>
$sql = "INSERT INTO `registo`.`tabela` ( nome ) VALUES ( '$nome' )";
//Aqui tenho uma função para enviar email para quem preencheu o formulário, que envia os dados introduzidos (nome) e está a enviar correctamente os dados, logo eles chegam correctos quando enviados do flash.
Se for introduzido "joão" surge "João" no email, mas na BD aparece "João". O problema estará na introdução na BD.
Edited August 12, 2013 by brunoais
Boas a todos. Consegui resolver o problema.
Tinha a ver com a ligação à BD, pois pelo que percebi quando nada se indica, o mysql entende que o cliente vai realizar a ligação pelo charset de defeito "latin1".
"The MySQL client programs mysql, mysqladmin, mysqlcheck, mysqlimport, and mysqlshow determine the default character set to use as follows:
In the absence of other information, the programs use the compiled-in default character set, usually latin1."
Fonte: http://dev.mysql.com/doc/refman/5.0/en/charset-connection.html
Para resolver isto temos de indicar qual o charset e codificação que vamos utilizar na ligação à BD.
# Informa o charset a utilizar na ligação.
Não nos devemos esquecer de ter a BD, tabelas e campos codificados também em utf8.
O mesmo se aplica para os scripts html e php utilizados.
Apesar de estar a funcionar no servidor online, o mesmo não acontece no servidor local xammp, mas deve ser uma questão simples de resolver.