【问题标题】:HTML form with spanish characters displayed wrong in MySQL database带有西班牙语字符的 HTML 表单在 MySQL 数据库中显示错误
【发布时间】:2011-04-26 13:06:18
【问题描述】:

所以我通过 HTML 表单将数据发送到我的 MySQL 数据库。

当我发送带有特殊字符(如“ñ”或重音符号“á、é、í..”的单词时,当我在表格中检查结果时,这些字符显示为“ã±”。

我几乎尝试了所有方法:

我的html表单页眉有

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

表单接受带有<form accept-charset="UTF-8">的UTF-8

我还添加到我的动作 php 脚本中:

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

然后我尝试了htmlentities

但所有的“ñ”都显示为ã&

我的数据库、表和字段设置在 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);

?>

【问题讨论】:

  • 您在哪里使用什么代码检查表格中的结果?
  • 我检查了我的 phpMyAdmin 中添加的表格、字段和数据。
  • @Danny 如果您在 HTML 页面中再次输出该数据会发生什么? ã± 几乎可以肯定是 UTF-8 字符的 ISO-8859-1 表示,但尚不清楚它发生在哪里
  • @Pekka 我还没有显示数据的页面,但我也很奇怪在我的 phpmyadmin 中看到“ã±”。另外,我从包含“ñ”字符的文本文件中导入了更多数据并正确显示,此问题仅在从 html 表单添加数据时发生。
  • @Pekka:公平点!错误一定是在其他地方,然后我猜......@Danny,我知道,我只是在开玩笑,但我做这个过滤是没用的。您只需要转义字符串,这就是 Pekka 在他的回答中告诉您的内容。 @Col。 Shrapnel:我知道这听起来很愚蠢,但我记得在文件编码影响变量方面遇到了一些问题。暂时没看懂,下次试试看。

标签: php mysql forms character-encoding


【解决方案1】:

您的错误是使用了非多字节安全的字符串函数:

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

请改用multi-byte string functions

除此之外,您的表单容易受到SQL injection 的攻击,您需要紧急fix

【讨论】:

  • 无论有没有这条线都会出现问题。 (几秒钟前添加了 utf8_encode 看看是否有帮助)。
  • @Danny 好的。你在哪里做你的脚本中的 SET NAMES?
  • @Pekka,我删除了带有 SET NAMES 的行,因为没有帮助,我再次尝试验证它真的没有帮助。
  • @Danny 套装名称应该可以胜任。
  • 好的,所以我再次添加了集合名称,但它删除了特殊“ñ”之后的所有字符。 "striñg" 结果是 "stri"。
【解决方案2】:

您为什么如此担心您的数据在 phpmyAdmin 中的显示方式?重要的是,当您在 html 页面中再次显示它们时,您会得到正确的显示。

你最终可能会在数据库中得到正确的显示,但你可能会在 html 上显示错误


但我认为集合名称可以完成这项工作,即使使用字符串也可以解决我的类似问题

【讨论】:

  • Ahmad 奇怪字符的问题也会影响数据库中的查询,因此(对我而言)正确地为用户和我显示数据很重要。多字节字符串函数为我解决了这个问题。
【解决方案3】:

只需使用 mysql_real_escape_string() 无需做任何其他事情。 例如: mysql_real_escape_string($user), mysql_real_escape_string($password));

【讨论】:

  • @A H K 这是真的吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-04
  • 2017-10-28
  • 2017-05-19
  • 1970-01-01
  • 1970-01-01
  • 2020-07-10
相关资源
最近更新 更多