Avatar billede crjensen Mester
Oprettet i dag kl. 10:55

plugin vil ikke skrive til mysql-databasen

Jeg forsøger at lave et wordpress-plugin. Jeg får hjælp af Claude.ai.
I mit plugin indtaster brugeren en youtube-url og en mailadresse, og pluginet gemmer herefter videoen på serveren og ved hjælp af openai api laves der en analyse og samtalespørgsmål til videoen. Pluginet gemmer informationerne i hjemmesidens database.
Det går fint med, at pluginet i databasen opretter den ønskede tabel, men herefter går det galt: hver gang pluginet kører, kan den ikke gemme data i tabellens kolonner.
Jeg kan se tabellen i phpMyAdmin, og kolonner og rækker er der som de skal være, men der bliver ikke gemt data.
Databasestruktur og login-opsætning, password og den slags er ok.
Når jeg i terminalen kører tail -f /var/www/vhosts/kirkegpt.dk/logs/error_log får jeg, uanset hvad jeg gør, fejl i stil med, at indsættelse i databasen lykkedes ("Insert successfull. New ID:19"), men det er bare ikke rigtigt: Der er intet i databasen!

Og så er der disse fejl: "Database update failed: Unknown column 'error_message' in 'field list'" og "Process Sermons Error - Sermon ID: 16, Error: Database fejl ved opdatering af prædiken: Unknown column 'questions' in 'field list' ...Database update failed: Unknown column 'error_message' in 'field list'" - som jo viser, at pluginet ikke får skrevet noget i databasen. Den genkender ikke kolonnerne, selv om de ér der - og pluginet selv har oprettet dem.

Hvad er det, jeg gør forkert?

Her er phpMyAdmins eget svar på, hvad tabellen indeholder (og det er korrekt):
DESCRIBE clkf79de95221_sermon_analysis;
id    mediumint(9)    NO    PRI    NULL    auto_increment   
user_id    bigint(20)    NO    MUL    NULL       
username    varchar(60)    NO        NULL       
user_email    varchar(100)    NO        NULL       
youtube_url    text    NO        NULL       
video_path    text    YES        NULL       
audio_path    text    YES        NULL       
transcription    longtext    YES        NULL       
summary    longtext    YES        NULL       
questions    longtext    YES        NULL       
devotionals    longtext    YES        NULL       
quotes    longtext    YES        NULL       
personal_page_url    text    YES        NULL       
status    varchar(50)    YES        pending       
error_message    text    YES        NULL       
created_at    datetime    YES        current_timestamp()       


Her er fra pluginet den php-fil, som kører database-håndteringen, og den har en række error handling logs (bemærk, den er skabt ved hjælp af Claude.ai) :

<?php
class Database_Handler {
    private $table_name;
   
    public function __construct() {
        global $wpdb;
        $this->table_name = $wpdb->prefix . 'sermon_analysis';
        error_log('Database_Handler initialized with table name: ' . $this->table_name);
       
        // Verify table exists
        $table_exists = $wpdb->get_var(
            $wpdb->prepare("SHOW TABLES LIKE %s", $this->table_name)
        );
        error_log('Table exists check: ' . ($table_exists ? 'Yes' : 'No'));
    }
   
