web-dev-qa-db-ja.com

Joomla 3.9でカスタムコンポーネントを更新するときのSQLエラー

カスタムコンポーネントがあり、拡張機能に言語フィルターを追加したい。そこで、SQL更新ファイルに、テーブルを変更するために次の2行を追加しました。

ALTER TABLE `#__contract_contracts` ADD `language` CHAR(7) NOT NULL DEFAULT '*' AFTER `alias`;
ALTER TABLE `#__contract_templates` ADD `language` CHAR(7) NOT NULL DEFAULT '*' AFTER `alias`;

しかし、次のエラーが発生して更新できません。

警告JInstaller::Install:エラーSQL不正なテーブル名 'ALTER TABLE'拡張更新:SQLエラー処理クエリ:エラー番号1103でDB関数が失敗しました不正なテーブル名 'ALTER TABLE' SQL = ALTER TABLE `ALTER TABLE`

エラー
コンポーネントのインストールエラー

テーブル名とフィールド名を何度も確認しましたが、phpMyAdminで次のクエリを実行すると機能します。

ALTER TABLE `jdev_contract_contracts` ADD `language` CHAR(7) NOT NULL DEFAULT '*' AFTER `alias`;
ALTER TABLE `jdev_contract_templates` ADD `language` CHAR(7) NOT NULL DEFAULT '*' AFTER `alias`;
1
mixahlos

これが私が理解している問題です-これを壊すと同時に水晶玉も撫でています。

  1. (少なくとも)CREATEクエリに続いて(少なくとも)1つのinstall.mysql.utf8.sqlを含むALTER TABLEファイルがあります。次のようになります(追加のテーブル作成は私の説明には関係ありません)...
CREATE TABLE IF NOT EXISTS #__contract_contracts (...
...
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 DEFAULT COLLATE=utf8mb4_unicode_ci;
ALTER TABLE #_contract_contracts ADD id INT PRIMARY KEY AUTO_INCREMENT;
             ^^---whoops, typo @ prefix

したがって、タイプミスがあることに気付き、構文を修正し、キャッシュとtmpフォルダーをクリアしますが、インストールの欠陥実際にははインストールファイルのタイプミスで完了しているため、アンインストールする必要があります。悲しいかな、アンインストール中に実行した他の言及されていないプロセスと組み合わせてこれらの戦術をすべて実行した後でも、コンポーネントを再インストールしても、インストールファイルの欠陥のあるバージョンを消去できませんでした。

アンダースコアが1つ欠けていると、なぜこんなにトラブルが発生するのですかJoomlaは、プレフィックスプレースホルダー#__を非常に正確に探しています。この3文字のシーケンスからの逸脱は、プレフィックス置換サブストリングとして無視されます。また、ALTER TABLEの後にテーブル名の前後にバッククォートがないと仮定します。

プレフィックスプレースホルダーはJoomlaで置き換えられなかったため、MySQLは#を通常どおりに処理します-コメントの開始として処理します!これにより、#の後のすべての文字が「アクション不能」としてレンダリングされます。これでクエリは次のように読み込まれます(MySQLのコメントをPHPコメント構文で置き換えます)。

   ALTER TABLE //_contract_contracts` ADD id INT PRIMARY KEY AUTO_INCREMENT;
   ^^^^^^^^^^^^-- only this part is read by MySQL

次に、あなたの唯一の更新ファイルがその最後に追加されます...

ALTER TABLE ALTER TABLE `#__contract_contracts` ADD `language` CHAR(7) NOT NULL DEFAULT '*' AFTER `alias`;
ALTER TABLE `#__contract_templates` ADD `language` CHAR(7) NOT NULL DEFAULT '*' AFTER `alias`;

最後に、私のアドバイスは、コンポーネントを(再度)アンインストールすることです。使用しているファイルにタイプミスの修正が実際に保存されていることを再確認してください。 Joomlaが修正済みのインストールファイルを読み取ることができるように、バージョンをリセットします。気になるキャッシングを自由にクリアしてください。次に、コンポーネントを初めてインストールする場合と同様にインストールします。

1
mickmackusa