SOFTELメモ Developer's blog

会社概要 ブログ 調査依頼 採用情報 ...
技術者募集中

drupal7のインストールでsqliteを選択するとエラー

問題

drupal7をインストールしたいのですが、エラーでできません。

sqliteが選択できそうなのでsqliteの方でインストールしようとしたのですが、途中でエラーになります。

Warning: Illegal string offset 'field' in UpdateQuery_sqlite->removeFieldsInCondition() (line 75 of /usr/share/drupal7/includes/database/sqlite/query.inc).
Warning: Illegal string offset 'field' in UpdateQuery_sqlite->removeFieldsInCondition() (line 79 of /usr/share/drupal7/includes/database/sqlite/query.inc).

drupal 7 logo

答え

環境は php5.4でしょうか。php5.3以前なら大丈夫なようですが、5.4以降で問題があるようです。

以下のように修正すべしとのこと。

diff --git a/includes/database/sqlite/query.inc b/includes/database/sqlite/query.inc
index 6b8a72f..68e6f14 100644
--- a/includes/database/sqlite/query.inc
+++ b/includes/database/sqlite/query.inc
@@ -71,12 +71,14 @@ class UpdateQuery_sqlite extends UpdateQuery {
    *   A database condition.
    */
   protected function removeFieldsInCondition(&$fields, QueryConditionInterface $condition) {
-    foreach ($condition->conditions() as $child_condition) {
-      if ($child_condition['field'] instanceof QueryConditionInterface) {
-        $this->removeFieldsInCondition($fields, $child_condition['field']);
-      }
-      else {
-        unset($fields[$child_condition['field']]);
+    foreach ($condition->conditions() as $key => $child_condition) {
+      if (isset($child_condition['field'])) {
+        if ($child_condition['field'] instanceof QueryConditionInterface) {
+          $this->removeFieldsInCondition($fields, $child_condition['field']);
+        }
+        else {
+          unset($fields[$child_condition['field']]);
+        }
       }
     }
   }

手作業で書き換える場合は

ファイル includes/database/sqlite/query.inc の removeFieldsInCondition メソッドの中で、foreach(){…} のループに、以下のようにif文を追加するとOK。

class UpdateQuery_sqlite extends UpdateQuery {
  /**
   */
  protected function removeFieldsInCondition(&$fields, QueryConditionInterface $condition) {
    foreach ($condition->conditions() as $child_condition) {
    if (isset($child_condition['field'])) {
      if ($child_condition['field'] instanceof QueryConditionInterface) {
        $this->removeFieldsInCondition($fields, $child_condition['field']);
      }
      else {
        unset($fields[$child_condition['field']]);
      }
    }
    }
  }

参考

http://drupal.org/node/1414412

http://drupal.org/node/1414412#comment-5899380

関連するメモ

コメント