Я работаю неделями, чтобы попытаться решить эту проблему. Мне нужно управлять связью между PHP и базой данных Microsoft Access .mdb.
Моя цель – создать веб-страницу, содержащую таблицу с полями таблицы базы данных. Но у моей таблицы около 30 столбцов, я бы хотел вставить только 6 из них.
Пример:
Название базы данных: DinamicoWeb
Название таблицы: Заказы
Название поля: Id Ord, Дата, Имя, Фамилия, Цена, Итого
Это код, который мне удалось написать (поставить внутри ВСЕ столбцы).
config.php
<?php define ('DBNAME',"./DinamicoWeb.mdb"); // Database name define ('DBTBL',"Ordini"); // Table name define ('PKNAME',"Id Ord"); // Primary Key define ('PKCOL',0); // Posotion Primary Key define ('LINKPK',true); // PK link for edit/delete ?>
test.php
<?php require_once("config.php"); $cn = new COM("ADODB.Connection"); $cnStr = "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=". realpath(DBNAME).";"; $cn->open($cnStr); $rs = $cn->execute("SELECT * FROM ".DBTBL); $numFields = $rs->Fields->count; // Print HTML echo '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">'; echo '<html xmlns="http://www.w3.org/1999/xhtml">'; echo '<head>'; echo '<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />'; echo '<title>Gestione degli '.DBTBL.'</title>'; echo '<link href="styles.css" rel="stylesheet" type="text/css" />'; echo '</head><body>'; echo '<h1>GESTIONE '.DBTBL.'</h1>'; // Elenca records ----- echo ("<table class='datatable' summary='Prova dati con MS Access'>"); echo("<caption>Tabella ".DBTBL."</caption>\n"); echo("<thead><tr>\n"); for ($i=0;$i<$numFields;$i++){ echo("<th scope='col'>"); echo $rs->Fields($i)->name; echo("</th>\n"); } echo("</tr></thead>\n"); echo("<tbody>"); $alt = false; while (!$rs->EOF) { echo("<tr>"); for ($i=0;$i<$numFields;$i++){ $altClass = $alt ? " class='alt'" : ""; if (LINKPK && $i==PKCOL){ echo "<td".$altClass."><a href='?id=".$rs->Fields($i)->value ."'>".$rs->Fields($i)->value."</a></td>\n"; } else{ echo "<td".$altClass.">".$rs->Fields($i)->value."</td>\n"; } } echo("</tr>\n"); $rs->MoveNext(); $alt = !$alt; } echo("</tbody>"); echo("</table>\n"); echo ("<p>[ <a href='?ins=1'>Inserimento nuovo record</a> ]</p>"); // Modifica record ----- if (!empty($_GET['id'])){ $id = intval($_GET['id']); $rs = $cn->execute("SELECT * FROM ".DBTBL." WHERE ".PKNAME."=".$id); echo ("<form action='modify.php' method='post'>"); echo ("<fieldset>"); echo ("<legend>Modifica record</legend>"); for ($i=0;$i<$numFields;$i++){ if (LINKPK && $i==PKCOL){ echo ("<label for='".$rs->Fields($i)->name."'>" .$rs->Fields($i)->name."</label>"); echo ("<input type='text' readonly='readonly' name='" .$rs->Fields($i)->name."' value=\"" .$rs->Fields($i)->value."\" /><br />\n"); } else { echo ("<label for='".$rs->Fields($i)->name."'>" .$rs->Fields($i)->name."</label>"); echo ("<input type='text' name='".$rs->Fields($i)->name."' value=\"" .$rs->Fields($i)->value."\" /><br />\n"); } } echo ("<button type='submit' name='azione' value='modifica'>Modifica</button>"); echo ("<button class='affiancato' type='submit' name='azione' value='cancella'>Cancella</button>"); echo ("</fieldset></form>"); } // Inserimento record ----- elseif (!empty($_GET['ins'])){ echo ("<form action='modify.php' method='post'>"); echo ("<fieldset>"); echo ("<legend>Inserimento record</legend>"); for ($i=0;$i<$numFields;$i++){ if ($i!=PKCOL){ echo ("<label for='".$rs->Fields($i)->name."'>" .$rs->Fields($i)->name."</label>"); echo ("<input type='text' name='".$rs->Fields($i)->name."' /><br />\n"); } } echo ("<button type='submit' name='azione' value='inserisci'>Inserisci</button>"); echo ("<br />"); echo ("</fieldset></form>"); } echo '</body></html>'; $rs->Close(); $cn->Close(); ?>
PS: Это здорово преобразовать файл .php в .html-файл с динамическим php внутри.
PSS: Следующим шагом будет также создание фильтров с помощью combobox и checkbox
Если возможно, я бы добавил заголовки столбцов вручную, а не с помощью While, чтобы сделать отзывчивую таблицу с jQuery и подходящей
Например:
<table class="footable" data-filter="#filter"> <thead> <tr> <th data-sort-initial="descending" data-class="expand"> [Id Ord] </th> <th data-sort-ignore="true"> [Name] </th> <th data-hide="phone,tablet"> [Surname] </th> <th data-hide="phone,tablet" data-type="numeric"> [Price] </th> <th data-hide="phone" data-type="numeric"> [Total] </th> </tr> </thead>
+ Изменить
$rs = $cn->execute("SELECT * FROM ".DBTBL);
запрашивать только шесть столбцов
$rs = $cn->execute("SELECT [Id Ord], [Ord Date], [Name], [Surname], [Price], [Total] FROM ".DBTBL);