Индекс базы данных Concrete5, указанный в db.xml но не «принимает». Как мне заставить это работать?

#mysql #content-management-system #concrete5

#mysql #content-management-system #concrete5

Вопрос:

Среда: Windows7, IIS7, MySQL 5.1.57, Concrete5 5.4.1.1

Я получаю это довольно странное сообщение об ошибке, когда размещаю свой пользовательский блок:

 Fatal error: Uncaught exception 'ADODB_Exception' with message 'mysql error: [-1: No primary key found for table btCtL] in BlockRecord::UpdateActiveTable(0, 0) ' in C:inetpubwwwrootConcrete5concretelibraries3rdpartyadodbadodb-exceptions.inc.php:78 Stack trace: #0 
C:inetpubwwwrootConcrete5concretelibraries3rdpartyadodbadodb-active-record.inc.php(494): adodb_throw('mysql', 'BlockRecord::Up...', -1, 'No primary key ...', 0, 0, Object(ADODB_mysql)) #1 
C:inetpubwwwrootConcrete5concretelibraries3rdpartyadodbadodb-active-record.inc.php(402): ADODB_Active_Record->Error('No primary key ...', 'UpdateActiveTab...') #2 
C:inetpubwwwrootConcrete5concretelibraries3rdpartyadodbadodb-active-record.inc.php(136): ADODB_Active_Record->UpdateActiveTable(false) #3 
C:inetpubwwwrootConcrete5concretelibrariesblock_view.php(30): ADODB_Active_Record->__construct('btCtL') #4 
C:inetpubwwwrootConcrete5concretelibrariesblock_controller.php(222): BlockRecord->__construct('btCtL') #5 
C:inetpubwwwrootConcrete in C:inetpubwwwrootConcrete5concretelibraries3rdpartyadodbadodb-exceptions.inc.php on line 78 
  

В db.xml в данном случае читается

 <?xml version="1.0"?>
<schema version="0.3">
<table name="btCtL">
    <field name="bID" type="I">
    <unsigned />
    <key />      
    </field>
    <field name="Number_1" type="C" size="12"></field>
    <field name="Number_2" type="C" size="12"></field>
    <field name="Number_3" type="C" size="12"></field>
    <field name="Number_4" type="C" size="12"></field>
    <field name="Number_5" type="C" size="12"></field>
    <field name="Number_6" type="C" size="12"></field>
    <field name="Number_7" type="C" size="12"></field>
    <field name="Number_8" type="C" size="12"></field>
    <field name="Number_9" type="C" size="12"></field>
    <field name="Number_10" type="C" size="12"></field>
</table>
</schema>
  

Ошибка связана с тем, что «Не найден первичный ключ для таблицы btCtL», что явно неверно. Если я захожу в phpAdmin и принудительно устраняю проблему, это работает, но я не могу делать это для каждого клиентского сайта, и я не могу ожидать, что клиенты сделают это сами.

Это ошибка? Есть ли обходной путь? Или я просто толстый?

Ответ №1:

Поле bID для блока должно быть объявлено как ключ без знака, но не первичный и не автоинкрементный:

 <field name="bID" type="I"><KEY /><UNSIGNED /></field>
  

Не уверен, почему он не может быть первичным, но определенно не может быть автоинкрементным, потому что bID назначается системой Concrete5, и он меняется каждый раз, когда блок обновляется (из-за системы управления версиями).

Кстати, после изменения вашего db.xml файл, вам нужно обновить схему, перейдя в панель мониторинга -> Добавить функциональность, нажмите «Редактировать» рядом с соответствующим блоком, затем нажмите кнопку «Обновить».

Комментарии:

1. Сделал, как вы предлагаете. phpAdmin теперь сообщает мне, что нет ни индекса, ни определенного первичного элемента. Спасибо, однако, за совет о «обновлении».

2. Также изменил код, чтобы показать, что, несмотря на это изменение, он все еще не работает.

Ответ №2:

Проблема, похоже, в Concrete5. Я только что использовал MySQLInstanceConfig.exe изменить «Лучшую поддержку многоязычия» (чего я хотел в первую очередь) на «Стандартный набор символов». Это принимает набор символов из utf8 в Latin1. После этого изменения обновление создает ПЕРВИЧНЫЙ ключ для ставки.

В качестве альтернативы, это проблема MySQL 5.1 и, возможно, была исправлена в версии 5.5. Мне еще предстоит это попробовать.