php - MySQL 在特殊字符处截断字符串

标签 php mysql encoding insert special-characters

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

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

我试过:

  • 使用 mysql_real_escape_string() 转义字符
  • 使用 htmlentities()htmlspecialchars()(每个参数...)
  • 在执行其他所有操作之前向 MySQL 发送 SET NAMES utf8 查询
  • 所有表格和列都是 UTF-8 编码和 utf8_general_ci(还尝试了 utf8_unicode_ciutf8_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

最佳答案

我刚刚处理过同样的情况,条目在特殊字符(ä、ö、è 等)应该出现的位置被截断。我所有的文件都是 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

关于php - MySQL 在特殊字符处截断字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1381545/

相关文章:

php - 新文件的 Ubuntu 编码

http - HTTP请求内容的编码是什么?

mysql - 表字段国际化

php - Mysqli 在多个字段中搜索值

php - 通过 PHP 传输链接数据?

php - 带有MySql数据库的动态PHP网站;如何为此创建站点地图?

php - MySQL 根据之前的查询选择行

php - 更改sentry 2用户迁移表的主键

mysql - 如何在 MySql 中将拉丁字符转换为相应的 unicode 转义序列?

php - 使用 php 将命令行发送到 Linux 服务器