6

リモート POST データ (iSnare によって送信された記事) を PHP で 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 に答える
0

同様の問題を解決しました。私の問題は、Latin-1 でエンコードされたデータを UTF-8 でエンコードされたテーブルに挿入しようとしていたことでした。データのエンコーディングを再確認してください。入力から非 UTF-8 データを取得している可能性があります。

于 2013-06-19T19:19:55.017 に答える
0

列定義が許容する長さよりも長いため、文字列が途切れていないことを確認してください。

問題は、データがデータベースに正常に保存されていることも考えられますが、データベースからのデータを表示するために使用するアプリケーションによって、表示された文字列が切り取られます。Windows コントロールは内部的に null で終わる文字列を使用するため、これは主に Windows ベースのアプリケーションで null 文字を含む文字列で発生します。

于 2009-09-04T21:49:47.197 に答える
0

同じ問題を抱えている可能性があり、以前の回答が役に立たない人のために、別の提案を得ました: CONTENT TYPE を確認してください! 次のようになります。

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

私はドナルドが持っていたのとまったく同じ問題を抱えていました-これはMAGICを行いました:)

于 2011-10-28T10:08:31.933 に答える
0

使用mysqli_set_charsetすることで、私にとって1日が節約されました。

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

「Set names utf8」は、テーブル名と列名の文字セットのみを設定します。コンテンツの文字セットにも「set character set utf8」を使用する必要があります。

于 2009-09-04T21:38:11.510 に答える