我在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();
}
我的问题是第一个代码出了什么问题,我需要在第一个代码中编辑什么?简短说明
答案 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;); 现在这两个代码都有效。