我将一些数据从一种形式的数据库。 我使用addslashes
逃脱文本(也尝试过mysql_real_escape_string
具有相同的结果)。
定期引号逃过一劫,但一些其他的报价都没有。 例如,字符串:
荷马的血液变得在教育部的新啤酒的秘方。
被转换为:
荷马\的血液变得在教育部的新啤酒的秘方。
我没想到花报价将此事转义,但只有这个文本插入到数据库:
荷马的血液成为萌的秘诀
所以PHP认为卷曲的报价是好的,但MySQL是失去的字符串。 MySQL是不给任何错误,但。
我将一些数据从一种形式的数据库。 我使用addslashes
逃脱文本(也尝试过mysql_real_escape_string
具有相同的结果)。
定期引号逃过一劫,但一些其他的报价都没有。 例如,字符串:
荷马的血液变得在教育部的新啤酒的秘方。
被转换为:
荷马\的血液变得在教育部的新啤酒的秘方。
我没想到花报价将此事转义,但只有这个文本插入到数据库:
荷马的血液成为萌的秘诀
所以PHP认为卷曲的报价是好的,但MySQL是失去的字符串。 MySQL是不给任何错误,但。
我会看在你的Web界面使用的字符编码,并且在数据库级别使用的不匹配。 如果您的Web界面使用UTF-8,例如,你的数据库使用的MySQL默认编码latin1
,那么你需要设置你的表有DEFAULT CHARSET=utf8
。
使用mysql_real_escape_string()
或mysqli的,顺便说一句。 addslashes()
不是针对SQL注入足够的保护。
“关于在Moe的是你的榜样串唯一的字符,如果该字符串是latin1的编码,但你的MySQL服务器预计UTF8这将是无效的。
简单的例子:
<?php
function foo($s) {
echo 'len=', strlen($s), ' ';
for($i=0; $i<strlen($s); $i++) {
printf('%02X ', ord($s[$i]));
}
echo "\n";
}
// my file is latin1 encoded and so is the string literal
foo('Moe’s');
// now try it with an utf8 encoded string
foo( utf8_encode('Moe’s') );
版画
LEN = 5 4D 6F 65 92 73
LEN = 6 4D 6F 65 92 C2 73
因此,问题是:你喂的“错误”编码的MySQL服务器的东西吗?
每个连接有一个连接字符集和MySQL服务器期待您的客户端(PHP脚本)发送了在该字符集编码数据。 你可以找到连接字符集是什么
SHOW VARIABLES LIKE '%character%'
像
$mysql = mysql_connect('..', '..', '..') or die(mysql_error());
mysql_select_db('..', $mysql) or die(mysql_error());
$query = "SHOW VARIABLES like '%character%'";
$result = mysql_query($query, $mysql) or die(__LINE__.mysql_error());
while( false!==($row=mysql_fetch_array($result, MYSQL_ASSOC)) ) {
echo join(', ', $row), "\n";
}
这应打印像
character_set_client, utf8
character_set_connection, utf8
character_set_database, latin1
character_set_filesystem, binary
character_set_results, utf8
character_set_server, utf8
character_set_system, utf8
并且character_set_connection, utf8
表示“我的”连接字符集是UTF8,即MySQL服务器预计从客户端(PHP)UTF8编码的字符。 什么是“你的”连接字符集?
然后,如果你不得不看看你的参数字符串的实际编码,即
$foo = mysql_real_escape_string($_POST['foo'], $mysql);
替换由
echo '<div>Debug hex($_POST[foo])=';
for($i=0; $i<strlen($s); $i++) {
printf('%02X ', ord($_POST['foo'][$i]));
}
echo "</div>\n";
$foo = mysql_real_escape_string($_POST['foo'], $mysql);
并检查您输入的字符串的实际编码是什么。 它是否会给92或C2 92?