HTML-форма с испанскими символами неправильно отображается в базе данных MySQL - PullRequest
0 голосов
/ 17 октября 2010

Итак, я отправляю данные в базу данных MySQL через форму HTML.

Когда я отправляю слово со специальными символами, такими как «ñ» или акценты «á, é, í ..» и когда я проверяю результат в таблицах, эти символы отображаются как «ã ±».

Я попробовал почти все:

мой заголовок страницы HTML-формы имеет

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

Форма принимает UTF-8 с <form accept-charset="UTF-8">

Я также добавил в свой скрипт php действия:

mysql_query("SET NAMES 'utf8'");
mysql_query("SET CHARACTER SET'utf8'");

Тогда я попробовал htmlentities

но все "-" отображались как &atilde;&

Моя база данных, таблицы и поля установлены в utf8_general_ci, также пробовал utf8_spanish_ci, но ничего не изменилось.

Я не знаю, что еще делать, я что-то еще здесь пропускаю?

Это скрипт PHP, который я использую:

<?php
// Make a MySQL Connection
$con = mysql_connect("I DELETED THIS");
if (!$con)
{
die('No se pudo conectar a la BD: ' . mysql_error() );
}

mysql_select_db("ldma", $con);

$nombre  = ''; 
$ape1   = ''; 
$ape2   = ''; 
$apodo = ''; 
$errmsg = '';

if ($_POST['enviado']==1)
{
   $nombre   = $_POST['nombre'];
   $ape1   = $_POST['ape1'];
   $ape2 = $_POST['ape2'];
   $apodo = $_POST['apodo'];

   $permitidos = "abcdefghijklmnopqrstuvwxyzÁÉÍÓÚÜüáéíóúñÑABCDEFGHIJKLMNOPQRSTUVWXYZ"; 
   for ($i=0; $i<strlen($nombre); $i++)
   { 
      if (strpos($permitidos, substr($nombre,$i,1))===false)
      {$errmsg = 1; }
         else
         {$errmsg = '';} 


   } 

    /*if (ereg('^[ a-zA-Zñ]+$', $nombre)) 
        {$errmsg = '';
        } 
        else 
        {$errmsg = 1;
        }*/


    if(strlen($nombre) == 0 || strlen($nombre) <= 3) 
    {$errmsg = 1;} 
        else if (strlen($nombre) > 20) 
            {$errmsg = 1;} 

    if(strlen($ape1) == 0 || strlen($ape1) <= 3) 
    {$errmsg = 1;} 
        else if (strlen($ape1) > 15) 
            {$errmsg = 1;} 

    if(strlen($ape2) == 0 || strlen($ape2) <= 3) 
    {$errmsg = 1;} 
        else if (strlen($ape2) > 15) 
            {$errmsg = 1;} 

    if(strlen($apodo) > 15)
    {$errmsg = 1;} 



    if($errmsg == '')
    {

    // Insert a row of information into the table "example"

    $arr = array("nombre", "ape1", "ape2", "apodo"); 
    foreach ($arr as $field)
    {
        $_POST["$field"] = utf8_encode($_POST["$field"]);
        $_POST["$field"] = strtolower($_POST["$field"]);
        $_POST["$field"] = ucwords($_POST["$field"]);
    }

    $sql= "INSERT INTO **** (nombre, ape1, ape2, apodo) 
            VALUES ('$_POST[nombre]', '$_POST[ape1]', '$_POST[ape2]', '$_POST[apodo]')" ;

    if (!mysql_query($sql, $con))
        {
        echo "<center><br /><h2>Al parecer este maestro ya existe, intenta de nuevo.</h2></center> ";
        }
        else {
            echo "<center><br /><h2>Gracias, el maestro ha sido agregado. </h2></center> ";
            }
    }

}

if($errmsg == 1)
    { echo "<center><br/><br/><h2><u>Error: Revisa los datos e intenta de nuevo.</u></h2> </center>
            <center><h2>Recuerda que es recomendable </h2> </center> 
            <center><h2>activar JavaScript en las opciones de tu navegador. </h2></center>";
    }

/*if ($_POST['enviado'] != 1)
    {
    echo 'Error: No se agregaron los datos';
    }*/


mysql_close($con);

?>

Ответы [ 3 ]

1 голос
/ 17 октября 2010

Ваша ошибка - использование не многобайтово-безопасных строковых функций:

 $_POST["$field"] = strtolower($_POST["$field"]);
 $_POST["$field"] = ucwords($_POST["$field"]);

Использование многобайтовых строковых функций .

Помимо этого,ваша форма уязвима для SQL-инъекции , что вам нужно срочно исправить .

0 голосов
/ 01 марта 2013

просто используйте mysql_real_escape_string () больше ничего не нужно делать.например: mysql_real_escape_string ($ user), mysql_real_escape_string ($ password));

0 голосов
/ 06 марта 2011

Почему вы так беспокоитесь о том, как ваши данные отображаются в phpmyAdmin? Важно то, что при правильном отображении их на html-странице вы получаете правильный дисплей.

вы можете в конечном итоге получить правильное отображение в базе данных, но тогда вы можете иметь неправильное отображение в HTML


Но я думаю, что заданные имена делают свою работу, это помогло мне решить проблему, даже со строкой

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...