'Falsches Admin Passwort!']); exit; } } /* ---------------- AJAX Update Row ------------------- */ if (isset($_POST['action']) && $_POST['action'] === 'updateRow') { header('Content-Type: application/json; charset=utf-8'); $table = $_POST['table']; $primaryKey = $_POST['primaryKey']; $primaryValue = $_POST['primaryValue']; $data = json_decode($_POST['data'], true); $result = updateRow($conn, $table, $primaryKey, $primaryValue, $data); sqlsrv_close($conn); echo json_encode($result); exit; } /* ---------------- AJAX Add new Row ------------------- */ if (isset($_POST['action']) && $_POST['action'] === 'insertRow') { header('Content-Type: application/json; charset=utf-8'); $table = $_POST['table']; $data = json_decode($_POST['data'], true); $result = insertRow($conn, $table, $data); sqlsrv_close($conn); echo json_encode($result); exit; } /* ---------------- AJAX delete Row ------------------- */ if (isset($_POST['action']) && $_POST['action'] === 'deleteRow') { header('Content-Type: application/json; charset=utf-8'); $table = $_POST['table']; $primaryKey = $_POST['primaryKey']; $primaryValue = $_POST['primaryValue']; $result = deleteRow($conn, $table, $primaryKey, $primaryValue); sqlsrv_close($conn); echo json_encode($result); exit; } /* ---------------- Struktur Export ------------------- */ if (isset($_GET['structure'])) { header('Content-Type: application/json; charset=utf-8'); if (isset($_GET['format'])) { if ($_GET['format'] == "sql") { echo getDatabaseStructureExport($conn, "sql"); } else { echo getDatabaseStructureExport($conn); } } else { echo getDatabaseStructureExport($conn); } sqlsrv_close($conn); exit; } /* ---------------- Tabellen Export ------------------- */ if (isset($_GET['export'], $_GET['table'])) { header('Content-Type: application/json; charset=utf-8'); if (isset($_GET['format'])) { if ($_GET['format'] == "sql") { echo exportTableData($conn, $_GET['table'], "sql"); } else { echo exportTableData($conn, $_GET['table']); } } else { echo exportTableData($conn, $_GET['table']); } sqlsrv_close($conn); exit; } /* ---------------- Funktionen ------------------- */ function getDatabaseStructureExport($conn, $format = 'json') { $tables = getTables($conn); $structure = []; foreach ($tables as $table) { $query = " SELECT COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, IS_NULLABLE, COLUMN_DEFAULT FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = ?; "; $stmt = sqlsrv_query($conn, $query, [$table]); if (!$stmt) continue; $columns = []; while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) { $columns[] = [ 'name' => $row['COLUMN_NAME'], 'type' => $row['DATA_TYPE'], 'length' => $row['CHARACTER_MAXIMUM_LENGTH'], 'nullable' => $row['IS_NULLABLE'], 'default' => $row['COLUMN_DEFAULT'] ]; } sqlsrv_free_stmt($stmt); $structure[$table] = $columns; } if ($format === 'array') { return $structure; } if ($format === 'json') { return json_encode($structure, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE); } if ($format === 'sql') { $sqlText = "-- Exportierte Tabellenstruktur\n\n"; foreach ($structure as $table => $columns) { $sqlText .= "CREATE TABLE [$table] (\n"; $lines = []; foreach ($columns as $col) { $line = " [{$col['name']}] {$col['type']}"; if (!is_null($col['length']) && $col['length'] > 0) { $line .= "({$col['length']})"; } elseif ($col['length'] == -1) { $line .= "(MAX)"; } $line .= $col['nullable'] === 'NO' ? " NOT NULL" : " NULL"; if (!is_null($col['default'])) { $line .= " DEFAULT {$col['default']}"; } $lines[] = $line; } $sqlText .= implode(",\n", $lines) . "\n);\n\n"; } return $sqlText; } return null; } function exportTableData($conn, $table, $output_format = 'json') { $query = "SELECT * FROM [$table]"; $stmt = sqlsrv_query($conn, $query); if (!$stmt) { return json_encode(['error' => sqlsrv_errors()], JSON_PRETTY_PRINT); } $data = []; $insertSQL = ''; $columns = []; $fieldMeta = sqlsrv_field_metadata($stmt); foreach ($fieldMeta as $field) { $columns[] = $field['Name']; } while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) { if ($output_format === 'json' || $output_format === 'file') { foreach ($row as $key => $value) { if ($value instanceof DateTime) { $row[$key] = $value->format('Y-m-d H:i:s'); } } $data[] = $row; } if ($output_format === 'sql' || $output_format === 'file') { $values = array_map(function ($v) { if (is_null($v)) return "NULL"; if ($v instanceof DateTime) return "'" . $v->format('Y-m-d H:i:s') . "'"; return "'" . str_replace("'", "''", $v) . "'"; }, array_values($row)); $insertSQL .= "INSERT INTO [$table] (" . implode(", ", $columns) . ") VALUES (" . implode(", ", $values) . ");\n"; } } sqlsrv_free_stmt($stmt); if ($output_format === 'file') { $timestamp = date("Ymd_His"); $dir = __DIR__ . "/db_backup"; if (!is_dir($dir)) mkdir($dir, 0777, true); $jsonFile = "$dir/{$table}_$timestamp.json"; $sqlFile = "$dir/{$table}_$timestamp.sql"; file_put_contents($jsonFile, json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE)); file_put_contents($sqlFile, $insertSQL); return json_encode([ "message" => "Daten gespeichert", "json_path" => $jsonFile, "sql_path" => $sqlFile ], JSON_PRETTY_PRINT); } if ($output_format === 'json') { return json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE); } return $insertSQL; } function getTables($conn) { $query = "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE';"; $stmt = sqlsrv_query($conn, $query); $tables = []; while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) { $tables[] = $row['TABLE_NAME']; } sqlsrv_free_stmt($stmt); return $tables; } function getColumns($conn, $table) { $query = "SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = ?;"; $stmt = sqlsrv_query($conn, $query, [$table]); $columns = []; while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) { $columns[] = $row['COLUMN_NAME']; } sqlsrv_free_stmt($stmt); return $columns; } function getTableData($conn, $table) { $query = "SELECT * FROM [$table];"; $stmt = sqlsrv_query($conn, $query); $rows = []; while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) { foreach ($row as $key => $value) { if ($value instanceof DateTime) { $row[$key] = $value->format('Y-m-d H:i:s'); } } $rows[] = $row; } sqlsrv_free_stmt($stmt); return $rows; } function executeSQL($conn, $sql, $format = "json", $admin_pass = null, $realPass="", $exporttableName = "") { $stmtType = strtoupper(strtok(trim($sql), " ")); // erstes Wort der Query erkennen // Prüfen ob Query eine Änderung macht $isWriteQuery = in_array($stmtType, ["INSERT", "UPDATE", "DELETE", "ALTER", "DROP", "CREATE"]); // Falls Schreib-Query und kein gültiges Passwort => sofort Fehler zurück if ($isWriteQuery && $admin_pass !== $realPass) { return ["error" => "Incorrect admin password for write operations."]; } $stmt = sqlsrv_query($conn, $sql); if ($stmt === false) { return sqlsrv_errors(); // Falls ein Fehler auftritt, gebe die Fehler zurück } else { $results = []; if ($stmtType === "SELECT") { while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) { $results[] = $row; } // === JSON Export (Direkter Download) === if ($format === "json_download") { // JSON-String erzeugen $jsonData = json_encode($results, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE); // Header für JSON-Download header("Content-Type: application/json; charset=utf-8"); header("Content-Disposition: attachment; filename=" . $exporttableName . ".json"); header("Pragma: no-cache"); header("Expires: 0"); echo $jsonData; sqlsrv_free_stmt($stmt); exit; // wichtig: Skript beenden } // === BACKUP_SQL === if ($format === "backup_sql") { $meta = sqlsrv_field_metadata($stmt); if ($meta === false) { return "Fehler beim Lesen der Feld-Metadaten."; } $create = "CREATE TABLE [$exporttableName] (\n"; $cols = []; foreach ($meta as $field) { $colName = $field['Name']; switch ($field['Type']) { case SQLSRV_SQLTYPE_INT: case SQLSRV_SQLTYPE_BIGINT: case SQLSRV_SQLTYPE_SMALLINT: $colType = "INT"; break; case SQLSRV_SQLTYPE_BIT: $colType = "BIT"; break; case SQLSRV_SQLTYPE_FLOAT: case SQLSRV_SQLTYPE_REAL: $colType = "FLOAT"; break; case SQLSRV_SQLTYPE_DATETIME: case SQLSRV_SQLTYPE_DATETIME2: case SQLSRV_SQLTYPE_DATE: $colType = "DATETIME"; break; default: $colType = "NVARCHAR(MAX)"; break; } $cols[] = " [$colName] $colType"; } $create .= implode(",\n", $cols) . "\n);\n\n"; $inserts = ""; foreach ($results as $row) { $values = []; foreach ($row as $val) { if ($val === null) { $values[] = "NULL"; } elseif (is_numeric($val)) { $values[] = $val; } elseif ($val instanceof DateTime) { $values[] = "'" . $val->format("Y-m-d H:i:s") . "'"; } else { $values[] = "'" . str_replace("'", "''", $val) . "'"; } } $inserts .= "INSERT INTO [$exporttableName] VALUES (" . implode(", ", $values) . ");\n"; } sqlsrv_free_stmt($stmt); return $create . $inserts; } // === BACKUP_SQL Export (Direkter Download) === if ($format === "backup_sql_download") { $meta = sqlsrv_field_metadata($stmt); if ($meta === false) { return "Fehler beim Lesen der Feld-Metadaten."; } $tableName = "ExportTable"; $create = "CREATE TABLE [$tableName] (\n"; $cols = []; foreach ($meta as $field) { $colName = $field['Name']; switch ($field['Type']) { case SQLSRV_SQLTYPE_INT: case SQLSRV_SQLTYPE_BIGINT: case SQLSRV_SQLTYPE_SMALLINT: $colType = "INT"; break; case SQLSRV_SQLTYPE_BIT: $colType = "BIT"; break; case SQLSRV_SQLTYPE_FLOAT: case SQLSRV_SQLTYPE_REAL: $colType = "FLOAT"; break; case SQLSRV_SQLTYPE_DATETIME: case SQLSRV_SQLTYPE_DATETIME2: case SQLSRV_SQLTYPE_DATE: $colType = "DATETIME"; break; default: $colType = "NVARCHAR(MAX)"; break; } $cols[] = " [$colName] $colType"; } $create .= implode(",\n", $cols) . "\n);\n\n"; $inserts = ""; foreach ($results as $row) { $values = []; foreach ($row as $val) { if ($val === null) { $values[] = "NULL"; } elseif (is_numeric($val)) { $values[] = $val; } elseif ($val instanceof DateTime) { $values[] = "'" . $val->format("Y-m-d H:i:s") . "'"; } else { $values[] = "'" . str_replace("'", "''", $val) . "'"; } } $inserts .= "INSERT INTO [$tableName] VALUES (" . implode(", ", $values) . ");\n"; } $sqlDump = $create . $inserts; // Header für SQL-Download header("Content-Type: application/sql; charset=utf-8"); header("Content-Disposition: attachment; filename=" . $exporttableName . ".sql"); header("Pragma: no-cache"); header("Expires: 0"); echo $sqlDump; sqlsrv_free_stmt($stmt); exit; // wichtig: beenden } // === CSV === if ($format === "csv") { if (empty($results)) { return ""; } $output = ""; $headers = array_keys($results[0]); $output .= implode(";", $headers) . "\n"; foreach ($results as $row) { $escaped = array_map(function($val) { if ($val === null) return ""; $val = str_replace('"', '""', $val); return '"' . $val . '"'; }, $row); $output .= implode(";", $escaped) . "\n"; } sqlsrv_free_stmt($stmt); return $output; } // === EXCEL Export / EXCEL-HTML (Direkter Download) === if ($format === "excel_download") { if (empty($results)) { return ""; } $headers = array_keys($results[0]); $output = ""; foreach ($headers as $header) { $output .= ""; } $output .= ""; foreach ($results as $row) { $output .= ""; foreach ($headers as $header) { $val = $row[$header]; if ($val instanceof DateTime) { $val = $val->format("Y-m-d H:i:s"); } $output .= ""; } $output .= ""; } $output .= "
" . htmlspecialchars($header) . "
" . htmlspecialchars((string)$val) . "
"; // Header für Excel-Download header("Content-Type: application/vnd.ms-excel; charset=utf-8"); header("Content-Disposition: attachment; filename=" . $exporttableName . ".xls"); header("Pragma: no-cache"); header("Expires: 0"); echo $output; sqlsrv_free_stmt($stmt); exit; // Wichtig: Script nach Download beenden } // === CSV Export (Direkter Download) === if ($format === "csv_download") { if (empty($results)) { return ""; } // CSV erzeugen $headers = array_keys($results[0]); $output = implode(";", $headers) . "\n"; foreach ($results as $row) { $escaped = array_map(function($val) { if ($val === null) return ""; if ($val instanceof DateTime) { $val = $val->format("Y-m-d H:i:s"); } $val = str_replace('"', '""', $val); // Doppelte Anführungszeichen escapen return '"' . $val . '"'; }, $row); $output .= implode(";", $escaped) . "\n"; } // Header für CSV-Download header("Content-Type: text/csv; charset=utf-8"); header("Content-Disposition: attachment; filename=" . $exporttableName . ".csv"); header("Pragma: no-cache"); header("Expires: 0"); echo $output; sqlsrv_free_stmt($stmt); exit; // Wichtig: Skript nach Download beenden } // === Default (Array) === sqlsrv_free_stmt($stmt); return $results; } else { // Schreibende Query (hier Passwort schon vorher geprüft) $affectedRows = sqlsrv_rows_affected($stmt); sqlsrv_free_stmt($stmt); return "Anzahl der betroffenen Zeilen: " . $affectedRows; } } } /* -------- Update Row Funktion -------- */ function updateRow($conn, $table, $primaryKey, $primaryValue, $data) { $setParts = []; $params = []; foreach ($data as $col => $val) { $setParts[] = "[$col] = ?"; $params[] = $val; } $setSQL = implode(", ", $setParts); $params[] = $primaryValue; $sql = "UPDATE [$table] SET $setSQL WHERE [$primaryKey] = ?"; $stmt = sqlsrv_query($conn, $sql, $params); if ($stmt === false) { return ['error' => sqlsrv_errors()]; } sqlsrv_free_stmt($stmt); return ['success' => true]; } /* -------- Add new Row Funktion -------- */ function insertRow($conn, $table, $data) { $columns = array_keys($data); $params = []; $placeholders = []; foreach ($columns as $col) { $val = $data[$col]; if (strtoupper(trim($val)) === "NEWID()") { // SQL-Befehl direkt einfügen $placeholders[] = "NEWID()"; } else { $placeholders[] = "?"; $params[] = $val; } } $colList = implode(", ", array_map(fn($c) => "[$c]", $columns)); $placeholdersSql = implode(", ", $placeholders); $sql = "INSERT INTO [$table] ($colList) VALUES ($placeholdersSql)"; $stmt = sqlsrv_query($conn, $sql, $params); if ($stmt === false) { return ['error' => sqlsrv_errors()]; } sqlsrv_free_stmt($stmt); return ['success' => true]; } /* -------- Delete Row Funktion -------- */ function deleteRow($conn, $table, $primaryKey, $primaryValue) { $sql = "DELETE FROM [$table] WHERE [$primaryKey] = ?"; $stmt = sqlsrv_query($conn, $sql, [$primaryValue]); if ($stmt === false) { return ['error' => sqlsrv_errors()]; } sqlsrv_free_stmt($stmt); return ['success' => true]; } /* ----------------- SQL Executor (gekürzt) ----------------- */ $tables = getTables($conn); sort($tables); $currentTable = $_GET['table'] ?? null; $tableData = $currentTable ? getTableData($conn, $currentTable) : []; $tableColumns = $currentTable ? getColumns($conn, $currentTable) : []; $resultMessage = null; if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['sql_query'])) { $sqlQuery = $_POST['sql_query']; $returnformat = "json"; $adminPass = ""; $exportTabelName = "ExportTable" . rand(); if (isset($_POST['format'])) { $returnformat = $_POST['format']; } if (isset($_POST['admin_pass'])) { $adminPass = $_POST['admin_pass']; } if (!empty($_POST['exporttabelName'])) { $exportTabelName = $_POST['exporttabelName']; } $resultMessage = executeSQL($conn, $sqlQuery, $returnformat, $adminPass, $changeDataInSQLPassword, $exportTabelName); } sqlsrv_close($conn); ?> SQL-WebStudio

Tabelle:

$column): ?> $column): ?>
#


SQL Query Executor


Ergebnis: