SimpleTesting-PDOException: SQLSTATE [42S02] - PullRequest
0 голосов
/ 15 декабря 2011

SimpleTesting-PDOException: SQLSTATE [42S02] Просмотр Изменить редакции Опубликовано ichionid 15 декабря 2011 г. в 10:56 Привет всем,

Я нахожусь в процессе разработки модуля. Я пытаюсь включить модуль SimpleTest, чтобы иметь отдельное место, содержащее мои тесты кода.

Однако, когда я пытаюсь выполнить запрос к таблицам в базе данных, которые я создаю, я получаю: PDOException: SQLSTATE [42S02]: базовая таблица или представление не найдены: 1146 Table 'plays.simpletest311135TABLENAME

Он пытается найти таблицу simpletest311135TABLENAME, в то время как он должен искать TABLENAME. Это всегда добавляет простейшее и случайное число.

Когда я запускаю запросы к таблицам drupal по умолчанию, таким как пользователи и сеансы, все работает отлично. Есть обходной путь?

Яннис


Фактическая функция

function dlm_job_finished($jobId,$urls,$messageFromFS){
    $query    =  db_select('users','u');
    $query    -> fields('u',array('uid'));
    $d_alias  =  $query->innerJoin('dlm_user_auth_entities','d','%alias.uid = u.uid');
    $query    -> condition("{$d_alias}.jid",$jobId);
    $result   =  $query->execute();
    $message = variable_get('dlm_settings_email_message').'<br />';
    foreach ($result as $record) {
      foreach ($urls as $file_url_to_download){
        $message.= '<a href="'.$file_url_to_download.'">'.$file_url_to_download.'</a> <br /> ';
      }
      $message.=$messageFromFS.'<br />';      
      dlm_mail_notifier($record->uid,$message);
    }
  }

функция тестирования:

class DlmTestCase extends DrupalWebTestCase{

  public function setUp(){
    parent::setUp('dlm');
  }

    public function testDlmJobFinished(){
        $info = module_invoke(
                  'dlm',
                  'job_finished',
                  'awsedrfvcxzsdfrtawsedrfvcxzsdfrt',
                  array(
                    'http://media.holkeydonkey.com/download/frehvf64fdsffdf.zip',
                    'http://media.marioBos.com/download/12.zip',
                  ),
                  "additional message!"
                );
      }
}

Внутри тестового класса я работал только с теми функциями, которые запрашивают таблицы базы данных drupal по умолчанию. Кроме того, функция выше работает, я вызывал по-другому, и она работала, проблема в том, что я не могу заставить ее работать с модулем простого тестирования Drupal.

1 Ответ

0 голосов
/ 15 декабря 2011

Извинения, если я неправильно понял, но я думаю, что вы пытаетесь выполнить запрос с простым внутренним объединением? Если так, то ваш синтаксис неправильный, он должен выглядеть так:

$query = db_select('users','u')
  ->fields('u',array('uid'))
  ->condition('d.jid', $jobId);

$query->innerJoin('dlm_user_auth_entities', 'd', 'd.uid = u.uid');

$results = $query->execute();

Проблема с вашим состоянием:

`$query -> condition("{$d_alias}.jid",$jobId);`

Переменная, присвоенная $d_alias (которую вы используете в качестве псевдонима в вышеуказанном условии), возвращается из $query->innerJoin(), которая не возвращает строковое представление псевдонима, она возвращает объект. Имя таблицы, которое вы получаете в своем запросе, может быть строковым представлением этого объекта (simpletest311135).

Когда вы используете второй аргумент innerJoin(), который становится псевдонимом, по которому объединенная таблица будет известна в остальной части вашего запроса. Таким образом, вы можете просто использовать ->condition('d.jid', $jobId), как в примере выше.

Надеюсь, это поможет

...