PDOException:找不到列

时间:2013-04-08 14:37:29

标签: drupal-7

我刚接管了一位老同事制作的Drupal 7.14网站。我已登录,但每当我去管理员>内容并点击“编辑”以编辑我的任何基本页面的内容,我收到以下错误消息:

  

PDOException:SQLSTATE [42S22]:找不到列:1054'where子句'中的未知列'source':SELECT url_alias。* FROM {url_alias} url_alias WHERE(source =:db_condition_placeholder_0); path_load()中的数组([:db_condition_placeholder_0] => node / 1)(/home/sites/mediamatterstechnology.com/public_html/includes/path.inc的第419行)。

如果我进入Admin>配置> URL别名我收到类似的消息,如下所示:

  

PDOException:SQLSTATE [42S22]:找不到列:1054'where子句'中的未知列'language':SELECT 1 FROM {url_alias} WHERE language<> :语言LIMIT 0,1; path_admin_overview()中的数组([:language] => und)(/home/sites/mediamatterstechnology.com/public_html/modules/modules/path/path.admin.inc的第18行)。

如果有任何帮助,我将非常感激。我已经工作了几天,但我是Drupal的新手。

screenshot

1 个答案:

答案 0 :(得分:0)

Drupal 5Drupal 6没有这些字段中的一个(或两个)。该数据库不包含这些字段的原因可能是:

  • 该网站从Drupal 5 / Drupal 6更新到Drupal 7,更新未成功
  • 数据库损坏
  • 模块已从数据库中删除字段
  • 手动删除这些字段

您可以做的是将缺少的字段添加到数据库,尝试首先更新现有字段(如果站点是从以前的Drupal版本更新的,并且更新未成功)。

以下代码应该有所帮助。

// Drop indexes.
@db_drop_index('url_alias', 'src_language_pid');
@db_drop_unique_key('url_alias', 'dst_language_pid');

// Rename the fields, and increase their length to 255 characters.
@db_change_field('url_alias', 'src', 'source', array('type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => ''));
@db_change_field('url_alias', 'dst', 'alias', array('type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => ''));

if (db_field_exists('url_alias', 'language')) {
  $spec = array(
    'description' => "The language this alias is for; if 'und', the alias will be used for unknown languages. Each Drupal path can have an alias for each supported language.",
    'type' => 'varchar',
    'length' => 12,
    'not null' => TRUE,
    'default' => '',
  );
  db_change_field('url_alias', 'language', 'language', $spec);
  db_update('url_alias')
    ->fields(array('language' => LANGUAGE_NONE))
    ->condition('language', '')
    ->execute();
}
else {
  $spec = array(
    'description' => "The language this alias is for; if 'und', the alias will be used for unknown languages. Each Drupal path can have an alias for each supported language.",
    'type' => 'varchar',
    'length' => 12,
    'not null' => TRUE,
    'default' => '',
  );
  db_add_field('url_alias', 'language', $spec);
}

// Add indexes back.
@db_add_index('url_alias', 'source_language_pid', array('source', 'language', 'pid'));
@db_add_index('url_alias', 'alias_language_pid', array('alias', 'language', 'pid'));

如果此代码没有获取缺少的字段,那么它不是失败的更新。在这种情况下,您可以使用以下代码,当您确定该站点未从Drupal 7之前的Drupal版本更新时,应使用该代码。

// Drop indexes.
@db_drop_index('url_alias', 'src_language_pid');
@db_drop_unique_key('url_alias', 'dst_language_pid');

$spec = array(
  'description' => "The language this alias is for; if 'und', the alias will be used for unknown languages. Each Drupal path can have an alias for each supported language.",
  'type' => 'varchar',
  'length' => 12,
  'not null' => TRUE,
  'default' => '',
);
db_add_field('url_alias', 'language', $spec);

$spec = array(
  'type' => 'varchar',
  'length' => 255,
  'not null' => TRUE,
  'default' => ''
);

db_add_field('url_alias', 'source', $spec);

// Add indexes back.
@db_add_index('url_alias', 'source_language_pid', array('source', 'language', 'pid'));
@db_add_index('url_alias', 'alias_language_pid', array('alias', 'language', 'pid'));

代码是在更新以前的Drupal版本时基于系统模块使用的更新代码编写的。我添加的部分是创建数据库字段的部分,因为数据库字段通常是在Drupal安装期间创建的。