Drupal кодирование и вставка узла - PullRequest
1 голос
/ 17 февраля 2011

У меня есть тип CCK для хранения упоминаний (упоминания в социальных сетях). Некоторые из упоминаний, которые я считаю, являются ASCII (мои знания этого материала малы).

Я получаю данные из API, которые затем использую node_save для сохранения в Drupal.

У меня вопрос: что мне использовать, чтобы безопасно конвертировать все, что я получаю, в формат, которым довольны Drupal и MySQL?

Конкретная ошибка db_query, которую я получаю, является бесполезной «Предупреждение в test1 \ includes \ common.inc on line 3538». Ницца. Я проследил, что это кодировка, так как я использовал следующий код, чтобы сделать ввод безопасным, но он не работает со всеми вводами.

$node->title = htmlentities($item['title'], ENT_COMPAT, 'UTF-8');

Он работал хорошо для некоторых символов ASCII, таких как квадратные [] и т. Д., Но не для этого "行 け な く て て も っ っ っ っユ

Я действительно застрял. (

ОБНОВЛЕНИЕ: ТОЧНАЯ ошибка, которую я получаю от PHP: «Предупреждение в D: \ sites \ test1 \ includes \ common.inc в строке 3538», а строка гласит «if (db_query ($ query, $ values)) { ».

ОБНОВЛЕНИЕ 2: Я подтвердил, что кодирование данных, которые я получаю, - UTF8. Это действительно не имеет смысла сейчас, и я подтвердил, что сортировка в БД - utf8_general_ci.

ОБНОВЛЕНИЕ 3: Один из заголовков: Сколько стоит фанат Facebook? 1 1,07

Выход:

var_export (array_map ('ord', str_split ($ node-> title))

дал мне символ 160 для забавного знака вопроса (который представляет собой квадрат, подобный [] в затмении).

ОБНОВЛЕНИЕ 4: Версия MySQL - 5.1.41, а сопоставление столбцов - utf8_general_ci.

ОБНОВЛЕНИЕ 5: мне удалось заставить Drupal напечатать запрос с помощью db_queryd. Самое смешное, что теперь я получаю точное сообщение об ошибке, а не «Warning in», но Drupal по-прежнему не имеет этой ошибки в журнале! WTF. Таким образом, точный sql:

INSERT INTO node (vid, type, language, title, uid, status, created, changed, comment, promote, moderate, sticky, tnid, translate) VALUES (0, 'sm_mention', '', 'How Much Does A Facebook Fan Cost?� $1.07 (Geoffrey A. Fowler/Digits)', 1, 1, 1298395302, 1298395302, 0, 0, 0, 0, 0, 0)

И приведенная ошибка: Неверное строковое значение: '\ xA0 $ 1.0 ...' для столбца 'title' в строке 1

Это, честно говоря, звучит так, как будто что-то не нравится расширенным символам ascii.

ОБНОВЛЕНИЕ 6:

 SHOW CREATE TABLE node: 

   CREATE TABLE `node` (
  `nid` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `vid` int(10) unsigned NOT NULL DEFAULT '0',
  `type` varchar(32) NOT NULL DEFAULT '',
  `language` varchar(12) NOT NULL DEFAULT '',
  `title` varchar(255) NOT NULL DEFAULT '',
  `uid` int(11) NOT NULL DEFAULT '0',
  `status` int(11) NOT NULL DEFAULT '1',
  `created` int(11) NOT NULL DEFAULT '0',
  `changed` int(11) NOT NULL DEFAULT '0',
  `comment` int(11) NOT NULL DEFAULT '0',
  `promote` int(11) NOT NULL DEFAULT '0',
  `moderate` int(11) NOT NULL DEFAULT '0',
  `sticky` int(11) NOT NULL DEFAULT '0',
  `tnid` int(10) unsigned NOT NULL DEFAULT '0',
  `translate` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`nid`),
  UNIQUE KEY `vid` (`vid`),
  KEY `node_changed` (`changed`),
  KEY `node_created` (`created`),
  KEY `node_moderate` (`moderate`),
  KEY `node_promote_status` (`promote`,`status`),
  KEY `node_status_type` (`status`,`type`,`nid`),
  KEY `node_title_type` (`title`,`type`(4)),
  KEY `node_type` (`type`(4)),
  KEY `uid` (`uid`),
  KEY `tnid` (`tnid`),
  KEY `translate` (`translate`)
) ENGINE=InnoDB AUTO_INCREMENT=1700 DEFAULT CHARSET=utf8

1 Ответ

3 голосов
/ 22 февраля 2011

\xA0 не является допустимым началом последовательности UTF8.

Символ, известный как NO-BREAK SPACE с кодовой точкой Unicode 0x00A0, должен быть закодирован как 0xC2A0 в UTF8.

При этом ваша входная строка повреждена, она недопустима UTF8.

...