Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Olá pessoal, estou usando um upload sem componente, e estou tentando gravar no MYSQL em utf-8, porem os caracteres gravam com caracteres invalidos, ja fiz testes e isso ocorre porque no formulario esta o enctype="multipart/form-data", quando tira ele funciona.
Como posso resolver isso?
form.asp
<!--#include file="config.asp" -->
<!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"><!-- InstanceBegin template="/Templates/sistema.dwt" codeOutsideHTMLIsLocked="false" -->
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><LINK href="css/estilo.css" rel=STYLESHEET type=text/css>
<!-- InstanceBeginEditable name="head" -->
<!-- InstanceEndEditable -->
</head>
<body>
<table width="980" height="80" border="0" align="center" cellpadding="0" cellspacing="0">
<tr>
<td><a href="painel.asp"><img src="imagens/topo1.png" width="280" height="50" border="0"></a></td>
</tr>
</table>
<table width="980" border="0" align="center" cellpadding="0" cellspacing="0">
<tr>
<td><!-- InstanceBeginEditable name="conteudo" -->
<img src="imagens/cadastro.png" width="25" height="25" hspace="5" vspace="5" align="absmiddle" />
<span class="Titulo_a">Administrador - Cadastro</span><br /><br />
<script language="JavaScript" type="text/javascript">
function valida_campo() var nome = document.form.nome.value
if (nome=="")
{
alert("Preencha o nome.");
document.form.nome.focus()
return false
}
var email = document.form.email.value
if (email=="")
{
alert("Preencha o email.");
document.form.email.focus()
return false
}
var email = document.form.email.value
if (email==""|| email.indexOf("@", 0) == -1 || email.indexOf(".", 0) == -1)
{
alert("Email incorreto!");
document.form.email.focus()
return false
}
var login = document.form.login.value
if (login=="")
{
alert("Preencha o login.");
document.form.login.focus()
return false
}
var senha=document.form.senha.value;
if (senha=="")
{
alert("Preencha a senha.")
document.form.senha.focus()
return false
}
var mins=1;
if (document.form.senha.value.length < mins) {
alert("Sua senha deve ter no mínimo 4 caracteres");
document.form.senha.select();
return false;
}
var senha2=document.form.senha2.value;
if (senha2=="")
{
alert("Repetir a senha!")
document.form.senha2.focus()
return false
}
if ((document.form.senha.value) != (document.form.senha2.value)) {
alert("As senhas digitadas não conferem!");
document.form.senha.focus();
document.form.senha2.select();
return false;
}
}</script>
<form action="cadastra.asp?cadastra=S" method="post" enctype="multipart/form-data" name="form" id="form" onsubmit="return valida_campo()">
<table width="100%" border="0" cellpadding="2" cellspacing="0">
<tr>
<td width="150" class="textoform">Nome:</td>
<td><input name="nome" type="text" class="CampoForm_a" id="nome" size="50" maxlength="255" /></td>
</tr>
<tr>
<td class="textoform">E-mail:</td>
<td><input name="email" type="text" id="email" size="30" maxlength="255" class="CampoForm_a" /></td>
</tr>
<tr>
<td class="textoform">Login:</td>
<td><input name="login" type="text" id="login" size="20" maxlength="255" class="CampoForm_a" /></td>
</tr>
<tr>
<td class="textoform">Senha:</td>
<td><input name="senha" type="password" id="senha" size="10" maxlength="10" class="CampoForm_a" /></td>
</tr>
<tr>
<td class="textoform">Confirmar Senha:</td>
<td><input name="senha2" type="password" id="senha2" size="10" maxlength="10" class="CampoForm_a" /></td>
</tr>
<tr>
<td class="textoform">Nível:</td>
<td><% <select name="nivel" id="nivel" class="CampoForm_a">
<% <option value="<%=categoria1%>"><%=categoria1v%></option>
<% </select></td>
</tr>
<tr>
<td class="textoform">Imagem:</td>
<td><input name="imagem1" type="file" id="imagem1" size="40" class="CampoForm_a" />
0 Pixels</td>
</tr>
<tr>
<td class="textoform">Aprovado:</td>
<td>
<input name="aprovado" type="radio" value="S" class="CampoForm_a" checked="checked" />
Sim
<input name="aprovado" type="radio" value="N" class="CampoForm_a" />
Não</td>
</tr>
<tr>
<td height="32"></td>
<td class="textos">
<input name="submit" type="submit" id="submit" class="BotaoForm_a" value="Cadastrar" />
<input name="button" type="button" onclick="history.go(-1)" value="Não Cadastrar" class="BotaoForm_a" />
</td>
</tr>
</table>
</form>
<!-- InstanceEndEditable --></td>
</tr>
</table>
<table width="980" height="40" border="0" align="center" cellpadding="0" cellspacing="0">
<tr>
<td></td>
</tr>
</table>
</body>
<!-- InstanceEnd --></html>
cadastra.asp
<!--#include file="config.asp" -->
<!-- #include file = "funcoesupload.asp" -->
<%
If Request.Querystring("cadastra")="S" Then
' Chamando Funções, que fazem o Upload funcionar
byteCount = Request.TotalBytes
RequestBin = Request.BinaryRead(byteCount)
Set UploadRequest = CreateObject("Scripting.Dictionary")
BuildUploadRequest RequestBin
' Recuperando os Dados Digitados ----------------------
nome = replace(UploadRequest.Item("nome").Item("Value"), "'", "")
email = replace(UploadRequest.Item("email").Item("Value"), "'", "")
login = replace(UploadRequest.Item("login").Item("Value"), "'", "")
senha = replace(UploadRequest.Item("senha").Item("Value"), "'", "")
nivel = UploadRequest.Item("nivel").Item("Value")
aprovado = UploadRequest.Item("aprovado").Item("Value")
Function DataMySQL_data(d_Data)
dim d_Dia, d_Mes
d_Dia = Day(d_Data)
d_Mes = Month(d_Data)
If d_Dia <= 9 Then d_Dia = d_Dia
If d_Mes <= 9 Then d_Mes = d_Mes
DataMySQL_data = Year(d_Data) & "-" & d_Mes & "-" & d_Dia
End Function
Function DataMySQL_hora(h_Data)
dim h_Horas, h_Minutos, h_Segundos
h_Horas = Hour( h_Data )
h_Minutos = Minute( h_Data )
h_Segundos = Second( h_Data )
If h_Horas <= 9 Then h_Horas = h_Horas
If h_Minutos <= 9 Then h_Minutos = h_Minutos
If h_Segundos <= 9 Then h_Segundos = h_Segundos
DataMySQL_hora = h_Horas & ":" & h_Minutos & ":" & h_Segundos
End Function
' Tipo de arquivo que esta sendo enviado
tipo_arquivo1 = UploadRequest.Item("imagem1").Item("ContentType") 'arquivo1
'tipo_arquivo1 = ""
' Caminho completo dos arquivos enviados
caminho_arquivo1 = UploadRequest.Item("imagem1").Item("FileName") ' arquivo1
'caminho_arquivo1 = ""
' Nome dos arquivos enviados
nome_arquivo1 = Right(caminho_arquivo1,Len(caminho_arquivo1)-InstrRev(caminho_arquivo1,"\"))
nome_arquivo1 = Right(nome_arquivo1, len(nome_arquivo1)-Instr(nome_arquivo1,".")+1)
Novo_nome = "Admin1_"&Replace(date, "/","")&Hour(time)&Minute(time)&second(time) 'novo nome do arquivo (arquivo1)
nome_arquivo1 = novo_nome&nome_arquivo1
' Conteudo binario dos arquivos enviados
arquivo1 = UploadRequest.Item("imagem1").Item("Value")
'arquivo1 = ""
' pasta onde as imagens serao guardadas
pasta1 = Server.MapPath("../uploads/"&nome_arquivo1&"")
' Fazendo o Upload do arquivo selecionado
if arquivo1 <> "" then
Set ScriptObject = Server.CreateObject("Scripting.FileSystemObject")
Set MyFile = ScriptObject.CreateTextFile(pasta1)
For i = 1 to LenB(arquivo1)
MyFile.Write chr(AscB(MidB(arquivo1,i,1)))
Next
MyFile.Close
end if
Call abre_conexao1(ConnString,Conn)
mysql = "SELECT * FROM administrador where AdminLogin='"&login&"'"
set RS = Conn.Execute(mysql)
If not RS.eof then
response.redirect "administrador_erro.asp?erro=existe"
response.end()
RS.Close
Set RS = Nothing
End If
Call fecha_conexao1()
'arquivo 1
'----------------------------------------------------------------------------------
If arquivo1 = "" Then
arquivo1grava = ""
Else
arquivo1grava = nome_arquivo1
End IF
'----------------------------------------------------------------------------------
Call abre_conexao1(ConnString,Conn)
sql = "Insert Into administrador (AdminNome, AdminEmail, AdminLogin, AdminSenha, AdminNivelId, AdminImagem1, AdminAprovado, AdminData, AdminHora) VALUES ('" & nome & "', '" & email & "', '" & login & "', '" & senha & "', '" & nivel & "', '" & arquivo1grava & "', '" & aprovado & "', '" & DataMySQL_data(Now) & "', '" & DataMySQL_hora(Now) & "')"
Conn.Execute(sql)
Call fecha_conexao1()
Response.Redirect "administrador.asp"
'----------------------------------------------------------------------------------
Else
Response.Redirect "painel.asp"
End If
%>
config.asp
<%Session.LCID = 1046%>
funcoesupload.asp
<%
' Upload Sem componentes ---------------------------------------
Sub BuildUploadRequest(RequestBin)
on error resume next
PosBeg = 1
PosEnd = InStrB(PosBeg, RequestBin, getByteString(Chr(13)))
boundary = MidB(RequestBin, PosBeg, PosEnd - PosBeg)
BoundaryPos = InStrB(1, RequestBin, boundary)
Do Until (BoundaryPos = InStrB(RequestBin, boundary & getByteString("--")))
Dim UploadControl
Set UploadControl = CreateObject("Scripting.Dictionary")
Pos = InStrB(BoundaryPos, RequestBin, getByteString("Content-Disposition"))
Pos = InStrB(Pos, RequestBin, getByteString("name="))
PosBeg = Pos + 6
PosEnd = InStrB(PosBeg, RequestBin, getByteString(Chr(34)))
Name = getString(MidB(RequestBin, PosBeg, PosEnd - PosBeg))
PosFile = InStrB(BoundaryPos, RequestBin, getByteString("filename="))
PosBound = InStrB(PosEnd, RequestBin, boundary)
If PosFile <> 0 And (PosFile < PosBound) Then
PosBeg = PosFile + 10
PosEnd = InStrB(PosBeg, RequestBin, getByteString(Chr(34)))
FileName = getString(MidB(RequestBin, PosBeg, PosEnd - PosBeg))
UploadControl.Add "FileName", FileName
Pos = InStrB(PosEnd, RequestBin, getByteString("Content-Type:"))
PosBeg = Pos + 14
PosEnd = InStrB(PosBeg, RequestBin, getByteString(Chr(13)))
ContentType = getString(MidB(RequestBin, PosBeg, PosEnd - PosBeg))
UploadControl.Add "ContentType", ContentType
PosBeg = PosEnd + 4
PosEnd = InStrB(PosBeg, RequestBin, boundary) - 2
Value = MidB(RequestBin, PosBeg, PosEnd - PosBeg)
Else
Pos = InStrB(Pos, RequestBin, getByteString(Chr(13)))
PosBeg = Pos + 4
PosEnd = InStrB(PosBeg, RequestBin, boundary) - 2
Value = getString(MidB(RequestBin, PosBeg, PosEnd - PosBeg))
End If
UploadControl.Add "Value", Value
UploadRequest.Add Name, UploadControl
BoundaryPos = InStrB(BoundaryPos + LenB(boundary), RequestBin, boundary)
Loop
End Sub
Function getByteString(StringStr)
For i = 1 To Len(StringStr)
Char = Mid(StringStr, i, 1)
getByteString = getByteString & ChrB(AscB(Char))
Next
End Function
Function getString(StringBin)
getString = ""
For intCount = 1 To LenB(StringBin)
getString = getString & Chr(AscB(MidB(StringBin, intCount, 1)))
Next
End Function
' Fim upload sem Componentes -----------------------------------------
%>
Mude o head da página que solicita os dados para que ele fique assim
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
Na página que responde os dados colocar isso antes do retorno co conteúdo (logo no topo):
<%
Response.AddHeader "Content-Type", "text/html; charset=utf-8"
Response.AddHeader "Pragma", "no-cache"
response.Charset="utf-8"
%>
coloquei na form.asp
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
inseri.asp
<%
Response.AddHeader "Content-Type", "text/html; charset=utf-8"
Response.AddHeader "Pragma", "no-cache"
Response.Charset="utf-8"
%>
le corretamente, porem grava com caracteres invalidos ainda
antes de gravar no bd, faça a substituição com Replace e depois insira no bd
no campo inseri.asp ja esta as linhas abaixo antes de todos as outras linhas
<%
Response.AddHeader "Content-Type", "text/html; charset=utf-8"
Response.AddHeader "Pragma", "no-cache"
Response.Charset="utf-8"
%>
tente gravar assim e depois recupere os dados e exiba-os para ver como estarao aparecendo.
Ainda nao, esta cadastrando com os invalidos.
verifique se o MySQL elçe esta como
ISO-8859-1
Onde posso verificar isso? No Mysql query browser tem alguma opção?
O PHP trabalha por padrão com ISO-8859-1, que são os caracteres latinos que estamos acostumados. Entretanto, o UTF-8 tem uma abrangência maior de caracteres e o ideal seria que nos acostumássemos a usar este charset nas páginas.
Este pequeno tutorial tem como objetivo deixar bem claro quais os passos a se tomar para construir uma aplicação totalmente baseada no charset UTF-8, desde as páginas HTML, passando pelo PHP e por fim no MySQL.
Antes de tudo, aconselho que aprenda a criar os seus arquivos utilizando o UTF-8 sem BOM, que evitará dores de cabeça futuras quando estiver trabalhando com cookies, sessões e headers.
O segundo passo é definir, no PHP que o charset dos arquivos que serão gerados terão a codificação UTF-8, com o seguinte código:
<?php
ini_set('default_charset','UTF-8');
?>
Só setar o charset no PHP não adianta muito, pois alguns navegadores usam a codificação padrão da região do usuário, a não ser que o seguinte código esteja entre as tags <head> e </head>:
<meta http-equiv="Content-type" content="text/html; charset=UTF-8" />
Com isso, você já pode trabalhar tranquilamente com UTF-8 e PHP sem ter problemas com os caracteres.
Alguns cuidados são necessários quando for trabalhar com o MySQL, entretanto. Vou ensinar como se faz pelo PHPMyAdmin, que acredito que todos que começaram a trabalhar com MySQL estão acostumados.
Em primeiro lugar, ao criar o seu banco de dados, já crie usando o collation utf8_general_ci. Se o banco de dados já tiver um collation definido, não é necessário definir o collation das tabelas, pois elas herdarão o do banco. Mas mesmo assim é bom especificar o charset e collation de cada tabela. Como? Assim:
CREATE TABLE Clientes (
id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
nome VARCHAR(60) NOT NULL,
PRIMARY KEY(id)
)
TYPE=InnoDB CHARACTER SET utf8 COLLATE utf8_general_ci;
Ok. Nossa tabela está trabalhando com UTF-8 agora. Podemos começar a programar e relaxar porque nossos problemas com charset estão resolvidos, certo?
A resposta é não.
Se você continuar a programar com o sistema assim, os dados do banco serão inseridos e consultados de maneira correta, mas você vai perceber problemas quando tentar fazer buscas com palavras acentuadas insensível a maiúsculas, por exemplo: Água, água e agua serão palavras totalmente diferentes, sem contar que a ordenação de resultados com palavras que começam com letras acentuadas sairá bem bagunçada, coma letra Ó vindo antes de B, por exemplo.
Esse é o problema que eu tive e que demorei eras pra descobrir. O banco estava OK, o PHP também, o mesmo com as páginas HTML… e quando eu inseria algum dado pelo PHPMyAdmin, este era inserido corretamente, o que significava que o problema não era no banco e sim na aplicação.
Depois de meses na verdade foram apenas algumas horas de pesquisa, desconfiei que havia algo na conexão com o MySQL que estava dando esse problema. Fui fuçar no Manual do PHP e encontrei a seguinte solução:
<?php
ini_set('default_charset','UTF-8'); // Para o charset das páginas e
mysql_set_charset('utf8'); // para a conexão com o MySQL
?>
Com isso todos os meus problemas foram resolvidos. Na verdade não, pois tive que alterar todos os campos acentuados da tabela…
Dá para usar a função mysql_client_encoding para identificar o charset da conexão com o MySQL, mas não acho necessário pra quem quer trabalhar diretamente com UTF-8 e não com vários charsets.
poste seu code