mysql WordPress插件激活时的数据库表创建问题

c6ubokkw  于 2024-01-05  发布在  Mysql
关注(0)|答案(1)|浏览(190)

日安,请我试图在插件激活创建表。有些表创建成功,为什么有些不。一个问题是支付服务名称和货币部分。它创建了表列,但没有行与默认值。我已经尝试了所有我可以,但行仍然没有显示。我甚至删除了表,并再次激活插件重新创建,但仍然没有表行内的表携带指定的默认值。请问出路是什么??

  1. function hdm_plugin_activate() {
  2. global $wpdb;
  3. // Create a custom table to store keywords and their status
  4. $table_name_keywords = $wpdb->prefix . 'hdm_article_keywords';
  5. $charset_collate = $wpdb->get_charset_collate();
  6. $sql_keywords = "CREATE TABLE $table_name_keywords (
  7. id mediumint(9) NOT NULL AUTO_INCREMENT,
  8. keyword varchar(255) NOT NULL,
  9. status varchar(20) NOT NULL,
  10. selected_by varchar(255) DEFAULT NULL,
  11. assigned_by mediumint(9) DEFAULT NULL,
  12. assigned_time datetime DEFAULT '0000-00-00 00:00:00' NOT NULL,
  13. hours_to_complete int(11) DEFAULT 0 NOT NULL,
  14. PRIMARY KEY (id)
  15. ) $charset_collate;";
  16. // Create the table for cost per word
  17. $table_name_cost_per_word = $wpdb->prefix . 'hdm_cost_per_word';
  18. $sql_cost_per_word = "CREATE TABLE $table_name_cost_per_word (
  19. id mediumint(9) NOT NULL AUTO_INCREMENT,
  20. cost_per_word decimal(10, 3) NOT NULL,
  21. PRIMARY KEY (id)
  22. ) $charset_collate;";
  23. // Create the table for currency
  24. $table_name_currency = $wpdb->prefix . 'hdm_article_keyword_currency';
  25. $sql_currency = "CREATE TABLE $table_name_currency (
  26. id mediumint(9) NOT NULL DEFAULT '1',
  27. currency_code varchar(3) NOT NULL DEFAULT 'USD',
  28. PRIMARY KEY (id)
  29. ) $charset_collate;";
  30. // Create the table for payment service names
  31. $table_name_payments = $wpdb->prefix . 'hdm_keyword_payments';
  32. $sql_payments = "CREATE TABLE $table_name_payments (
  33. id mediumint(9) NOT NULL DEFAULT '1',
  34. payment1 VARCHAR(255) NOT NULL DEFAULT 'Paypal ID',
  35. payment2 VARCHAR(255) NOT NULL DEFAULT 'Payoneer Email',
  36. PRIMARY KEY (id)
  37. ) $charset_collate;";
  38. // Add 'Content Writer' role
  39. add_role('hdm_content_writer_role', __('HDM Content Writer'), array(
  40. 'read' => true,
  41. 'edit_posts' => true,
  42. 'delete_posts' => true,
  43. 'upload_files' => true, // Allow adding images to posts
  44. // Add other capabilities as needed
  45. ));
  46. // Add 'HDM Editor' role
  47. add_role('hdm_proofreader', __('HDM Editor'), array(
  48. 'read' => true,
  49. 'edit_posts' => true,
  50. 'delete_posts' => true,
  51. 'upload_files' => true,
  52. 'edit_published_posts' => true,
  53. 'publish_posts' => true,
  54. 'moderate_comments' => true,
  55. // Add other capabilities as needed
  56. ));
  57. // Use dbDelta to create/modify tables
  58. require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
  59. dbDelta($sql_keywords);
  60. dbDelta($sql_cost_per_word);
  61. dbDelta($sql_currency);
  62. $wpdb->query($sql_payments);
  63. }

字符串
我尝试使用下面的代码来强制创建。它工作,但由于ID值1再次激活时返回致命错误。当我删除ID值时,它工作,但在每次激活和停用后继续创建新行。

  1. // Insert default currency options for rows not created
  2. $default_currency_code = 'USD';
  3. $wpdb->insert($table_name_currency, array('currency_code' => $default_currency_code));
  4. $wpdb->insert($table_name_payments, array('payment1' => 'Paypal ID', 'payment2' => 'Payoneer Email'));

rqmkfv5c

rqmkfv5c1#

先不考虑这是一个Wordpress安装的事实,你所做的并没有多大意义。你所做的核心是在你引用的两个“有问题”的表中创建一个PRIMARY KEY字段(也就是说,一个与该表中的所有其他行相比确保唯一的字段),该字段具有DEFAULT值。
你怎么能期望它在逻辑上可能有一个唯一的PRIMARY KEY,它只是默认为一个静态值,特别是当INSERT处理数据时,你没有显式地分配一个id值?虽然假设这 * 可能 * 工作(以及为什么这不是一个错误的原因)如果您有一些算法来生成有效id值,并在INSERT语句中显式地提供它们,那么这似乎不是您想要的。
解决方案是删除id列的DEFAULT,并允许MySQL的AUTO_INCREMENT功能为您处理分配:

  1. $sql_payments = "CREATE TABLE $table_name_payments (
  2. id mediumint(9) NOT NULL AUTO_INCREMENT,
  3. payment1 VARCHAR(255) NOT NULL DEFAULT 'Paypal ID',
  4. payment2 VARCHAR(255) NOT NULL DEFAULT 'Payoneer Email',
  5. PRIMARY KEY (id)
  6. ) $charset_collate;";

字符串

相关问题