connect_errno) { fail("MySQL connection failed: " . $mysqli->connect_error); } $mysqli->set_charset('utf8'); $table = 'mf_participant'; $columns = array( 'participation_option' => array('definition' => "VARCHAR(50) NULL", 'after' => 'conference_fee'), 'participation_days' => array('definition' => "VARCHAR(255) NULL", 'after' => 'participation_option'), 'one_day_lodging' => array('definition' => "TINYINT(1) NULL DEFAULT 0", 'after' => 'participation_days'), 'diet_special' => array('definition' => "VARCHAR(255) NULL", 'after' => 'diet'), 'fee_room1' => array('definition' => "TINYINT(1) NULL DEFAULT 0", 'after' => 'fee_full'), 'fee_room_add_person' => array('definition' => "TINYINT(1) NULL DEFAULT 0", 'after' => 'fee_room1'), ); echo "Applying migration for table `" . $table . "`...\n"; foreach ($columns as $column => $meta) { if (column_exists($mysqli, $dbConfig['prodDb'], $table, $column)) { echo "SKIP: `" . $column . "` already exists.\n"; continue; } $afterSql = ''; if (!empty($meta['after']) && column_exists($mysqli, $dbConfig['prodDb'], $table, $meta['after'])) { $afterSql = " AFTER `" . $mysqli->real_escape_string($meta['after']) . "`"; } $sql = "ALTER TABLE `" . $table . "` ADD COLUMN `" . $column . "` " . $meta['definition'] . $afterSql; if (!$mysqli->query($sql)) { fail("FAILED adding `" . $column . "`: " . $mysqli->error . "\nSQL: " . $sql); } echo "OK: added `" . $column . "`.\n"; } echo "Migration complete.\n"; $mysqli->close(); function column_exists(mysqli $mysqli, $dbName, $table, $column) { $sql = "SELECT COUNT(*) AS cnt FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = ? AND TABLE_NAME = ? AND COLUMN_NAME = ?"; $stmt = $mysqli->prepare($sql); if (!$stmt) { fail("Prepare failed: " . $mysqli->error); } $stmt->bind_param('sss', $dbName, $table, $column); if (!$stmt->execute()) { fail("Column check failed: " . $stmt->error); } $result = $stmt->get_result(); $row = $result->fetch_assoc(); $stmt->close(); return isset($row['cnt']) && (int)$row['cnt'] > 0; } function fail($message) { echo "ERROR: " . $message . "\n"; exit(1); } function header_safe($header) { if (!headers_sent() && PHP_SAPI !== 'cli') { header($header); } }