6

我正在尝试使用 PHP 将远程 POST 数据(iSnare 发送的文章)插入 MySQL。数据成功来自远程 POST 发件人,我可以毫无问题地将其写入纯文本文件。

不幸的是,当将其插入 MySQL 时,MySQL 会在特殊字符处截断字符串(文章)。我尝试了很多东西,但仍然没有成功!

我试过了:

  • 转义字符mysql_real_escape_string()
  • 使用htmlentities()and htmlspecialchars()(与每个参数..)
  • SET NAMES utf8在执行其他所有操作之前向 MySQL发送查询
  • 所有表和列均采用 UTF-8 编码,并且utf8_general_ci(也尝试过utf8_unicode_ci作为utf8_bin排序规则)
  • 将所有 PHP 文件保存为 UTF-8

我仍然找不到解决方案。如果有人可以帮助我解决这个问题,我将非常感激。


这是我的表定义和 PHP 代码:

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
4

8 回答 8

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
于 2013-03-07T12:11:21.930 回答
1

答案很晚,但我在我们的一个旧项目中遇到了这个问题。事实证明,MySql 有自己的 UTF8“实现”。它无法保存由超过 3 个字节组成的字符(如表情符号等)。有时它会抛出错误(比如在这个问题中“Incorrect string value” when trying to insert UTF-8 into MySQL via JDBC?),有时它只是切断字符串。

解决方案是从 utf8 切换到 utf8mb4,如上面链接的问题中所述,或者确保在保存之前切断所有长字符。

我知道这是一个老问题,但随着我们使用越来越多的表情符号,这可能会出现在一些较旧的应用程序中。希望它可以帮助某人。

于 2019-12-07T14:56:53.777 回答
0

你确定字符串没有被截断,因为它比你的列定义允许的长吗?

问题也可能是数据已成功存储在数据库中,但是用于显示数据库中数据的应用程序切断了显示的字符串。这主要发生在基于 Windows 的应用程序中包含空字符的字符串中,因为 Windows 控件在内部使用以空字符结尾的字符串。

于 2009-09-04T21:49:47.197 回答
0

“Set names utf8”只设置表名和列名的字符集,对于内容字符集,您也必须使用“set character set utf8”。

于 2009-09-04T21:38:11.510 回答
0

1) 将您生成的 sql 字符串放入一个变量中,并将其写入一个文件,然后再将其发送到 MySQL(这样您就可以准确查看发送的内容)

2)mysqld 有一个设置“ max_allowed_packet”,我认为它会切断长查询。

3)你传递ENT_QUOTESmysql_real_escape_string(). 我认为您的意思是将其传递给 htmlentities()

于 2009-09-05T01:12:20.277 回答
0

刚刚解决了一个类似的问题。我的问题是我试图将 Latin-1 编码数据插入 UTF-8 编码表。仔细检查数据的编码——您可能会从输入中获取非 UTF-8 数据。

于 2013-06-19T19:19:55.017 回答
0

对于那些可能有同样问题并且之前的答案没有帮助的人,我得到了另一个建议:检查内容类型!它应该是这样的:

<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">

我遇到了和唐纳德一样的问题——这就是魔法:)(我没想到一开始处理文件的同事没有把它设置好……)

于 2011-10-28T10:08:31.933 回答
0

使用mysqli_set_charset是为我节省了一天的时间:

$conn = new mysqli($host, $username, $password, $database);
mysqli_set_charset($conn, 'utf8');
于 2016-07-04T08:01:15.057 回答