gpt4 book ai didi

mysql - 新添加到表中的字段被完全忽略

转载 作者:行者123 更新时间:2023-11-29 22:01:21 25 4
gpt4 key购买 nike

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

因此,我实现了一个小脚本,它将 facebook_id 和 facebook_token 添加到代表用户的表中。但是,drupal_get_schema 看不到这些新列。 Bootstrap 中的函数。

如果我这样做:

$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 的人重新考虑:)

最佳答案

我能够找到答案,至少对于 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',
));
}

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

在那里您将看到要更新的内容。运行。如果您想知道为什么我们必须做这一切,为什么我们不直接运行一些脚本,那么答案是,这就是 Drupal 的运作方式。它通过让你的生活变得复杂来简化你的生活,但不用担心,当你等待 update.php 进行更新时,如果这是你的脚本,只需不到一秒,你可以思考生命的意义,量子力学或者你可以尝试找出 Drupal 中过于复杂的原因,然后你可以出去走走。当你再次集中注意力时,如果幸运的话,update.php 已经完成了它的工作,这两列应该在数据库中。

关于mysql - 新添加到表中的字段被完全忽略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32616655/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com