我正在尝试使用PHP将远程POST数据(iSnare发送的文章)插入MySQL。数据来自远程POST发件人,我可以毫无问题地将其写入纯文本文件。
不幸的是,当它将它插入MySQL时,MySQL会在特殊字符处切断字符串(文章)。我尝试过很多东西但是我还是不成功!
我试过了:
mysql_real_escape_string()
htmlentities()
和htmlspecialchars()
(包含所有参数..)SET NAMES utf8
查询发送到MySQL utf8_general_ci
(也已尝试utf8_unicode_ci
和utf8_bin
作为整理)我仍然无法找到解决方案。如果有人能帮助我解决这个问题,我将非常感激。
这是我的表定义和PHP代码:
function guvenlik_sql($x){
// Cleans inputs agains sql injection
return mysql_real_escape_string(htmlentities(stripslashes($x)), ENT_QUOTES);
}
// Check if data really comes from an Isnare.com server (Address hidden)
if ($_SERVER['REMOTE_ADDR'] == $isnareIP || $_SERVER['REMOTE_ADDR'] == "xxx.xxx.xxx.xxx") {
$title = guvenlik_sql($_POST["article_title"]);
$first_name = guvenlik_sql($_POST["article_author"]);
$description = guvenlik_sql($_POST["article_summary"]);
$category = guvenlik_sql($_POST["article_category"]);
$article = guvenlik_sql($_REQUEST["article_body_text"]);
$article_html = guvenlik_sql($_POST["article_body_html"]);
$resource_box = guvenlik_sql($_POST["article_bio_text"]);
$resource_box_html = guvenlik_sql($_POST["article_bio_html"]);
$keywords = guvenlik_sql($_POST["article_keywords"]);
$email = guvenlik_sql($_POST["article_email"]);
$fp = fopen('test.txt', 'a');
fwrite($fp, $title."\n");
fwrite($fp, $article."\n\n\n\n");
fclose($fp);
mysql_query("INSERT INTO articles " .
"(" .
"first_name, " .
"email, " .
"title, " .
"description, " .
"article, " .
"article_html, " .
"category, " .
"resource_box, " .
"resource_box_html, " .
"keywords, " .
"distributor, " .
"distributor_host" .
") VALUES (" .
"'$first_name', " .
"'$email', " .
"'$title', " .
"'$description', " .
"'$article', " .
"'$article_html', " .
"'$category', " .
"'$resource_box', " .
"'$resource_box_html', " .
"'$keywords', " .
"'$isnare', " .
"'$_SERVER['REMOTE_ADDR']', " .
")") or die(mysql_error());
} //end if security
CREATE TABLE `articles` (
`article_ID` int(11) NOT NULL auto_increment,
`first_name` varchar(100) NOT NULL,
`last_name` varchar(100) NOT NULL,
`email` varchar(100) NOT NULL,
`password` varchar(100) NOT NULL,
`author_url` varchar(255) NOT NULL,
`company_name` varchar(100) NOT NULL,
`address1` varchar(100) NOT NULL,
`address2` varchar(100) NOT NULL,
`state_2digit` varchar(100) NOT NULL,
`state` varchar(100) NOT NULL,
`zip_code` varchar(100) NOT NULL,
`country` varchar(100) NOT NULL,
`phone` varchar(100) NOT NULL,
`newsletter` varchar(100) NOT NULL,
`title` varchar(255) NOT NULL,
`description` text NOT NULL,
`article` longtext NOT NULL,
`article_html` longtext NOT NULL,
`category` varchar(100) NOT NULL,
`cat` varchar(100) NOT NULL,
`resource_box` text NOT NULL,
`resource_box_html` longtext NOT NULL,
`keywords` varchar(255) NOT NULL,
`publish_date` timestamp NOT NULL default CURRENT_TIMESTAMP,
`distributor` varchar(255) NOT NULL default '',
`distributor_host` varchar(255) NOT NULL,
PRIMARY KEY (`article_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 CHECKSUM=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC
答案 0 :(得分:7)
我刚刚处理了相同的情况,条目被截断,特殊字符(ä,ö,è等)应该是。我的所有文件都是UTF8编码,连接是UTF8编码,表格归类是UTF8,但条目仍被截断。
我的解决方案是:更多UTF编码! :)对可能包含特殊字符的条目使用utf8_encode()
。
mysql_query("INSERT INTO articles (first_name, email, title, description, article, article_html, category, resource_box, resource_box_html, keywords, distributor, distributor_host) values (
'" . utf8_encode($first_name) . "',
'" . $email . "',
'" . utf8_encode($title) . "',
'" . utf8_encode($description) . "',
// etc
答案 1 :(得分:0)
“Set names utf8”只设置表名和列名的字符集,你也必须使用“set character set utf8”作为内容字符集。
答案 2 :(得分:0)
您确定字符串是否因为比列定义允许的长而被切断?
问题还可能是数据已成功存储在数据库中,但用于显示数据库中数据的应用程序会切断显示的字符串。这主要发生在基于Windows的应用程序中包含空字符的字符串,因为Windows控件在内部使用以空字符结尾的字符串。
答案 3 :(得分:0)
1)将您生成的sql字符串放入变量并在将其发送到MySQL之前将其写入文件(这样您就可以查看正在发送的内容)
2)mysqld的设置为“max_allowed_packet
”,我认为它会切断长查询。
3)您将ENT_QUOTES
传递给mysql_real_escape_string()
。我认为你的意思是把它传递给htmlentities()
答案 4 :(得分:0)
对于那些可能有相同问题并且之前的答案没有帮助的人,我得到了另一个建议:检查内容类型!它应该是这样的:
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
我和唐纳德有同样的问题 - 这就是MAGIC :)(我没想到,首先处理该文件的colegue没有把它设置得正确......)
答案 5 :(得分:0)
刚刚解决了类似的问题。我的问题是我试图将Latin-1编码数据插入到UTF-8编码表中。仔细检查数据的编码 - 您可能从输入中获得非UTF-8数据。
答案 6 :(得分:0)
使用mysqli_set_charset
为我节省了一天的时间:
$conn = new mysqli($host, $username, $password, $database);
mysqli_set_charset($conn, 'utf8');
答案 7 :(得分:0)
答案很晚,但是我在我们的一个较早的项目中遇到了这个问题。事实证明,MySql具有UTF8自己的“实现”。它不能保存由3个以上字节组成的字符(如表情符号等)。有时它会引发错误(例如在此问题"Incorrect string value" when trying to insert UTF-8 into MySQL via JDBC?中),有时它会切断字符串。
解决方案是如上面链接的问题所述,从utf8切换到utf8mb4 ,或者确保在保存前先切断所有长字符。
我知道这是一个古老的问题,但是随着我们使用越来越多的表情符号,在某些较旧的应用程序中可能会发生这种情况。希望对别人有帮助。