web-dev-qa-db-fra.com

Impossible de créer une nouvelle table de base de données lors de l'activation du plug-in à l'aide de dbDelta

J'essaie de créer une nouvelle table de base de données lorsque mon plug-in est activé à l'aide de dbDelta (). Cependant, aucune nouvelle table ne semble être en train de créer. Depuis que je suis nouveau dans le développement WordPress, laissez-moi savoir où je me trompe.

<?php
/*
Plugin Name: Xenon-Result
Plugin URI:  https://developer.wordpress.org/plugins/the-basics/
Description: Basic WordPress Plugin Header Comment
Version:     1.0
Author:      Himanshu Gupta
Author URI:  https://developer.wordpress.org/
License:     GPL2
License URI: https://www.gnu.org/licenses/gpl-2.0.html
*/
function installer(){
    include('installer.php');
}
register_activation_hook( __file__, 'installer' ); //executes installer php when installing plugin to create new database

add_action('admin_menu','result_menu'); //wordpress admin menu creation
function result_menu()
{
    add_menu_page('Result','Result','administrator','xenon-result');
    add_submenu_page( 'xenon-result', 'Manage Marks', ' Manage Marks', 'administrator', 'Manage-Xenon-Marks', 'Xenon_Marks' );
}
function Xenon_Marks()
{
    include('new/result-add-marks.php');
}
?>

Ceci est le fichier installer.php:

<?php
global $wpdb;
$table_name = $wpdb->prefix . "xenonresult";

$charset_collate = $wpdb->get_charset_collate();
if(!isset($table_name)){
$sql = "CREATE TABLE $table_name (
    id mediumint(9) NOT NULL AUTO_INCREMENT
    student-id mediumint(9) NOT NULL,
    student-name text NOT NULL,
    marks-obtained int(9) NOT NULL,
    result text NOT NULL,
    PRIMARY KEY  (id)
)    $charset_collate;";

require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
dbDelta( $sql );
}
?>
1
Himanshu

Voici une version mise à jour de installer.php qui crée la table lors de l'activation du plugin.

Une vérification a été ajoutée pour voir si la table personnalisée existe avant de procéder à la création de la nouvelle table.

Un numéro de version a également été ajouté. Il est stocké dans la table d'options. Cela aidera dans l’avenir si la base de données doit être modifiée lors d’une mise à jour.

<?php
    global $wpdb;
    $table_name = $wpdb->prefix . "xenonresult";
    $xenonresult_db_version = '1.0.0';
    $charset_collate = $wpdb->get_charset_collate();

    if ( $wpdb->get_var( "SHOW TABLES LIKE '{$table_name}'" ) != $table_name ) {

        $sql = "CREATE TABLE $table_name (
                id mediumint(9) NOT NULL AUTO_INCREMENT,
                `student-id` mediumint(9) NOT NULL,
                `student-name` text NOT NULL,
                `marks-obtained` int(9) NOT NULL,
                result text NOT NULL,
                PRIMARY KEY  (id)
        )    $charset_collate;";

        require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
        dbDelta( $sql );
        add_option( 'xenonresult_db_version', $xenonresult_db_version );
    }

Il y avait quelques problèmes avec le code original:

if(!isset($table_name)){

Cela retournait toujours true car $table_name était déjà défini.

Il manque une virgule à cette ligne à la fin:

id mediumint(9) NOT NULL AUTO_INCREMENT

Certains caractères dans les noms de table exigent que le nom de la table soit placé entre guillemets, ceci inclut les traits d'union :

student-id mediumint(9) NOT NULL,
student-name text NOT NULL,
marks-obtained int(9) NOT NULL,

Pour faciliter le débogage, il est conseillé de consulter le journal des erreurs PHP lorsque vous rencontrez de tels problèmes.

1
Dave Romsey

Avez-vous des erreurs? On a l'impression que c'est juste un problème SQL que vous avez. Avez-vous testé votre requête SQL manuellement et voir si cela fonctionne?

J'utilise ce qui suit et cela fonctionne, j'ai également définir et vérifier la version du tableau pour les mises à jour futures:

public function createDb()
{
         global $wpdb;

         $charsetCollate = $wpdb->get_charset_collate();

         require_once(constant('ABSPATH') . 'wp-admin/includes/upgrade.php');

         $tableName = $wpdb->prefix . 'mypluginname';
         $sql = "CREATE TABLE $tableName (
             id bigint(20) NOT NULL AUTO_INCREMENT,
             Word varchar(255) DEFAULT '' NOT NULL,
             length int(9) DEFAULT 0 NOT NULL,
             UNIQUE KEY id (id)
         ) $charsetCollate;";
         dbDelta($sql);

         update_option('myplugin_db_version', constant('MYPLUGIN_DB_VERSION'));
}

De plus, au démarrage de mon plugin, je vérifie la version de la base de données et la mets à jour si nécessaire.

public function __construct()
{
   $installedDbVersion = get_option("myplugin_db_version");
   $pluginDbVersion = constant('MYPLUGIN_DB_VERSION');
   if ((float)$installedDbVersion !== constant('MYPLUGIN_DB_VERSION') &&
      $installedDbVersion !== false
   ) {
    $this->createDb();
    $message = "Updated plugin tables from version ";
    $message .= "{$installedDbVersion} to {$pluginDbVersion}";
    trigger_error($message, E_USER_NOTICE);
   }
}
1
jamietelin