完全忽略新添加的字段到表

时间:2015-09-16 19:02:10

标签: mysql facebook drupal

我对Drupal来说是全新的。遗憾的是,我继承了一个非常丑陋和不正确的代码。事实上,我想实现一个正确的登录与Facebook功能,这是完全错误的实现。它试图通过他们的电子邮件地址识别用户,但是,出于某种原因,在用Facebook登录时,用户使用错误的用户登录。我想基于Facebook ID识别用户,但是,数据库中没有用于此目的的列。

结果,我实现了一个小脚本,它在表示用户的表中添加了facebook_id和facebook_token。但是,引导程序中的drupal_get_schema函数看不到这些新列。

如果我这样做:

$schema = drupal_get_schema("users");
echo var_dump($schema["fields"]);

它显示除两个新创建的字段之外的字段。这样就初始化了SchemaCache个对象。我假设可以缓存模式。所以我尝试了不同的东西:

$schema = drupal_get_schema("users", true);
echo var_dump($schema["fields"]);

确保调用drupal_get_complete_schema(true)。但是,这些领域也不是这样看的。有没有办法告诉Drupal承认两个新创建的列的存在?如果不是:我该怎么办?我应该从数据库表中删除两列并分别使用db_add_field("users", "facebook_id")和d b_add_field("users", "facebook_token")吗?如果是这样,我应该在哪里打电话?

很抱歉,如果问题太简单或者我误解了这些技术,但我已经尝试解决这个问题几个小时而且我不知所措,因为这是我的第一个drupal / bootstrap项目和使用这些的源代码根本没帮我。

编辑:

由于在撰写本文时我没有收到任何答案,除了没有解决我的问题的工具建议,我继续在该领域进行研究。我从数据库中删除了列,以Drupal方式创建它们。我在user.module中实现了这个功能:

function user_schema_alter() {
      db_add_field('users', 'facebook_id', array(
                   'type' => 'varchar', //was initially a bigint, but Drupal generated a query which always crashed
                   'length' => 20,
                   'not null' => TRUE, 
                   'default' => ".", //was initially -1, but Drupal generated a query which always crashed
      ));
      db_add_field('users', 'facebook_token', array(
                   'type' => 'varchar', 
                   'length' => 300,
                   'not null' => TRUE, 
                   'default' => 'unavailable',
      ));
}

我从altconnect.module调用它,如下所示:

    $schema = drupal_get_schema("users");
    if (!isset($schema["fields"]["facebook_id"])) {
        user_schema_alter();
    }

它创建列,但稍后将不知道这些列的存在,随后将抛出错误,因为代码将尝试重新创建它们。除了事实上我已经失去了很多时间,直到我意识到Drupal无法支持bigint作为默认值的-1字段,我必须得出结论,通过这个解决方案,我完全相同我最初的情况,不同的是,如果列已经存在,那么使用这个Drupal解决方案我总是会遇到异常,因为架构不会意识到它们,因此代码将始终输入if。

我不明白为什么在Drupal中这么困难而且我完全不明白为什么要尝试

  db_add_field('users', 'facebook_id', array(
               'type' => 'bigint', 
               'length' => 20,
               'not null' => TRUE, 
               'default' => -1,
  ));

由于语法错误而引发异常。也许我应该离开这个项目并告诉任何考虑使用Drupal重新考虑的人:)

1 个答案:

答案 0 :(得分:0)

我能够找到答案,至少对于Drupal 6来说。

在user.install中,我们需要执行以下操作:

//...
function user_schema() {
    //...
    $schema['users'] = array(
        //...
        'fields' => array(
        //...
        'facebook_id' => array(
                   'type' => 'varchar', 
                   'length' => 20,
                   'not null' => TRUE, 
                   'default' => ".",
        ),
        'facebook_token' => array(
                   'type' => 'varchar', 
                   'length' => 300,
                   'not null' => TRUE, 
                   'default' => 'unavailable',
        ),
        //...
    ),
    //...
}

//...

/**
 * Adds two fields (the number is some kind of version number, should be the biggest so far for the module)
 */
function user_update_7919() {
      db_add_field('users', 'facebook_id', array(
                   'type' => 'varchar', 
                   'length' => 20,
                   'not null' => TRUE, 
                   'default' => ".",
      ));
      db_add_field('users', 'facebook_token', array(
                   'type' => 'varchar', 
                   'length' => 300,
                   'not null' => TRUE, 
                   'default' => 'unavailable',
      ));
}

完成后,请使用admin用户登录并转到http://example.com/update.php

在那里你会看到要更新的东西。运行。如果你想知道我们为什么要做这一切,为什么我们不直接运行一些脚本,那么答案就是这就是Drupal的运作方式。它让你的生活变得复杂,但不要担心,当你等到update.php进行更新时,如果它是你的脚本需要不到一秒的时间,你可以思考生命的意义,量子力学或者你可以试着找出Drupal中这么复杂的原因你可以出去散步。再次关注时,如果运气好,update.php已完成其工作,两列应位于数据库中。