    /**
    * Indsætter en ny prædiken-analyse i databasen
    */
    public function insert_sermon($data) {
        global $wpdb;
       
        error_log('Starting insert_sermon with data: ' . print_r($data, true));
       
        // Valider nødvendige felter
        if (empty($data['user_name']) || empty($data['user_email']) || empty($data['youtube_url'])) {
            error_log('Missing required fields');
            throw new Exception('Manglende påkrævede felter for prædiken-analyse');
        }
       
        $current_user = wp_get_current_user();
       
        $insert_data = array(
            'user_id' => $current_user->ID,
            'username' => sanitize_text_field($data['user_name']),
            'user_email' => sanitize_email($data['user_email']),
            'youtube_url' => esc_url_raw($data['youtube_url']),
            'status' => 'pending',
            'created_at' => current_time('mysql')
        );
       
        error_log('Prepared insert data: ' . print_r($insert_data, true));
        error_log('Using table name: ' . $this->table_name);
       
        // Log the actual SQL query that will be executed
        $query = $wpdb->prepare(
            "INSERT INTO {$this->table_name}
            (user_id, username, user_email, youtube_url, status, created_at)
            VALUES (%d, %s, %s, %s, %s, %s)",
            $insert_data['user_id'],
            $insert_data['username'],
            $insert_data['user_email'],
            $insert_data['youtube_url'],
            $insert_data['status'],
            $insert_data['created_at']
        );
        error_log('Prepared SQL query: ' . $query);
       
        $result = $wpdb->query($query);
       
        if ($result === false) {
            error_log('Insert failed with error: ' . $wpdb->last_error);
            throw new Exception('Database fejl ved indsættelse af prædiken: ' . $wpdb->last_error);
        }
       
        $insert_id = $wpdb->insert_id;
        error_log('Insert successful with ID: ' . $insert_id);
       
        // Verify the insert
        $verify = $wpdb->get_row(
            $wpdb->prepare("SELECT * FROM {$this->table_name} WHERE id = %d", $insert_id),
            ARRAY_A
        );
        error_log('Verification query result: ' . print_r($verify, true));
       
        return $insert_id;
    }
   
    /**
    * Opdaterer en eksisterende prædiken-analyse
    */
    public function update_sermon($sermon_id, $data) {
        global $wpdb;
       
        error_log('Starting update_sermon with ID: ' . $sermon_id);
        error_log('Update data: ' . print_r($data, true));
       
        $current_data = $this->get_sermon($sermon_id);
        error_log('Current data in database: ' . print_r($current_data, true));
       
        // Build update query manually for more control
        $updates = array();
        $values = array();
       
        foreach ($data as $key => $value) {
            // Skip non-updatable fields
            if (in_array($key, ['id', 'user_id', 'created_at'])) {
                continue;
            }
           
            // Sanitize based on field type
            switch ($key) {
                case 'user_email':
                    $value = sanitize_email($value);
                    break;
                case 'youtube_url':
                    $value = esc_url_raw($value);
                    break;
                case 'questions':
                case 'devotionals':
                case 'quotes':
                    $value = is_array($value) ? wp_json_encode($value) : $value;
                    break;
                default:
                    $value = sanitize_text_field($value);
            }
           
            $updates[] = "`$key` = %s";
            $values[] = $value;
        }
       
        if (empty($updates)) {
            error_log('No fields to update');
            return true;
        }
       
        // Add sermon_id to values array
        $values[] = $sermon_id;
       
        $query = $wpdb->prepare(
            "UPDATE {$this->table_name} SET " . implode(', ', $updates) . " WHERE id = %d",
            $values
        );
       
        error_log('Update query: ' . $query);
       
        $result = $wpdb->query($query);
       
        if ($result === false) {
            error_log('Update failed with error: ' . $wpdb->last_error);
            throw new Exception('Database fejl ved opdatering af prædiken: ' . $wpdb->last_error);
        }
       
        // Verify the update
        $verify = $this->get_sermon($sermon_id);
        error_log('Verification after update: ' . print_r($verify, true));
       
        return true;
    }
   
    /**
    * Henter en specifik prædiken-analyse
    */
    public function get_sermon($sermon_id) {
        global $wpdb;
       
        error_log('Getting sermon with ID: ' . $sermon_id);
       
        $query = $wpdb->prepare("SELECT * FROM {$this->table_name} WHERE id = %d", $sermon_id);
        error_log('Get sermon query: ' . $query);
       
        $sermon = $wpdb->get_row($query, ARRAY_A);
       
        if (!$sermon) {
            error_log('No sermon found with ID: ' . $sermon_id);
            throw new Exception('Prædiken ikke fundet');
        }
       
        error_log('Found sermon data: ' . print_r($sermon, true));
       
        $unserialized = $this->unserialize_sermon_data($sermon);
        error_log('Unserialized sermon data: ' . print_r($unserialized, true));
       
        return $unserialized;
    }
   
