【问题标题】:What is wrong with my function when I want to insert Croatian letters (č,ć,š,đ,ž) in MYSQL当我想在 MYSQL 中插入克罗地亚字母(č、ć、š、đ、ž)时,我的函数出了什么问题
【发布时间】:2014-06-29 02:58:14
【问题描述】:

我在 mysql 库中插入数据时遇到问题。我正在使用下面的代码。一切正常,但是当我插入“克罗地亚”字母 (č,ć,š,đ,ž) 时,我在基数中收到错误的字母(类似于“Ä,ć,Å¡,Ä‘,ž”)。我的mysql表是utf8_croatian_ci

if (isset($_POST['nazivpredmeta'])) { 
$nazivpredmeta = filter_input(INPUT_POST, 'nazivpredmeta', FILTER_SANITIZE_STRING); 
if ($insert_stmt = $mysqli->prepare("INSERT INTO predmet (ImePredmeta) VALUES (?)"))
   {
    $insert_stmt->bind_param('s', $nazivpredmeta); 
    if (! $insert_stmt->execute())
       { 
        header('Location: ../error.php?err=Greska: INSERT');
       } 
  } 
header('Location: ./index.php?page=predmeti&unospredmeta=OK');
}

但是当我使用下面的代码时,一切正常,对于克罗地亚字母,我得到了正确的字母。

if (isset($_POST['nazivpredmeta'])) { 
$naziv = $_POST['nazivpredmeta']; 
$sqlquery="INSERT INTO predmet (ImePredmeta) VALUES ('$naziv')"; 
$results = mysql_query($sqlquery); 
if (mysql_error()) echo "GREŠKA! ".mysql_errno().":".mysql_error(); 
}

我的问题是第一个代码有什么问题以及我需要在第一个代码中编辑什么???以及简短的解释

【问题讨论】:

  • 什么是表结构?包括数据类型。
  • 不要使用filter_input()。它是那些奇怪的遗留 PHP 函数之一。您需要文字值,因为 db 层处理编码等。您可以使用 mysqli 语句(好!),但不要使用 filter_input()
  • 页面使用的是什么编码?
  • 表格有两个字段。首先是primary_key(AUTO_INCREMENT),其次是ImePredmeta varchar(50),utf8_croatian_ci
  • 页面在 中有这个链接

标签: php mysql sql utf-8


【解决方案1】:

试试:utf8_encode(filter_input(INPUT_POST, 'nazivpredmeta', FILTER_SANITIZE_STRING));

【讨论】:

  • 我尝试了你的建议,但没有。
【解决方案2】:

在运行实际查询之前,请尝试确保连接为UTF8。所以这个:

if ($insert_stmt = $mysqli->prepare("INSERT INTO predmet (ImePredmeta) VALUES (?)"))

会变成这样:

if ($insert_stmt = $mysqli->prepare("SET NAMES UTF8; INSERT INTO predmet (ImePredmeta) VALUES (?)"))

或者可以这样做:

$mysqli->query($this->connecDB, "SET NAMES 'utf8'");
if ($insert_stmt = $mysqli->prepare("INSERT INTO predmet (ImePredmeta) VALUES (?)"))

另外,不相关但值得指出的是,在他调用$mysqli->prepare() 的第一段代码中,但在接下来的代码中——你说一切正常——你使用的是mysql_query()。虽然在技术上不是 100% 错误,但您这样做是在混合 mysql_*mysqli_* 扩展名,这可能会在这种情况下导致无意的认罪。您应该坚持使用mysqli_*,因为mysql_* 已被贬值,将在 PHP 5.5 中被淘汰。

【讨论】:

    【解决方案3】:

    不要使用filter_input()。它是那些奇怪的遗留 PHP 函数之一。

    您需要文字值,而不是“过滤”,因为 db 层处理编码等。您可以使用 mysqli 语句(好!),但不要使用 filter_input()

    要查看差异,您应该var_dump() 两个值:

    var_dump(filter_input(INPUT_POST, 'nazivpredmeta', FILTER_SANITIZE_STRING));
    var_dump($_POST['nazivpredmeta']);
    

    使用更多功能并不总是更好 =)

    【讨论】:

    • 我尝试了你的建议,但没有。
    • 你做了var_dump()s 吗?有什么不同?将其添加到问题中。
    • 将输出添加到问题中。不可能是一样的。
    【解决方案4】:

    这是过滤器 FILTER_SANITIZE_STRING 与纯 ASCII 以外的任何其他内容的结合使用,正如我从文档中看到的那样。

    FILTER_SANITIZE_STRING
    

    设置以下 filter_flags:

    FILTER_FLAG_NO_ENCODE_QUOTES, 
    FILTER_FLAG_STRIP_LOW, 
    FILTER_FLAG_STRIP_HIGH, 
    FILTER_FLAG_ENCODE_LOW, 
    FILTER_FLAG_ENCODE_HIGH, 
    FILTER_FLAG_ENCODE_AMP
    

    FILTER_FLAG_STRIP_LOW: 去除数值 FILTER_FLAG_STRIP_HIGH: 去除数值 >127 的字符

    有关更多信息,请参阅filters sanitize 上的文档和filter flags 上的相关文档。

    所以这个过滤器只适用于纯 ASCII 并且应该完全避免。

    【讨论】:

    • 迄今为止对非 MySQL 连接问题的最佳评估!
    • 问题不在于过滤和过滤标志。我尝试了你建议的一切,但什么也没发生,或者最糟糕的是,因为现在我的基地里有空地。此过滤器清除所有输入,没有任何通过。如果没有过滤器,我也会遇到同样的问题。
    【解决方案5】:

    在一切之前我只添加 $mysqli->set_charset('utf8'); 现在两个代码都可以工作了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-13
      • 2012-01-19
      • 1970-01-01
      • 1970-01-01
      • 2014-07-11
      • 1970-01-01
      • 1970-01-01
      • 2020-03-30
      相关资源
      最近更新 更多