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');
}
}