sábado, 7 de junio de 2014

Evitar caracteres raros al consultar en Oracle y MySQL desde PHP

En esta ocacion les ofresco una solucion a los molestos caracteres raros que aparecen de repente al realizar una consulta desde PHP a MySQL ó Oracle, Hace poco me sucedio algo similar; al consultar campos que contenian caracteres latinos como ñ, á, é, etc. El resultado de esas consultas me reemplazaba esos caracteres con un "?". Al principio crei que se trataba de la codificacion que se define en la cabecera del documento HTML . Pero despues de varios intentos simplemente no conseguia solucionarlo; hasta que encontre en un post que al realizar una conexion con algun cliente de base de datos a un servidor de base de datos, es necesario establecer la codificacion de caracteres con las que este recibiria la informacion.

Asi que buscando en Google encontre la solucion tanto para MySQL como para Oracle.

Para MySQL la solucion es colocar el metodo:
mysqli_set_charset( mysqli $link , string $charset)
Justo despues de realizar la conexion.

Ejemplo de conexion a MySQL con codificacion de caracteres:

/*
Conexion a una base de datos con el cliente de mysql
usando la codificacion de caracteres UTF-8
para evitar la aparicion de caracteres raros al
realizar una consulta.
*/
//Variables de conexion
$host="ip";
$user="usuario";
$password="password";

$conexion = mysqli_connect($host, $user, $password);

//Se verifica si hubo algun error al conectarse
if (mysqli_connect_errno()) {
    echo("Error al conectarse: \n".mysqli_connect_error());
    exit();
}

//Se establece la codificacion de caracteres UTF-8
if (!mysqli_set_charset($conexion, "utf8")) {
    echo("Error al estableces la codificacion utf8: \n".mysqli_error($conexion));
} else {
    echo("Se ha establecido el conjunto de caracteres: \n".mysqli_character_set_name($conexion));
}

mysqli_close($conexion);
?>


Para Oracle la solucion es establecer la codificacion de caracteres al realizar la conexion con el metodo:
oci_connect( string $username , string $password [, string $connection_string [,string $character_set [, int $session_mode ]]] )

Ejemplo de conexion a Oracle con codificacion de caracteres:
/*
Conexion a una base de datos con el cliente de oracle
usando la codificacion de caracteres de Windows
para evitar la aparicion de caracteres raros al
realizar una consulta.
*/
//Variables de conexion
$host="ip";
$user="usuario";
$password="password";
$conexion = oci_connect($user, $password=, $host.'/XE', 'WE8MSWIN1252');
if (!$conn) {
    $e = oci_error();
    trigger_error(htmlentities($e['mensage'], ENT_QUOTES), E_USER_ERROR);
}

$stid = oci_parse($conn, 'SELECT * FROM empleados');
oci_execute($stid);

while ($row = oci_fetch_array($stid, OCI_ASSOC+OCI_RETURN_NULLS)) {
    foreach ($row as $item) {
        echo ($item !== null ? htmlentities($item, ENT_QUOTES) : "") . "
";
    }
}

?>