    /**
    * Henter alle prædiken-analyser for en specifik bruger
    */
    public function get_user_sermons($user_name) {
        global $wpdb;
       
        error_log('Getting sermons for user: ' . $user_name);
       
        $query = $wpdb->prepare(
            "SELECT * FROM {$this->table_name} WHERE username = %s ORDER BY created_at DESC",
            $user_name
        );
        error_log('Get user sermons query: ' . $query);
       
        $sermons = $wpdb->get_results($query, ARRAY_A);
       
        error_log('Found ' . count($sermons) . ' sermons');
        error_log('Sermons data: ' . print_r($sermons, true));
       
        return array_map(array($this, 'unserialize_sermon_data'), $sermons);
    }
   
    /**
    * Henter alle ventende prædiken-analyser
    */
    public function get_pending_sermons() {
        global $wpdb;
       
        error_log('Getting pending sermons');
       
        $query = "SELECT * FROM {$this->table_name} WHERE status = 'pending' ORDER BY created_at ASC";
        error_log('Get pending sermons query: ' . $query);
       
        $sermons = $wpdb->get_results($query, ARRAY_A);
       
        error_log('Found ' . count($sermons) . ' pending sermons');
       
        return $sermons;
    }
   
    /**
    * Sletter en prædiken-analyse og tilhørende filer
    */
    public function delete_sermon($sermon_id) {
        global $wpdb;
       
        error_log('Attempting to delete sermon with ID: ' . $sermon_id);
       
        // Hent sermon data først
        $sermon = $this->get_sermon($sermon_id);
        error_log('Sermon data before deletion: ' . print_r($sermon, true));
       
        // Slet filer hvis de eksisterer
        if (!empty($sermon['video_path']) && file_exists($sermon['video_path'])) {
            error_log('Deleting video file: ' . $sermon['video_path']);
            unlink($sermon['video_path']);
        }
        if (!empty($sermon['audio_path']) && file_exists($sermon['audio_path'])) {
            error_log('Deleting audio file: ' . $sermon['audio_path']);
            unlink($sermon['audio_path']);
        }
       
        // Slet fra database
        $query = $wpdb->prepare(
            "DELETE FROM {$this->table_name} WHERE id = %d",
            $sermon_id
        );
        error_log('Delete query: ' . $query);
       
        $result = $wpdb->query($query);
       
        if ($result === false) {
            error_log('Delete failed with error: ' . $wpdb->last_error);
            throw new Exception('Database fejl ved sletning af prædiken: ' . $wpdb->last_error);
        }
       
        error_log('Sermon deleted successfully');
        return true;
    }
   
    /**
    * Hjælpefunktion til at unserialisere JSON-data fra databasen
    */
    private function unserialize_sermon_data($sermon) {
        if (!is_array($sermon)) {
            error_log('Cannot unserialize non-array sermon data');
            return $sermon;
        }
       
        $json_fields = array('questions', 'devotionals', 'quotes');
       
        foreach ($json_fields as $field) {
            if (isset($sermon[$field]) && !empty($sermon[$field])) {
                $decoded = json_decode($sermon[$field], true);
                if (json_last_error() === JSON_ERROR_NONE) {
                    $sermon[$field] = $decoded;
                } else {
                    error_log('JSON decode error for field ' . $field . ': ' . json_last_error_msg());
                }
            }
        }
       
        return $sermon;
    }
   
    /**
    * Oprydning af gamle analyser
    */
    public function cleanup_old_sermons($days = 30) {
        global $wpdb;
       
        error_log('Starting cleanup of old sermons older than ' . $days . ' days');
       
        $query = $wpdb->prepare(
            "SELECT id FROM {$this->table_name} WHERE created_at < DATE_SUB(NOW(), INTERVAL %d DAY)",
            $days
        );
        error_log('Cleanup query: ' . $query);
       
        $old_sermons = $wpdb->get_results($query, ARRAY_A);
       
        error_log('Found ' . count($old_sermons) . ' old sermons to clean up');
       
        foreach ($old_sermons as $sermon) {
            try {
                $this->delete_sermon($sermon['id']);
            } catch (Exception $e) {
                error_log('Cleanup error for sermon ' . $sermon['id'] . ': ' . $e->getMessage());
            }
        }
       
        error_log('Cleanup complete');
    }
}
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester



IT-JOB

Cognizant Technology Solutions Denmark ApS

Test Manager

Capgemini Danmark A/S

Network Architect