今回タイトルの通り、concrete5で” Column not found: 1054 Unknown column ‘◯◯’ in ‘field list’ “のデータベースエラーが発生し、無事に解消できたので対処方法をお伝えします。
目次
concrete5のマイアカウント機能「プロフィール編集」から保存できないエラー
運営している会員制サイトにおいて、会員自身の手で自分の会員情報を変更してもらおうと試みたところ、1054データベースエラーが発生しました。
変更させようとした手順としては、concrete5のもつマイアカウント機能を利用し、システムページ・シングルページの1つである「マイアカウント > プロフィール編集」へアクセスできるようにリンクを設置。
その後、マイアカウントのプロフィール編集ページにて変更可能な情報を変更、保存ボタンを押した際に保存ができず、エラーメッセージが表示されたという次第です。
エラーメッセージ詳細「Column not found: 1054 Unknown column ‘ak_〇〇’ in ‘field list’」
実際に表示されたエラーメッセージ内容は下記の通り。
Doctrine\DBAL\Exception\InvalidFieldNameException An exception occurred while executing 'UPDATE UserSearchIndexAttributes SET ak_furigana = ? WHERE uID = ?' with params [null, 1]:SQLSTATE[42S22]: Column not found: 1054 Unknown column 'ak_furigana' in 'field list'
または
An exception occurred while executing 'UPDATE UserSearchIndexAttributes SET ak_tel = ? WHERE uID = ?' with params [null, 1]: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'ak_tel' in 'field list'
など。
何度か実行しましたが、ak_◯◯の値が毎回異なる形で、同じエラーメッセージが表示されました。
エラーメッセージ内の「ak_furigana」や「ak_tel」などは、concrete5の管理画面から設定した「メンバー属性」(ユーザー属性)のハンドル「furigana」「tel」に紐づくak = Attribution Keyとなっています。
UserSearchIndexAttributesにおける属性とは、ユーザー属性の詳細画面(管理画面>メンバー>属性)で設定できる「索引インデックスにコンテンツが含まれます。」という項目にチェックを入れると追加されるカラム属性のよう。
エラーメッセージの後半を日本語になおすと
「データベースフィールドに「ak_◯◯」というカラムは見つかりませんよ」
ということを言っています。
データベース上で「UserSearchIndexAttributes」のテーブルを実際に見てみる
そこで実際に、データベース上でUserSearchIndexAttributesと名前のついたテーブルを見てみます。
すると、concrete5のシステムで最初から設定されている項目である「uID」や「ak_profile_private_messages_enabled」のカラムが見つかります。
しかし、あとから任意に追加していったak_◯◯の項目は、実際のユーザーハンドル名の数とは一致しません。
一部は適切にカラムが追加されているのですが、いくつかの項目が不足しているよう。
ここで不足しているカラムが、データベースのエラーメッセージとして「Unknown column」として吐き出されていたようです。
concrete5の管理画面>メンバー>属性から、DBカラムと索引インデックス設定を一致させる
ここからデータベースのアーキテクチャを変更するのは少々複雑な作業になるので、concrete5のシステム側・管理画面から操作を行い、属性の設定を変更します。
concrete5の管理画面>メンバー>属性のページに移動。
「検索可能」のチェックボックス項目のうち「索引インデックスにコンテンツが含まれます」のチェックを外します。
この作業を、先ほど参照したデータベース上の「UserSearchIndexAttributes」テーブルで存在しなかったカラム名 (ak_〇〇の形) のメンバー属性について行います。
これで、データベースエラーは発生せず無事にメンバープロフィールを変更、保存することができました。
参考: 「索引インデックスにコンテンツが含まれます」とは?
ところで、今回のエラー対応でチェックを外した「索引インデックスにコンテンツが含まれます」とは、どういう役割を持っていたのでしょうか。
ページ属性作成時に、「索引インデックスにコンテンツが含まれます。」を選択しておくと、この属性に書いた語句も検索ワードにヒットします。
検索キーワードを登録しておき、検索ヒット0件を減らす方法 (concrete5)|水野 史土@月70万PVホームページ制作|note
上記説明のとおり、索引インデックスとは「属性の内容を検索にヒットさせる」ために使われる項目となります。
しかし、この説明は「ページ属性」や「カスタム属性」について。
今回は「メンバー・ユーザー」についての索引インデックスでした。
メンバー・ユーザー属性の場合、たとえユーザー属性の「索引インデックスにコンテンツが含まれます」にチェックを入れていても
サイト上での全体検索では、ユーザーの情報がヒットすることはありません。
(もし会員制サイトでサイト内検索で会員名等の個人情報がヒットしてしまったら、大変ですね)
ユーザー属性における索引インデックスとは
「管理画面上の『ユーザー検索』の検索ボックスから検索した際に、入力された内容でヒットさせるようにするか」
ということを設定する項目となります。
たとえばメンバー名などで検索をかけ、特定の名前をヒットさせたいという場合。
その場合には、メンバー名属性の索引インデックスにチェックを入れておくことで、初めてメンバー検索画面の検索ボックスから、メンバー名の内容での検索が可能となります。
(索引インデックスのカラムが増えすぎると、検索に時間がかかってしまうことになるため)
以上です。concrete5ご活用のお役に立てましたら幸いです。
Leave a Reply