PHP-databaskonstruktion

Log | Files | Refs

commit a7b202e9f121949e81b06e1b1406c7ee632a48d0
parent fd03122ec1b5c3ac7523814fc744d6f7c21f8f9e
Author: William Lindholm <william_lindholm@outlook.com>
Date:   Mon, 25 Sep 2023 09:20:03 +0000

Automatically adding dropdowns foreign key columns

Diffstat:
MComponents.php | 100++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---
Moperations.php | 1+
Mtest.php | 52+++++++++++++++++++++++++++++-----------------------
3 files changed, 127 insertions(+), 26 deletions(-)

diff --git a/Components.php b/Components.php @@ -135,6 +135,12 @@ $stmt->execute($values); } + function getPrimaryKeysOfReferencedTable($pdo, $referencedTable, $referencedColumn) { + $stmt = $pdo->prepare("SELECT $referencedColumn FROM $referencedTable"); + $stmt->execute(); + return $stmt->fetchAll(PDO::FETCH_COLUMN, 0); + } + function generateInsertFunction($tableName) { $db = Database::getInstance(); $pdo = $db->getPdo(); @@ -145,18 +151,106 @@ } $columns = fetchTableColumns($pdo, $tableName); - + $foreignKeys = getForeignKeys($tableName); + $modalBuilder = (new ModalBuilder()) ->setModalId('insertModal') ->setTableName($tableName); - + + $handledForeignKeys = []; // To keep track of which foreign keys have already been handled + foreach ($columns as $column) { - $modalBuilder->addColumn($column); + $isForeignKey = false; + + foreach ($foreignKeys as $foreignKey) { + if ($foreignKey['COLUMN_NAME'] == $column) { + if (in_array($column, $handledForeignKeys)) { + continue; // Skip if this foreign key column is already handled + } + $referencedTable = $foreignKey['REFERENCED_TABLE_NAME']; + $primaryKeyValues = fetchPrimaryKeyValues($pdo, $referencedTable); + $modalBuilder->addDropdownColumn($column, $primaryKeyValues); + $isForeignKey = true; + + // Mark the current foreign key column as handled + $handledForeignKeys[] = $column; + + // Check if any other columns reference the same table (i.e., composite key) + foreach ($foreignKeys as $fk) { + if ($fk['REFERENCED_TABLE_NAME'] == $referencedTable) { + $handledForeignKeys[] = $fk['COLUMN_NAME']; + } + } + + break; + } + } + + if (!$isForeignKey) { + $modalBuilder->addColumn($column); + } } echo $modalBuilder->generateOpenButton("Add Data"); echo $modalBuilder->build(); } + + function fetchPrimaryKeyValues($pdo, $table) { + // Get primary key columns of the table + $stmt = $pdo->prepare("SHOW KEYS FROM $table WHERE Key_name = 'PRIMARY'"); + $stmt->execute(); + $primaryKeys = $stmt->fetchAll(PDO::FETCH_ASSOC); + + // If there's only one primary key, return its values + if (count($primaryKeys) === 1) { + $column = $primaryKeys[0]['Column_name']; + $stmt = $pdo->prepare("SELECT $column FROM $table"); + $stmt->execute(); + return $stmt->fetchAll(PDO::FETCH_COLUMN, 0); + } + + // For composite primary keys + $columns = array_map(function ($item) { + return $item['Column_name']; + }, $primaryKeys); + + $selectColumns = implode(", ", $columns); + $stmt = $pdo->prepare("SELECT $selectColumns FROM $table"); + $stmt->execute(); + + $results = $stmt->fetchAll(PDO::FETCH_ASSOC); + $compositeKeyValues = []; + + foreach ($results as $row) { + $compositeKeyValues[] = implode("-", $row); // Combining multiple column values + } + + return $compositeKeyValues; + } + + function getForeignKeys($table) { + // Get the database instance and PDO object + $db = Database::getInstance(); + $pdo = $db->getPdo(); + + // Fetch the current database name + $currentDatabase = $pdo->query('SELECT DATABASE()')->fetchColumn(); + + // Prepare and execute the statement to fetch foreign keys + $stmt = $pdo->prepare(" + SELECT COLUMN_NAME, REFERENCED_TABLE_NAME, REFERENCED_COLUMN_NAME + FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE + WHERE TABLE_SCHEMA = :databaseName + AND TABLE_NAME = :tableName + AND REFERENCED_TABLE_NAME IS NOT NULL; + "); + + $stmt->bindParam(':databaseName', $currentDatabase); + $stmt->bindParam(':tableName', $table); + $stmt->execute(); + + return $stmt->fetchAll(PDO::FETCH_ASSOC); + } function isFormSubmitted() { return $_SERVER['REQUEST_METHOD'] === 'POST'; diff --git a/operations.php b/operations.php @@ -16,6 +16,7 @@ echo "<h2>Operations</h2>"; displayTable("Operation"); + generateInsertFunction("Operation"); echo "</div>"; diff --git a/test.php b/test.php @@ -1,28 +1,34 @@ <?php - - + require 'Database.php'; include 'Components.php'; - include 'modalBuilder.php'; - - generateHead(); - echo '<body>'; - $modalBuilder1 = (new ModalBuilder()) - ->setModalId('modal1') - ->setTableName('SampleTable1') - ->addColumn('FirstName') - ->addColumn('LastName') - ->addDropdownColumn('Foreign', ['hej', 'test', 'hello', 'asddfsdf']); - - $modalBuilder2 = (new ModalBuilder()) - ->setModalId('modal2') - ->setTableName('SampleTable2') - ->addColumn('Age'); - - $modalBuilder1->generateOpenButton("Open Modal 1"); - $modalBuilder1->build(); - $modalBuilder2->generateOpenButton("Open Modal 2"); - $modalBuilder2->build(); + Database::getInstance('mysql', 'a22willi', 'root', 'Safiren1'); + + function getForeignKeys($table) { + // Get the database instance and PDO object + $db = Database::getInstance(); + $pdo = $db->getPdo(); + + // Fetch the current database name + $currentDatabase = $pdo->query('SELECT DATABASE()')->fetchColumn(); + + // Prepare and execute the statement to fetch foreign keys + $stmt = $pdo->prepare(" + SELECT COLUMN_NAME, REFERENCED_TABLE_NAME, REFERENCED_COLUMN_NAME + FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE + WHERE TABLE_SCHEMA = :databaseName + AND TABLE_NAME = :tableName + AND REFERENCED_TABLE_NAME IS NOT NULL; + "); + + $stmt->bindParam(':databaseName', $currentDatabase); + $stmt->bindParam(':tableName', $table); + $stmt->execute(); + + return $stmt->fetchAll(PDO::FETCH_ASSOC); + } - echo '</body>'; + foreach (getForeignKeys('Operation') AS $op) { + print_r($op); + } ?> \ No newline at end of file