1

環境仕様:

os:windows 7 64 bit
webserver:wamp(apache) with:
                    php 5.3.8
                    mysql 5.5.16
text editor in use:notepad++

問題:
utf8 (ヘブライ語) データを含むデータで構成される .sql ファイルをロードしようとすると
、構文は phpmyadmin に従って正しいですが、php スクリプトを介してファイルをアップロードしようとすると、エラーが出力されます。

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DROP DATABASE IF EXISTS squazza; CREATE DATABASE IF NOT EXISTS squazza; ' at line 1

SQL ファイル (db/default.sql) は次のとおりです。

DROP DATABASE IF EXISTS squazza;
CREATE DATABASE IF NOT EXISTS squazza;

use squazza;
CREATE TABLE IF NOT EXISTS `mainframe` (
  `storedbottles` smallint(255) DEFAULT NULL,
  `bottlescompressed` smallint(255) DEFAULT NULL,
  `users` smallint(255) DEFAULT NULL,
  `status` varchar(20) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
CREATE TABLE IF NOT EXISTS `pages` (
  `id` mediumint(9) NOT NULL AUTO_INCREMENT,
  `accessname` varchar(50) DEFAULT NULL,
  `pagename` varchar(50) DEFAULT NULL,
  `title` varchar(100) DEFAULT NULL,
  `metadesc` varchar(500) DEFAULT NULL,
  `metakey` varchar(180) DEFAULT NULL,
  `lang` varchar(20) DEFAULT NULL,
  `leftcontent` longtext,
  `rightcontent` mediumtext,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci AUTO_INCREMENT=1 ;
CREATE TABLE IF NOT EXISTS `users` (
  `id` mediumint(9) NOT NULL AUTO_INCREMENT,
  `identification` varchar(20) DEFAULT NULL,
  `LastName` varchar(30) DEFAULT NULL,
  `FirstName` varchar(30) DEFAULT NULL,
  `born` date DEFAULT NULL,
  `joined` date DEFAULT NULL,
  `phone` varchar(20) DEFAULT NULL,
  `email` varchar(20) DEFAULT NULL,
  `paypal` varchar(20) DEFAULT NULL,
  `Address` varchar(50) DEFAULT NULL,
  `City` varchar(50) DEFAULT NULL,
  `username` varchar(20) DEFAULT NULL,
  `pass` varchar(20) DEFAULT NULL,
  `card` varchar(20) DEFAULT NULL,
  `balance` float(6,4) DEFAULT NULL,
  `bottles` smallint(255) DEFAULT NULL,
  `administrator` tinyint(1) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci AUTO_INCREMENT=1 ;
INSERT INTO `pages` (`accessname`,`pagename`, `title`, `metadesc`, `metakey`, `lang`, `leftcontent`, `rightcontent`) VALUES
('register','הרשמה', 'הסבר מפורט אלינו', 'הסבר אל יוצריומפתחי הדחסן הבקבוקים', 'בקבוקים,דחסן,בקבוק,איכות הסביבה', 'he','<h2>הרשמה</h2><br\><h4>דף הרשמה למשטמשים חדשים</h4><br\>','<h3>דף זה הוא הינו דף הרשמה למשטמשים חדשים המעוניינים להיצתרף לשרות דחיסת הבקבוקים.');
INSERT INTO `pages` (`accessname`,`pagename`, `title`, `metadesc`, `metakey`, `lang`, `leftcontent`, `rightcontent`) VALUES
('login','כניסה', 'הסבר מפורט אלינו', 'הסבר אל יוצריומפתחי הדחסן הבקבוקים', 'בקבוקים,דחסן,בקבוק,איכות הסביבה', 'he','<h2>משחזר הבקבוקים</h2><br\><h4>רק שחזור מוביל לשיפור</h4><br\>','<h3>פרויקט דחסן</h3>פרויקט דחסן הוא הינו פרויקט שנועד לשפר את איכות הסביבה');
INSERT INTO `pages` (`accessname`,`pagename`, `title`, `metadesc`, `metakey`, `lang`, `leftcontent`, `rightcontent`) VALUES
('aboutproject','אל הפרויקט', 'הסבר מפורט אלינו', 'הסבר אל יוצריומפתחי הדחסן הבקבוקים', 'בקבוקים,דחסן,בקבוק,איכות הסביבה', 'he','<h2>משחזר הבקבוקים</h2><br\><h4>רק שחזור מוביל לשיפור</h4><br\>','<h3>פרויקט דחסן</h3>פרויקט דחסן הוא הינו פרויקט שנועד לשפר את איכות הסביבה');
INSERT INTO `pages` (`accessname`,`pagename`, `title`, `metadesc`, `metakey`, `lang`, `leftcontent`, `rightcontent`) VALUES
('aboutus','אלינו', 'הסבר מפורט אלינו', 'הסבר אל יוצריומפתחי הדחסן הבקבוקים', 'בקבוקים,דחסן,בקבוק,איכות הסביבה', 'he','<h2>משחזר הבקבוקים</h2><br\><h4>רק שחזור מוביל לשיפור</h4><br\>','<h3>פרויקט דחסן</h3>פרויקט דחסן הוא הינו פרויקט שנועד לשפר את איכות הסביבה');
INSERT INTO `pages` (`accessname`,`pagename`, `title`, `metadesc`, `metakey`, `lang`, `leftcontent`, `rightcontent`) VALUES
('home','בית', 'דף בית של הדחסן', 'הדחסן שדוחס בקבוקים וסם כסף ברטיס אוטומתי', 'בקבוקים,דחסן,בקבוק,איכות הסביבה', 'he','<h2>משחזר הבקבוקים</h2><br\><h4>רק שחזור מוביל לשיפור</h4><br\>','<h3>פרויקט דחסן</h3>פרויקט דחסן הוא הינו פרויקט שנועד לשפר את איכות הסביבה');

ファイルを送信しようとしている PHP コードは次のとおりです。

$link=new mysqli(MYSQL_HOST, MYSQL_USER, MYSQL_PASS) or die('Could not connect to database');

        mysqli_multi_query($link,file_get_contents('db/default.sql')) or die(mysqli_error($link));

現在、SQLエラーを解決するいくつかのことがありますが、ファイルのエンコーディング(メモ帳++で)をUTFに設定するなどの新しい問題が発生しました

4

1 に答える 1

1

バイトオーダーマーク(BOM)は、テキストファイルまたはストリームのエンディアン(バイトオーダー)を示すために使用されるUnicode文字です。UTF-8ファイルには3バイトのシーケンス(、、0xEF)があり0xBB0xBFUTF-8エンコーディングは異なるバイト順序をサポートしていないため、実際にはその目的を果たしません。テキストエディタやその他のツールで使用して、ファイルがUTF-8としてエンコードされていることを検出できますが、ほとんどの場合、実際のファイルの内容の上に挿入されるだけです。これが問題です。

このfile_get_contents()関数はファイルをそのまま読み取り(つまり、BOMを削除したり、特別な方法でファイルを処理したりすることはありません)、mysqli_multi_query()SQLコードの単純なストリームを想定しており、BOMを検出して削除することもできません。

最も簡単な解決策は、ファイルからBOMを削除することです。真剣に。

ファイルのエンコーディング(notepade ++)をUTF- WITHOUT BOM [...] garble [s]ヘブライ語テキストに設定するため、ファイルをutf8として保持する必要があります。

BOMを削除するだけでは、ファイルのエンコーディングはまったく変更されません。ただし、BOMの検索に依存するテキストエディタはUTF-8を検出できない可能性があり、ファイルを他の(間違った)エンコーディングで解釈する可能性があるため、ファイルが文字化けしているように見えます。これは視覚化の問題であり、文字化けしたファイルを再保存しなくてもコードに影響を与えることはありません。

于 2012-10-16T10:44:30.760 に答える