fix: split initDatabase() into separate exec() calls per table

MySQL/PDO doesn't support multiple CREATE TABLE statements in a single
exec() call. Split into an array of individual statements with a loop.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-10 15:15:55 +02:00
parent 13e0d1255f
commit e540ec0448

90
db.php
View File

@@ -30,8 +30,10 @@ function getDb(): PDO {
function initDatabase(): void {
$db = getDb();
$db->exec("
CREATE TABLE IF NOT EXISTS companies (
// Jokainen CREATE TABLE omana exec()-kutsuna — MySQL/PDO ei tue useaa lausetta kerralla
$tables = [
"CREATE TABLE IF NOT EXISTS companies (
id VARCHAR(50) PRIMARY KEY,
nimi VARCHAR(255) NOT NULL,
luotu DATETIME,
@@ -41,17 +43,17 @@ function initDatabase(): void {
logo_file VARCHAR(255) DEFAULT '',
api_key VARCHAR(64) DEFAULT '',
cors_origins TEXT DEFAULT ''
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4",
CREATE TABLE IF NOT EXISTS company_domains (
"CREATE TABLE IF NOT EXISTS company_domains (
id INT AUTO_INCREMENT PRIMARY KEY,
company_id VARCHAR(50) NOT NULL,
domain VARCHAR(255) NOT NULL,
FOREIGN KEY (company_id) REFERENCES companies(id) ON DELETE CASCADE,
UNIQUE KEY udx_domain (domain)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4",
CREATE TABLE IF NOT EXISTS users (
"CREATE TABLE IF NOT EXISTS users (
id VARCHAR(20) PRIMARY KEY,
username VARCHAR(100) NOT NULL UNIQUE,
password_hash VARCHAR(255) NOT NULL,
@@ -59,46 +61,46 @@ function initDatabase(): void {
role ENUM('admin','user') DEFAULT 'user',
email VARCHAR(255) DEFAULT '',
luotu DATETIME
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4",
CREATE TABLE IF NOT EXISTS user_companies (
"CREATE TABLE IF NOT EXISTS user_companies (
user_id VARCHAR(20) NOT NULL,
company_id VARCHAR(50) NOT NULL,
PRIMARY KEY (user_id, company_id),
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
FOREIGN KEY (company_id) REFERENCES companies(id) ON DELETE CASCADE
) ENGINE=InnoDB;
) ENGINE=InnoDB",
CREATE TABLE IF NOT EXISTS user_signatures (
"CREATE TABLE IF NOT EXISTS user_signatures (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id VARCHAR(20) NOT NULL,
mailbox_id VARCHAR(20) NOT NULL,
signature TEXT,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
UNIQUE KEY udx_user_mailbox (user_id, mailbox_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4",
CREATE TABLE IF NOT EXISTS config (
"CREATE TABLE IF NOT EXISTS config (
config_key VARCHAR(100) PRIMARY KEY,
config_value TEXT
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4",
CREATE TABLE IF NOT EXISTS reset_tokens (
"CREATE TABLE IF NOT EXISTS reset_tokens (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id VARCHAR(20) NOT NULL,
token VARCHAR(64) NOT NULL UNIQUE,
created_at DATETIME NOT NULL,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
) ENGINE=InnoDB;
) ENGINE=InnoDB",
CREATE TABLE IF NOT EXISTS login_attempts (
"CREATE TABLE IF NOT EXISTS login_attempts (
id INT AUTO_INCREMENT PRIMARY KEY,
ip VARCHAR(45) NOT NULL,
attempted_at DATETIME NOT NULL,
INDEX idx_ip_time (ip, attempted_at)
) ENGINE=InnoDB;
) ENGINE=InnoDB",
CREATE TABLE IF NOT EXISTS customers (
"CREATE TABLE IF NOT EXISTS customers (
id VARCHAR(20) PRIMARY KEY,
company_id VARCHAR(50) NOT NULL,
yritys VARCHAR(255),
@@ -118,9 +120,9 @@ function initDatabase(): void {
muokkaaja VARCHAR(100) DEFAULT '',
FOREIGN KEY (company_id) REFERENCES companies(id) ON DELETE CASCADE,
INDEX idx_company (company_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4",
CREATE TABLE IF NOT EXISTS customer_connections (
"CREATE TABLE IF NOT EXISTS customer_connections (
id INT AUTO_INCREMENT PRIMARY KEY,
customer_id VARCHAR(20) NOT NULL,
asennusosoite VARCHAR(255) DEFAULT '',
@@ -131,9 +133,9 @@ function initDatabase(): void {
sopimuskausi VARCHAR(100) DEFAULT '',
alkupvm VARCHAR(20) DEFAULT '',
FOREIGN KEY (customer_id) REFERENCES customers(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4",
CREATE TABLE IF NOT EXISTS leads (
"CREATE TABLE IF NOT EXISTS leads (
id VARCHAR(20) PRIMARY KEY,
company_id VARCHAR(50) NOT NULL,
yritys VARCHAR(255),
@@ -150,9 +152,9 @@ function initDatabase(): void {
muokkaaja VARCHAR(100) DEFAULT '',
FOREIGN KEY (company_id) REFERENCES companies(id) ON DELETE CASCADE,
INDEX idx_company (company_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4",
CREATE TABLE IF NOT EXISTS tickets (
"CREATE TABLE IF NOT EXISTS tickets (
id VARCHAR(20) PRIMARY KEY,
company_id VARCHAR(50) NOT NULL,
subject VARCHAR(500),
@@ -172,9 +174,9 @@ function initDatabase(): void {
INDEX idx_company (company_id),
INDEX idx_status (status),
INDEX idx_message_id (message_id(255))
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4",
CREATE TABLE IF NOT EXISTS ticket_messages (
"CREATE TABLE IF NOT EXISTS ticket_messages (
id VARCHAR(20) PRIMARY KEY,
ticket_id VARCHAR(20) NOT NULL,
type VARCHAR(20) NOT NULL,
@@ -185,25 +187,25 @@ function initDatabase(): void {
message_id VARCHAR(500) DEFAULT '',
FOREIGN KEY (ticket_id) REFERENCES tickets(id) ON DELETE CASCADE,
INDEX idx_ticket (ticket_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4",
CREATE TABLE IF NOT EXISTS ticket_tags (
"CREATE TABLE IF NOT EXISTS ticket_tags (
ticket_id VARCHAR(20) NOT NULL,
tag VARCHAR(100) NOT NULL,
PRIMARY KEY (ticket_id, tag),
FOREIGN KEY (ticket_id) REFERENCES tickets(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4",
CREATE TABLE IF NOT EXISTS archives (
"CREATE TABLE IF NOT EXISTS archives (
id VARCHAR(20) PRIMARY KEY,
company_id VARCHAR(50) NOT NULL,
data JSON NOT NULL,
archived_at DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (company_id) REFERENCES companies(id) ON DELETE CASCADE,
INDEX idx_company (company_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4",
CREATE TABLE IF NOT EXISTS changelog (
"CREATE TABLE IF NOT EXISTS changelog (
id VARCHAR(20) PRIMARY KEY,
company_id VARCHAR(50) NOT NULL,
timestamp DATETIME NOT NULL,
@@ -214,9 +216,9 @@ function initDatabase(): void {
details TEXT,
FOREIGN KEY (company_id) REFERENCES companies(id) ON DELETE CASCADE,
INDEX idx_company_time (company_id, timestamp)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4",
CREATE TABLE IF NOT EXISTS mailboxes (
"CREATE TABLE IF NOT EXISTS mailboxes (
id VARCHAR(20) PRIMARY KEY,
company_id VARCHAR(50) NOT NULL,
nimi VARCHAR(255),
@@ -230,9 +232,9 @@ function initDatabase(): void {
aktiivinen BOOLEAN DEFAULT TRUE,
FOREIGN KEY (company_id) REFERENCES companies(id) ON DELETE CASCADE,
INDEX idx_company (company_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4",
CREATE TABLE IF NOT EXISTS ticket_rules (
"CREATE TABLE IF NOT EXISTS ticket_rules (
id VARCHAR(20) PRIMARY KEY,
company_id VARCHAR(50) NOT NULL,
name VARCHAR(255),
@@ -245,9 +247,9 @@ function initDatabase(): void {
auto_close_days INT DEFAULT 0,
FOREIGN KEY (company_id) REFERENCES companies(id) ON DELETE CASCADE,
INDEX idx_company (company_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4",
CREATE TABLE IF NOT EXISTS files (
"CREATE TABLE IF NOT EXISTS files (
id INT AUTO_INCREMENT PRIMARY KEY,
company_id VARCHAR(50) NOT NULL,
customer_id VARCHAR(20) NOT NULL,
@@ -258,8 +260,16 @@ function initDatabase(): void {
uploaded_by VARCHAR(100),
FOREIGN KEY (company_id) REFERENCES companies(id) ON DELETE CASCADE,
INDEX idx_company_customer (company_id, customer_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
");
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4",
];
foreach ($tables as $i => $sql) {
try {
$db->exec($sql);
} catch (PDOException $e) {
throw new RuntimeException("Taulun luonti epäonnistui (taulu #" . ($i+1) . "): " . $e->getMessage());
}
}
}
// ==================== YRITYKSET ====================