Comunidad PHPeros
Lenguajes => JavaScript => AJAX => Mensaje iniciado por: ryksz en 05 de Octubre de 2011, 00:41:48 am
-
Saludos!
Tuve Problemas hace poco, pues usaba el charset= iso-8895-1 en mis documentos HTML, ya que AJAX trabaja con UTF-8 (o eso creo entender) y los resultados que traía no venían con caracteres como"ñ", "ç", o acentos. Haciendo pruebas el día de hoy cree esta página:
<!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>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
<script type="text/javascript">
function crearAjax()
{
var xmlhttp = false;
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else
{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
return xmlhttp;
}
function buscaNombre(nombre)
{
if(nombre=="")
{
document.getElementById('mostrar').innerHTML="";
return;
}
Pedido=crearAjax();
Pedido.open('GET','qry/res.php?q='+nombre,true);
Pedido.onreadystatechange=function()
{
if(Pedido.readyState==4 && Pedido.status==200)
{
document.getElementById('mostrar').innerHTML=decodeURIComponent(Pedido.responseText);
}
}
//decodeURIComponent(Pedido
Pedido.send();
}
</script>
</head>
<body>
<form action="" method="post">
<label>Nombre</label>
<?php
include('qry/db.php');
$query="SELECT * FROM empleados";
$result=DBExecute($query,$link,1);
?>
<select id="nom" onchange="buscaNombre(this.value)">
<?php while($row=mysql_fetch_row($result)){echo"<option value='$row[1]'>$row[1]</option>";} ?>
</select>
<br />
</form>
<div id="mostrar">
<?php include('qry/res.php'); ?>
</div>
</body>
</html>
Los resultados siguen sin traer caracteres especiales a pesar de estar usando utf-8 y con UTF-8 ni siquierea los trae al hacer un query sin uso de ajax, para eso he de usar UTF-8-ci o volver a iso-8895-1...
No sé que puedo estar haciendo mal, y estoy a poco de volarme la cabeza :( alguien me puede dar algún consejo?? :confused: gracias
este es el sql de la base de datos
-- phpMyAdmin SQL Dump
-- version 3.3.9
-- http://www.phpmyadmin.net
--
-- Servidor: localhost
-- Tiempo de generación: 04-10-2011 a las 17:30:19
-- Versión del servidor: 5.5.8
-- Versión de PHP: 5.3.5
SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
--
-- Base de datos: `prueb`
--
-- --------------------------------------------------------
--
-- Estructura de tabla para la tabla `empleados`
--
CREATE TABLE IF NOT EXISTS `empleados` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`nombre` varchar(20) COLLATE utf8_unicode_ci NOT NULL,
`apellido` varchar(20) COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=9 ;
--
-- Volcar la base de datos para la tabla `empleados`
--
INSERT INTO `empleados` (`id`, `nombre`, `apellido`) VALUES
(1, 'Arturo', 'Ramirez'),
(3, 'Alba', 'Ramirez'),
(5, 'Diana', 'No sé'),
(7, 'ççç', 'ño');
y este el archivo res.php
<?php
include('db.php');
$query="SELECT apellido FROM empleados WHERE nombre='$q'";
$result=DBExecute($query,$link,1);
echo"
<table>
<tr>
<th>Apellido</th>
<tr>";
while($row=mysql_fetch_row($result))
{
echo"<tr><td>";$thisShit=utf8_decode($row[0]);echo"$thisShit</td></tr>";
}
echo"</table>";
?>
-
No se si sea la mejor forma pero yo use htmlspecialchars() y con esto se arreglo.. puedes intentarlo xD
-
Pues me da los mismos resultados, quizá deba averiguar antes como usar propiamente la función :P
Gracias
-
Disculpa me confundí, es con htmlentities() no con specialchars, intentalo de esta forma:
<?php
include('db.php');
$query="SELECT apellido FROM empleados WHERE nombre='$q'";
$result=DBExecute($query,$link,1);
echo"
<table>
<tr>
<th>Apellido</th>
<tr>";
while($row=mysql_fetch_row($result))
{
echo"<tr><td>";$thisShit=utf8_decode(htmlentities($row[0]));echo"$thisShit</td></tr>";
}
echo"</table>";
?>
-
Ah muchas gracias!! eso arregló mis problemas aunque solo en Chrome... ??? jaja
Explorer8, 9 y Firefox 7.0.1 aún me presentan mal los acentos y eso... Por lo pronto está solución me ayuda a seguir el desarrollo, pero, crees que el problema con los otros exploradores se deba a como creo el AJAX? Pues este código lo vengo usando desde el Explorer 7 :D habrá alguna mejor forma de hacerlo?
function crearAjax()
{
var xmlhttp = false;
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else
{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
return xmlhttp;
}
Antes de esto intenté establecer en la cabecera el charset=iso-8859-1, eso ayudó en alguna medida pero, solo presentando los resultados ya que al hacer querys en la base de datos si busco por nombre y hay un caracter como "ç" no encuentra nada pues busca otra cosa...
Gracias de nuevo 8)
-
El código no influye en nada cuando la codificación del archivo se encuentra mal.
Revisa que la codificación de tu archivo este en utf8.
Saludos.
-
No, no. El error no está en cambiar htmlspecialchars() por htmlentities(), sino usar iso-8859-1, yo lo uso y me funciona sin problemas ( iso-8859-1 + htmlspecialchars() y me sale todo bien, uso chrome ).
Ahora, el problema a lo mejor está en Javascript, si usas la librería jQuery puedes usar esto para que funcione sin problemas:
//$.get para get, $.post para post
$.get('/ruta/hacia/mi/archivo.php', 'parametro=hola&id=2&ejemplo=3', function(respuesta){
document.getElementById('resultado').innerHTML = respuesta;
});
Te lo explico:
# $.get || $.post -> métodos que AJAX soporta, GET y POST
# primer parámentro $.get / $.post: ruta del archivo a llamar
# segundo parámetro: datos que se pasan al archivo, como si fuera archivo.php?algo=algo&mas=1 ......
# tercer parámetro: función que se evaluará cuando llegue la respuesta
## nota: puse function(respuesta) <-- "respuesta" es la variable en la que se guardará el resultado, puedes cambiarla por cualquiera, es cuestión de comodidad ( es decir, puedes usar cualquier nombre para la variable, no tiene por qué ser "respuesta" )
-------
Y si no usas jQuery, prueba el método que te dije ( la página que recibe los datos ha de tener sí o sí el charset ).
Me he fijado de que pones '?q=' + nombre, si el valor de la variable tiene caracteres especiales, puedes usar encodeURIComponent() ( más info (http://www.w3schools.com/jsref/jsref_encodeuricomponent.asp) )
Saludos