0

Buenas el problema consiste que queria evitar que el usuario combinara el uso de mayusculas y minusculas use las funciones de php strtolower y ucwords pero al momento de guardarse en la base de datos los caracteres especiales (ñ, tildes) se guarda con los signos ?.
Ejemplo: si introduzco peña lo guarda como Pe?a.

Sin embargo intente quitando las funciones y lo guarda perfectamente. Estare usando algo mal o hay otra manera mas efectiva para evitar la combinacion de mayuscula y minuscula?

Parte del codigo donde lo aplico:

if (isset($_POST['regusu'])){
    $nombre = ucwords(strtolower($_POST['nombre']));
    $apellido = ucwords(strtolower($_POST['apellido']));
    $seccion = ucwords(strtolower($_POST['seccion']));
    $cargo = ucwords(strtolower($_POST['cargo']));
    $sucursal = ucwords(strtolower($_POST['sucursal']));
    $funcion->AgCliente($nombre,$apellido,$seccion,$cargo,$sucursal);       
}
Brigido
  • 152
  • 1
  • 11
  • 3
    Posible duplicado de [¿Por que el Carácter inspector (�) aparece en algunos datos obtenidos de la Base de Datos?](https://es.stackoverflow.com/questions/59489/por-que-el-car%c3%a1cter-inspector-aparece-en-algunos-datos-obtenidos-de-la-base). El por qué ocurre eso es explicado ampliamente en la respuesta aceptada de esa pregunta. Conviene que resuelvas el problema de raíz aplicando una codificación adecuada por niveles. Lo más recomendable es tener `utf-8` en todos los niveles: HTML, servidor, base de datos. – A. Cedano Aug 07 '18 at 21:34
  • 1
    ya lo habia visto por un problema anterior y lo solucione ahora como dije en la pregunta si no le aplico las funciones strtolower ni el ucwords los guarda correctamente – Brigido Aug 07 '18 at 21:58
  • ¿Tienes `utf-8` en todo como indica la respuesta? Estoy seguro de que en alguna parte no estás aplicando la codificación y por eso te está dando problemas. – A. Cedano Aug 07 '18 at 22:07
  • versión de php? – alo Malbarez Aug 07 '18 at 22:10
  • si he verificado todos los niveles el html le tengo aplicado igual a la conexion (uso PDO) y la base de datos las tablas todo esta en "utf8_general_ci" lo que me faltaba era la configuracion del php ya la agregue pero al momento de guardar no transforma a mayuscula la primera letra si es que contiene caracter especial las demas letras si las guarda correctamente – Brigido Aug 08 '18 at 14:38

3 Answers3

2

en la función strtolower puedes usar mb_strtolower y pasarle como segundo parámetro UTF-8

mb_strtolower($_POST['cargo'], 'UTF-8');
  • muchas gracias los guarda correctamente solo que si la palabra empieza con signo especial no le aplica la mayúscula – Brigido Aug 07 '18 at 21:59
  • 1
    @Brigido estamos en lo mismo: **aplicando soluciones a medio camino**. Si te está pasando eso es porque no has aplicado la codificación correcta en alguna parte de los datos. Cualquier función de PHP funcionará adecuadamente cuando aplicas una correcta codificación **por niveles**, o te tendrás que conformar a aplicar `UTF-8` por todas partes, como se indica precisamente en esta respuesta. – A. Cedano Aug 07 '18 at 22:05
  • 2
    al inicio del código puedes intentar **mb_internal_encoding('UTF-8');** pero tiene razón @A.Cedano si tienes acceso al servidor puedes instalar **php-mbstring** y codificar la base de datos para que use utf8 – Jose Luis Esparza Aug 07 '18 at 22:17
0

Sí no te interesa "perder" de alguna forma los caracteres que generan problemas te adjunto esta función de PHP.

<?php    
    function sanear_string($string)
    {

        $string = trim($string);

        $string = str_replace(
            array('á', 'à', 'ä', 'â', 'ª', 'Á', 'À', 'Â', 'Ä'),
            array('a', 'a', 'a', 'a', 'a', 'A', 'A', 'A', 'A'),
            $string
        );

        $string = str_replace(
            array('é', 'è', 'ë', 'ê', 'É', 'È', 'Ê', 'Ë'),
            array('e', 'e', 'e', 'e', 'E', 'E', 'E', 'E'),
            $string
        );

        $string = str_replace(
            array('í', 'ì', 'ï', 'î', 'Í', 'Ì', 'Ï', 'Î'),
            array('i', 'i', 'i', 'i', 'I', 'I', 'I', 'I'),
            $string
        );

        $string = str_replace(
            array('ó', 'ò', 'ö', 'ô', 'Ó', 'Ò', 'Ö', 'Ô'),
            array('o', 'o', 'o', 'o', 'O', 'O', 'O', 'O'),
            $string
        );

        $string = str_replace(
            array('ú', 'ù', 'ü', 'û', 'Ú', 'Ù', 'Û', 'Ü'),
            array('u', 'u', 'u', 'u', 'U', 'U', 'U', 'U'),
            $string
        );

        $string = str_replace(
            array('ñ', 'Ñ', 'ç', 'Ç'),
            array('n', 'N', 'c', 'C',),
            $string
        );

        //Esta parte se encarga de eliminar cualquier caracter extraño
        $string = str_replace(
            array("¨", "º", "-", "~",
                 "#", "@", "|", "!", '"', "'", "¡",
                 "¿", "[", "^", "<code>", "]",
                 "+", "}", "{", "¨", "´",
                 ">", "< ", ";", ",", ":",
                 "."),
            '',
            $string
        );


        return $string;
    }
?>

La use bastantes veces, fuente.

Es cierto que respetando el "encoding" UTF-8 soluciona ese problema, pero a veces me encontré que cambiando estableciendo UTF-8 tanto en HTML, como del lado de PHP y SQL los problemas persistían. Saludos.

Juanjoo Tocino
  • 579
  • 2
  • 11
  • Muchos programadores omiten establecer `utf-8` por ejemplo cuando se crea el objeto que conecta a la base de datos y por eso hay problemas con la codificación, teniendo que recurrir a funciones como la tuya, la cual con todo respeto es *reinventar la rueda*. Si se establece una codificación adecuada en todos los niveles no necesitamos usar funciones externas para codificar la información, pues HTML, PHP y las bases de datos ya cuentan con esa configuración, entonces hay que configurar cada fuente adecuadamente y listo. – A. Cedano Aug 07 '18 at 23:11
  • Hola, reconozco que no es el método adecuado, pero en la "vida real" quizá puede ayudar a resolver una problemática rápidamente, siempre y cuando los caracteres especiales no sean relevantes. Tampoco es que uso este método siempre, solo en algunas ocasiones. Saludos. – Juanjoo Tocino Aug 07 '18 at 23:28
  • Es toy deacuerdo con @A.Cedano, la función que planteas esta pensada para otra cosa, en la "vida real" se pueden hacer parches o hacer las cosas bien, y esto en este contexto es un parche malo, no una solución. Si alguna vez no te fue suficiente con cambiar alguna codificación, es seguro por qué existían otras codificaciones que no tuviste encuenta. – Xerif Aug 08 '18 at 11:18
0

La configuración del HTML Colocar lo siguiente en el :

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

La configuración del servidor (PHP u otro) En el caso de PHP: Podemos usar mb_internal_encoding:

mb_internal_encoding("UTF-8");

O bien: default_charset (Desde PHP 5.6+ viene establecido a UTF-8 por defecto).

ini_set("default_charset", "UTF-8");