【问题标题】:PHP/MYSQL utf8 file open syntax error, but works fine via phpmyadminPHP/MYSQL utf8 文件打开语法错误,但通过 phpmyadmin 工作正常
【发布时间】:2012-10-16 09:37:38
【问题描述】:

环境规格:

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 错误,但产生了新的问题,例如将文件的编码(在 notepade++ 中)设置为 UTF- WITHOUT BOM
例如乱码的希伯来文文本,因此我必须将文件保留为utf8.

【问题讨论】:

  • 删除 BOM 解决方案,它不会乱码。只是您需要确保文件以 UTF-8 格式打开。
  • 请完整阅读,BOM 不是这里的问题。
  • 我有一个类似的过程,并在尝试在 .sql 文本文件中删除和创建数据库时发现它有问题。一旦我将 DROP 和 CREATE DATABASE 移动到 PHP 脚本,该过程就可以正常工作。另外,我记得命令之间没有多余的行也有帮助。
  • 刚刚尝试删除 CREATE 和 DROP 但现在有一个新错误 'use squazza;如果不存在则创建表mainframestoredbottles' 在第 1 行
  • 对,您也可以删除 USE。因为您已经与 squazza 建立了连接。那么你的代码块应该是这样的:$query = "USE squazza;"; $query .= file_get_contents('db/default.sql');$result=$mysqli-&gt;multi_query('$query');

标签: php mysql utf-8 phpmyadmin syntax-error


【解决方案1】:

byte order mark (BOM) 是一个 Unicode 字符,用于表示文本文件或流的字节顺序(字节顺序)。在 UTF-8 文件中是一个三字节序列 (0xEF,0xBB,0xBF),它并没有真正达到这个目的,因为 UTF-8 编码不支持不同的字节顺序。文本编辑器和其他工具可以使用它来检测文件是否编码为 UTF-8,但大多数情况下它只会被注入到实际文件内容之上,这是您面临的问题。

file_get_contents() 函数将按原样读取文件(即,它不会删除 BOM 或以任何特殊方式处理文件),mysqli_multi_query() 函数需要一个简单的 SQL 代码流并且无法检测并删除 BOM。

最简单的解决方案是从文件中删除 BOM。认真的。

设置文件的编码(在 notepade++) 到 UTF- WITHOUT BOM [...] garble[s] hebrew text 因此我有 将文件保存为 utf8。

仅删除 BOM 不会改变文件编码。但是,依赖于查找 BOM 的文本编辑器可能无法检测到 UTF-8,并且可能会使用其他一些(错误的)编码来解释文件,从而使文件看起来是乱码。这是一个可视化问题,如果您不重新保存乱码文件,应该不会影响您的代码。

【讨论】:

    猜你喜欢
    • 2012-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-09
    • 1970-01-01
    • 2012-04-07
    • 2015-06-03
    • 2014-09-20
    相关资源
    最近更新 更多