【问题标题】:MySQL encoding problems on iOSiOS 上的 MySQL 编码问题
【发布时间】:2014-01-22 09:57:11
【问题描述】:

所以我正在构建一个将 POST 变量插入 MySQL 数据库的 PHP 站点。整个网站采用 UTF8 编码以支持希伯来语文本。

它在桌面上运行良好,但在 iOS 中,由于某种原因,该网站会在乱码中插入变量。

这是 PHP 代码示例:

$con=mysqli_connect("xxx","xxx","xxx","xxx");
// Check connection
if (mysqli_connect_errno())
{
  echo "Failed to connect to MySQL: " . mysqli_connect_error();
}

$fullPhone=$_POST[prefix].''.$_POST[phone];
$sql="INSERT INTO testtab (fbName, fbId, fbComment, name, email, phone)
VALUES('$_POST[fbName]','$_POST[fbID]','$_POST[fbComment]','$_POST[name]','$_POST[email]','$fullPhone')";

if (!mysqli_query($con,$sql))
{
  die('Error: ' . mysqli_error($con));
}

mysqli_close($con);

【问题讨论】:

  • 举一两个例子来说明数据究竟是如何损坏的可能会有所帮助。此外,“该站点在乱码中插入变量”,但是您在哪里看到这些乱码?在 iOS 应用程序中?数据在 iOS 上是如何显示的?
  • 我在 PHP 文件中打印表格时看到了乱码。来自 PC 的所有希伯来语信息都正确显示,但来自 ios 的信息显示为符号。
  • 顺便说一句,永远不要只使用这些 $_POST 值构建 SQL:调用 mysqli_real_escape_string 或将值绑定到 ? 占位符。
  • 是的,好吧。当您不提供有关数据如何在 iOS 设备上输入和/或显示的任何信息时,仍然很难弄清楚 iOS 角度可能是什么。如果这就是不良数据的来源,那么有关如何创建和传输这些数据的一些细节似乎至关重要。
  • 嘿 Rob,mysqli_real_escape_string 防止了什么?使用 $_POST 值有什么风险?

标签: php mysql ios utf-8 encode


【解决方案1】:

我昨天遇到了类似的问题,智能引号和其他 unicode 字符。我的解决方案是确保 MySQL 连接设置为 UTF-8 以及表和 HTML。这是一个例子:

$conn = mysql_connect($dbhost, $dbuser, $dbpass) or die ('Error connecting to the database');

if (!mysql_set_charset('utf8', $conn)) {
    echo "Error: Unable to set the character set.\n";
    exit;
}

【讨论】:

    【解决方案2】:

    将此添加到您的连接中:

    //if i want to work with hebrew databases
    mysql_query("SET NAMES 'utf8'",$connection);//reading hebrew from phpadmin database - only for hebrew sites
    

    像这样:

    $con=mysqli_connect("xxx","xxx","xxx","xxx");
    // Check connection
    if (mysqli_connect_errno())
    {
      echo "Failed to connect to MySQL: " . mysqli_connect_error();
    }
    
    //if i want to work with hebrew databases
    mysql_query("SET NAMES 'utf8'",$con);//reading hebrew from phpadmin database - only for hebrew sites
    
    $fullPhone=$_POST[prefix].''.$_POST[phone];
    $sql="INSERT INTO testtab (fbName, fbId, fbComment, name, email, phone)
    VALUES('$_POST[fbName]','$_POST[fbID]','$_POST[fbComment]','$_POST[name]','$_POST[email]','$fullPhone')";
    
    if (!mysqli_query($con,$sql))
    {
      die('Error: ' . mysqli_error($con));
    }
    
    mysqli_close($con);
    

    【讨论】:

    • 我使用了 $con->query("SET NAMES 'utf8'");它解决了这个问题。非常感谢!!
    【解决方案3】:

    我从您正在做的其他 cmets 中收集到 SET NAMES 来设置字符集:

    $con->query("SET NAMES 'utf8'");
    

    但很明显,您可能希望使用 mysqli_real_escape_string 或手动将值绑定到 SQL 中的 ? 占位符,以保护自己免受 SQL injection attacks 以及在您的字段中更无辜地使用撇号的影响。

    但是,如果您执行参数的mysqli_real_escape_string,则可能需要使用mysqli_set_charset 而不是上面的SET NAMES SQL:

    $con->set_charset('utf8');
    

    另一方面,如果您通过在 SQL 中使用 ? 占位符来解决 SQL 注入问题,然后使用 mysqli_stmt_bind_param 将值绑定到这些占位符,那么我认为使用 @ 并不重要987654336@ 或SET NAMES SQL 语法。

    有关SET NAMESmysqli_set_charset 之间不同行为的注释,请参阅Character Sets Concepts 讨论。

    【讨论】:

    • 很多有用的信息让我知道。非常感谢!
    猜你喜欢
    • 2016-07-17
    • 1970-01-01
    • 1970-01-01
    • 2010-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多