CakePHP read () не возвращает название модели - PullRequest
0 голосов
/ 28 февраля 2012

У меня проблемы с моим cakePHP, и мне интересно, сталкивался ли кто-нибудь еще с этим. Я пытаюсь настроить объект пользователя. Я создаю модель:

class User extends AppModel
{
}

создаю контроллер:

class UsersController extends AppController
{
  function view($id = null) {
    $this->User->id = $id;
    $this->set('users', $this->User->read());
 }
}

и я иду на страницу просмотра. Тем не менее, я не получаю то, что говорится в документации на торт. Я получаю:

Array
(
    [0] => Array
        (
            [id] => 3
            [FirstName] => 1
            [LastName] => 1
        )
)

когда я ожидаю увидеть

Array
(
    [User] => Array
        (
            [id] => 3
            [FirstName] => 1
            [LastName] => 1
        )
)

Кроме того, когда я делаю $this->User->find('all');, я получаю массив, подобный так:

Array
(
    [0] => Array ([0] => Array (/*stuff here*/))
    [1] => Array ([0] => Array (/*stuff here*/))
    [2] => Array ([0] => Array (/*stuff here*/))
)

Я попытался изменить имя на Myuser (включая таблицу базы данных, контроллер, модель и т. Д.), И все еще имею те же результаты, поэтому я не думаю, что оно связано с зарезервированным ключевым словом. Кто-нибудь сталкивался с этим или, что более важно, кто-нибудь знает, как я могу это исправить? Спасибо.

EDIT: Я использую торт версии 2.0.6. Я использую базу данных MySQL 5.0.92. Я только что попытался установить переменную имени, и это не изменило мои результаты.

Ответы [ 5 ]

2 голосов
/ 01 июля 2012

После ВСЕГО ДНЯ устранения неполадок я, наконец, смог ее решить.

Причина, безусловно, в устаревшей библиотеке pdo_mysql.so.Он находится в / usr / local / lib / php / extensions / (последняя директория) /pdo_mysql.so

Имя таблицы, возвращаемое в getColumnMeta, было добавлено только в определенной версии из-за запроса этой функции: https://bugs.php.net/41416/

Теперь проблема в том, что на некоторых веб-хостах PHP должен быть скомпилирован с Easy Apache.Мой должен был пройти через это также только для того, чтобы включить PDO (он был изначально отключен).Но проблема в том, что по какой-то причине Easy Apache загружает устаревший исходный код при каждом запуске.Запуск yum или установка любых RPM также не помогают.

Итак, вот что я сделал: - Я скачал последние версии PHP с PHP-сайта, извлек тарбол - я запустил Easy Apache, выполнил перекомпиляцию,и очень быстро пошел к консоли, чтобы посмотреть, как она перезагружает устаревшие исходники PHP - Когда источники PHP снова появились, я очень быстро заменил весь каталог ext / pdo_mysql на последние источники - Easy Apache сначала скомпилирует httpd, так что у вас есть времячтобы выполнить вышеуказанный шаг - после завершения сборки перезагрузите компьютер.- Чтобы проверить, поддерживает ли ваша версия pdo_mysql.so имя таблицы, выполните следующую команду: strings -f pdo_mysql.so |grep ': table' - там должна быть записьСтарая версия не делает.- Кстати, я заметил, что есть больше скопированных pdo_mysql.so в / usr / lib / php / modules и / usr / lib / php / extensions, но кажется, что в / usr / localэто активно.Тем не менее, я обновляю все копии вручную

ПРИМЕЧАНИЕ: если вы просто попытаетесь обновить файл pdo_mysql.so, он не будет работать.Вы получите ошибку сегментации, и страницы ничего не отобразят.Вам нужно перекомпилировать PHP, используя описанные выше шаги.

Я надеюсь, что это поможет другим людям, которые столкнутся с этой ошибкой.

0 голосов
/ 10 декабря 2014

Я только что столкнулся с проблемой.Причина не в устаревшей библиотеке pdo_mysql.so.

Если вы используете cakephp 2.3.x и убедитесь, что используете PHP 5.2.8 или новее, вам следует проверить, является ли расширение pdo_mysql включено или отключено.

Вы можете повторить phpinfo () , чтобы проверить это.Примечание: расширение pdo_mysql включается только в том случае, если вы видите «Драйвер PDO для MySQL включен» , в противном случае оно отключено.

0 голосов
/ 07 марта 2012

Наконец выяснилось, что причина этого связана с функцией PDOStatement :: getColumnMeta.Это вызывается для запросов, которые выполняет cakePHP, используется платформой для получения имени столбца, типа столбца и имени таблицы.Однако по какой-то причине на веб-хосте, который у меня есть в настоящее время, эта функция не возвращает имя таблицы, поэтому по умолчанию cakePHP создает массив с индексом 0, а не с индексом имени таблицы.

$column = $results->getColumnMeta($index);
if (!empty($column['table']) && strpos($column['name'], $this->virtualFieldSeparator) ===  false) {
    $this->map[$index++] = array($column['table'], $column['name'], $type);
} else {
    $this->map[$index++] = array(0, $column['name'], $type);
}

все еще нетконечно, как это исправить, но именно поэтому это и происходит.

0 голосов
/ 20 июня 2012

Да, вы правы.beastmaster

Причина в том, что вы используете старую версию драйвера PDO, которая устарела.PDOStatement :: getColumnMeta не показывает [table] = name в старой версии

Так что решение здесь скачать новую версию PHP, которая имеет встроенный PDO. НЕ УСТАНАВЛИВАЙТЕ PDO VIA PECL потому что вы получаете старую версию расширения PDO.и с помощью

<?php phpinfo ?>

проверьте, правильно ли он установлен.так что вы можете использовать собственный драйвер PDO, поставляемый с PHP, а не использовать драйвер расширения PDO.

Кстати, спасибо за указание на проблему.

0 голосов
/ 28 февраля 2012

Убедитесь, что в вашей таблице указаны пользователи и явно указана ассоциация

class User extends AppModel {
    public $name = 'User';
    public $useTable = 'users';
    ...

Вам необходимо установить переменную $ использовании, чтобы связать модель пользователя с контроллером, если вы используете какие-либо дополнительные модели. Добавление этого явно, даже если есть только один, не повредит ...

например

class UsersController extends AppController {

    //Controller Name
    public $name = 'Users';

    //DB Config for desired connection
    public $useDbConfig = 'test';

    // Array of associated models
    public $uses = array('Store','User');

    //Array of Helpers used by Controller Views
    public $helpers = array('Html', 'Form');
    ...

Кроме того, убедитесь, что в AppModel или AppController нет изменений, которые могут случайно повлиять на взаимодействие здесь ... Вы также можете рассмотреть возможность сброса значения $ использует, чтобы увидеть, что там.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...