当我想在MYSQL中插入克罗地亚字母(č,ć,š,đ,ž)时,我的功能有什么问题

时间:2014-05-11 20:02:40

标签: php mysql sql utf-8

我在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(); 
}

我的问题是第一个代码出了什么问题,我需要在第一个代码中编辑什么?简短说明

5 个答案:

答案 0 :(得分:2)

正如我从文档中读到的那样,将过滤器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:剥离数值<32的字符 FILTER_FLAG_STRIP_HIGH:删除数值> 127

的字符

有关详情,请参阅filters sanitize上的文档和filter flags上的相关文档。

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

答案 1 :(得分:1)

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

您需要文字值,而不是&#39;过滤&#39;,因为数据库层处理编码等。您可以使用mysqli语句(好!),但不要使用filter_input()。< / p>

要了解差异,您应该var_dump()这两个值:

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

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

答案 2 :(得分:0)

尝试:utf8_encode(filter_input(INPUT_POST,&#39; nazivpredmeta&#39;,FILTER_SANITIZE_STRING));

答案 3 :(得分:0)

在运行实际查询之前,请确保连接是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中删除。

答案 4 :(得分:0)

之前我只需添加$ mysqli-&gt; set_charset(&#39; utf8&#39;); 现在这两个代码都有效。