#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. Мне еще предстоит это попробовать.