Dynamically generate html table with php of mysql records - php

The reason this is complicated (for me) is that each column of the table is loaded from a separate MySQL table, and each MySQL table will have varying number of records. Initially I thought I could start generating the html table from top-left to bottom-right column by column , cell by cell, but this won't work because each MySQL table will have different length of records, which generate malformed html tables. Do you have any suggestions?
My idea so far:
Get a list of all tables in MySQL, which determine the number of
columns
Get the count from the table with most records
Create a table with the parameters (# of tables as columns, max# as rows
Update each cell with the corresponding record, but not quite sure how
As requested, some code:
$tables = mysql_query("show tables");
$output = "<table border=1><thead><tr>";
while($table = mysql_fetch_array($tables)) {
$output .= "<td>";
$output .= $table[0];
$output .= "</td>";
$tableNames[] = $table[0];
}
$output .= "</tr></thead>";
$output .= "<tbody>";
//Get a count of the table with the most records
for($i=0; $i<count($tableNames); $i++ ){
$currentTable = $tableNames[$i];
$tableContent = mysql_query("select * from $currentTable") or die("Error: ".mysql_error());
//Generating all content for a column
$output .= "<tr>";
while($content = mysql_fetch_array($tableContent)){
//generating a cell in the column
$output .= "<td>";
$output .= "<strong>".$content['subtheme'].": </strong>";
$output .= $content['content'];
$output .= "</td>";
}
$output .= "</tr>";
}
$output .= "</tbody>";
$output .= "</table>";
This is wrong not just because it generates a malformed table, but also because it transposed columns to rows...
Any help would be appreciated

Solution to my much hated question:
$mymax = 0;
for($i=0; $i<count($tableNames); $i++){
$currentTable = $tableNames[$i];
$tableCounts = "select * from $currentTable";
if($stmt = $mysqli->prepare($tableCounts)){
mysqli_stmt_execute($stmt);
mysqli_stmt_store_result($stmt);
$count = mysqli_stmt_num_rows($stmt);
mysqli_stmt_close($stmt);
}
($mymax >= $count ? "" : $mymax = $count);
$colWidth = 100 / count($tableNames);
}
// DIV GRID
// via DIV GENERATION
$output .= "<div class='grid'>";
for ($i=0; $i<count($tableNames); $i++){
$output .= "<div id='col$i' class='col' style=\"width:$colWidth%\">";
$output .= "<h3>".$tableNames[$i]."</h3>";
$tableqry = "select * from $tableNames[$i]";
if ($result = mysqli_query($mysqli, $tableqry)) {
while($row = mysqli_fetch_array($result, MYSQLI_ASSOC)){
$output .= "<div class='item'>".$row["content"]."</div>";
}
mysqli_free_result($result);
}
$output .= "</div>";
}
$output .="</div>";
$output .="<div class='clear'></div>";

Related

Dynamically creating table rows and columns form MySQL database not output rows

I have written a script that would make a table in sort of a matrix based on user saved data in a MySQL database. In this example the sample information would be indicated in rows and the various analyses of each sample will be made in columns.
The example below creates the columns successfully, however the rows are completely omitted. Can anyone please provide a explenation and perhaps a solution to why the rows are not created? No errors are given, the rows are simply not shown.
if (isset($_GET['display_full_results'])) {
require 'dbh.php';
$order_id = $_GET['display_full_results'];
$sql = "SELECT * FROM samples_database WHERE order_id=$order_id AND micro_analysis!='';";
$result = mysqli_query($conn, $sql);
$micro_analysis = '';
while($input = mysqli_fetch_array($result)) {
$micro_analysis .= $input['micro_analysis'] . ',';
}
$micro_analysis_arr = array_filter(array_unique(explode(',', $micro_analysis)));
$output = '';
if (mysqli_num_rows($result) > 0) {
$output .= '
<thead>
<tr>';
foreach ($micro_analysis_arr as $row1) {
$query = "SELECT * FROM microbiology_analysis_database WHERE id=$row1";
$result3 = mysqli_query($conn, $query);
$input2 = mysqli_fetch_array($result3);
$output .= '
<th colspan="1"><th>
<th>'.$input2['m_analysis'].'</th>';
}
$output .= '</tr>
</thead>
<tbody>';
while ($row = mysqli_fetch_assoc($result)) {
$output .= '
<tr>
<td>'.$row['env_sam_id'].'</td>
<td><input>Empty</td>
<td><input>Empty</td>
</tr>';
}
$output .= '</tbody>';
}
echo $output;
}
Have you checked if it really has data in it? use print_r($result) because it could be your query. if it shows an empty array then you should use print($sql) to get query then paste it on phpmyadmin to check if your query is right.

Dynamically put contenteditable based on specific value

Im trying to put contenteditable based on the value of term, Example, If the value of term is "Prelim" the row prelim will be editable and the rest is not editable. But the problem to my solution is, there are no data displayed but the row number is correct and the expected row to be editable is editable. It's just blank. Can someone help me to find what's the cause of this?
output of my code:
Here's the code. I just put the important code here I did not put the other code because i think the one causing problem is the way of my if else statement.
while($row = mysqli_fetch_array($result))
{
$sql1 = "SELECT * FROM encode";
$results = mysqli_query($con,$sql1);
while($row = mysqli_fetch_array($results)){
$term = $row['term'];
}
$output .= '<tr>
<td>'.$row['lastname'].'</td>
<td>'.$row['firstname'].'</td>
<td>'.$row['middlename'].'</td>';
if($term == "Prelim"){
$output .= '<td class="prelim" data-id1="'.$row['grade_id'].'" contenteditable>'.$row['prelim_grade'].'</td>';
}
else{
$output .= '<td class="prelim" data-id1="'.$row['grade_id'].'">'.$row['prelim_grade'].'</td>';
}
if($term == "Midterm"){
$output .= '<td class="midterm" data-id2="'.$row['grade_id'].'" contenteditable>'.$row['midterm_grade'].'</td>';
}
else{
$output .= '<td class="midterm" data-id2="'.$row['grade_id'].'">'.$row['midterm_grade'].'</td>';
}
if($term == "Finals"){
$output .= '<td class="finals" data-id3="'.$row['grade_id'].'">'.$row['finals_grade'].'</td>';
}
else{
$output .= '<td class="finals" data-id3="'.$row['grade_id'].'">'.$row['finals_grade'].'</td>';
}
if($term == "Final Grade"){
$output .= ' <td class="final" data-id4="'.$row['grade_id'].'" contenteditable>'.$row['final_grade'].'</td>';
}
else{
$output .= ' <td class="final" data-id4="'.$row['grade_id'].'">'.$row['final_grade'].'</td>';
}
$output .=' </tr>';
}
Ok. You have used the variable $row in the wrong way. First you assign $row = mysqli_fetch_array($result) in the outer while loop. Then again you assign to the same variable $row = mysqli_fetch_array($results) in the inner while loop.
The values you expect to get are in the $results variable. But your current assignment (which happen in the inner while loop) make your $row variable's value to be overridden by a row in $result. All you have to do is just use two variables to access rows in those 2 queries.
while($row = mysqli_fetch_array($result))
{
$sql1 = "SELECT * FROM encode";
$results = mysqli_query($con,$sql1);
while($otherRow = mysqli_fetch_array($results)){
$term = $otherRow['term'];
}
// Your existing code
}
Hope this will solve your problem.

How to remove selected columns from dynamically generated html-table?

I have an SQL-database where I read out data that are then shown in a dynamically generated html-table. Here is my code that works fine:
$sql = "SELECT $selection FROM $tabelle WHERE $masterarray";
$result = mysqli_query($db, $sql) or die("Invalid query");
$numrows = mysqli_num_rows($result);
$numcols = mysqli_num_fields($result);
$field = mysqli_fetch_fields($result);
if ($numrows > 0) {
echo "<table>";
echo "<thead>";
echo "<tr>";
echo "<th>" . 'Nr' . "</th>";
for($x=0;$x<$numcols;$x++){
echo "<th>" . $field[$x]->name . "</th>";
}
echo "</tr>";
echo "</thead>";
echo "<tbody>";
echo "<tr>";
$nr = 1;
while ($row = mysqli_fetch_array($result)) {
echo "<td>" . $nr . "</td>";
for ($k=0; $k<$numcols; $k++) {
echo "<td>" . $row[$k] . "</td>"; //Prints the data
}
$nr = $nr + 1;
echo "</tr>";
}
echo "</tbody>";
echo "</table>";
}
}
mysqli_close($db);
Now, I want to remove specific columns (e.g. those, which are empty or those, which are not that interesting for the user, who makes the request).
I tried it with unset($field[$variable]), however, it didn't work. In addition, the values (if there are any), should be removed, too.
can let mysql filter them out for you,
$sql = "SELECT $selection FROM $tabelle WHERE $masterarray AND LENGTH($selection) > 0";
-- http://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_length
Always format the array before you print it. Try to remove the specific columns from the $field array before you echo the HTML and then print the final table. Once the HTML code is echoed in PHP you won't be able to remove it without the use of JavaScript.
You can check against the $field[$x]->name variable and use continue to skip the column.
<?php
// DataBase Config - http://php.net/manual/pt_BR/pdo.construct.php.
$dsn = 'mysql:host=localhost;dbname=test';
$usr = 'root';
$pwd = '';
try { // try to connect in database.
$pdo = new PDO($dsn, $usr, $pwd);
} catch (PDOException $e) { // if there is error in the connection.
die('Connection failed: ' . $e->getMessage());
}
// Prepare Statement and execute - http://php.net/manual/pt_BR/pdo.prepare.php.
$stm = $pdo->prepare('select id, weight, color, name from product');
$stm->execute();
// Get ALL rows - Object.
$rows = $stm->fetchAll(PDO::FETCH_OBJ);
// Print Rows.
//echo '<pre>'.print_r(rows, true).'</pre>';
// Check $row;
if (count($rows)) {
// Order and Display Cols.
$colsDisplay = [
'id' => 'ID Product',
'name' => 'Name',
'weight' => 'Weigth'
];
// Table.
$html = '<table border="1">';
$html .= "\n <thead>";
$html .= "\n <tr>";
$html .= "\n <th bgcolor='#eee'>Row</th>";
$html .= "\n <th>". implode("</th>\n <th>", $colsDisplay) ."</th>";
$html .= "\n </tr>";
$html .= "\n </thead>";
$html .= "\n <tbody>";
// Loop ROWS.
foreach ($rows as $key => $val) {
$html .= "\n <tr>";
$html .= "\n <td bgcolor='#eee'>". $key ."</td>";
// Loop COLS to display.
foreach ($colsDisplay as $thKey => $thVal) {
$html .= "\n <td>". $val->$thKey ."</td>";
}
$html .= "\n </tr>";
}
$html .= "\n".' </tbody>';
$html .= "\n".'</table>';
echo $html;
}
In order to know that a column is empty, you should check the whole column. There are different ways to do it, one of them could be investigating which of them are empty and then only using those that aren't empty. Something like this:
<?php
// ...
$q = "SELECT SUM(LENGTH(my_first_column)) col_0, SUM(LENGTH(my_second_column)) col_1, ..., SUM(LENGTH(my_11th_column)) col_10 FROM $tabelle WHERE $masterarray";
// ... execute query and return results in $nonEmpty
$nonEmpty = array();
foreach($row as $columnIndex) {
if ($row[$columnIndex] > 0) {
$nonEmpty[] = $columnIndex;
}
}
// ... now go through results and print only cols with at least one row with lenght > 0 i.e. non empty
$len = 11;
$rowHTML = "<tr>";
while ($row = mysqli_fetch_array($result)) {
for ($i = 0; $i < $len; ++$i) {
$rowHTML = '';
if (!in_array($i, $nonEmpty)) {
$rowHTML .= '<td>' . $row[$i] . '</td>';
}
$rowHTML .= "</tr>\n";
}
}
// ...
This chunk of code will remove columns with ALL empty values. If you have at least one cell in the column with some value, you'll see the column in your result.
The code isn't optimized - it's just a rough idea. But it's a starting point.

PHP: MySQL to table

I just wrote simple PHP code that would print some of these rows
That's how does my table structure looks like:
That's my PHP code:
$user = mysql_query("SELECT usr FROM ava_members");
$id = mysql_query("SELECT id FROM ava_members");
$email = mysql_query("SELECT email FROM ava_members");
$dt = mysql_query("SELECT dt FROM ava_members");
//$result = mysql_query("SELECT id,email,dt,regIP FROM ava_members ORDER BY dt LIMIT 5");
$final = "";
$final .= "<table border='1'><tr>";
/* TABELA */
$final .= "<td>Nick</td>";
$final .= "<td>ID</td>";
$final .= "<td>Email</td>";
$final .= "<td>Data</td>";
//$final .= "</tr>\n";
/* TABELA */
//user
while($row = mysql_fetch_row($user))
{
$final .= "<tr>";
foreach($row as $cell)
$final .= "<td>$cell <a href=\"\?usrdel=$cell\"\>[DELETE]</a></td>";
$final .= "</tr>\n";
}
//ID
while($row = mysql_fetch_row($id))
{
$final .= "<tr>";
foreach($row as $cell)
$final .= "<td>$cell</td>";
$final .= "</tr>\n";
}
//email
while($row = mysql_fetch_row($email))
{
$final .= "<tr>";
foreach($row as $cell)
$final .= "<td>$cell</td>";
$final .= "</tr>\n";
}
//dt
while($row = mysql_fetch_row($dt))
{
$final .= "<tr>";
foreach($row as $cell)
$final .= "<td>$cell</td>";
$final .= "</tr>\n";
}
mysql_free_result($user);
mysql_free_result($id);
mysql_free_result($email);
mysql_free_result($dt);
echo '<center>' . $final . '</center>';
And there's output:
But as you can guess that's not what I want...
Output that I want should look like this:
It's pretty simple - just learn in2 html tables
You should learn SQL:
$data = mysql_query("SELECT usr, id, email, dt FROM ava_members");
while ($row = mysql_fetch_row($data))
{
$final .= "<tr>";
foreach($row AS $k => $cell) {
$final .= '<td>' . htmlspecialchars($cell);
if ($k == 'usr') {
$final .= '<td>[DELETE]';
}
$final .= '</td>';
}
$final .= "</tr>\n";
}
And yes, do not use mysql_. Use mysqli_ instead.
Here's a function that I wrote to display the data from a MySQL database as an HTML table:
/* Returns all of the results from a query in one nice table */
/* Example usage: echo $db->allResults("taxi0", "time, latitude, longitude",40,50); */
function allResults($table,$cols,$limstart,$lim) {
if(isset($cols)) {
$query = "SELECT $cols FROM $table LIMIT $limstart,$lim";
}
else {
$query = "SELECT * FROM $table LIMIT $limstart,$lim";
}
$result = $this->query($query);
$output = '<table class="allResults">';
$data = array();
while($row = $this->fetchAssoc($result)) {
$data[] = $row;
}
$colNames = array_keys(reset($data));
$output .= "<tr>";
foreach($colNames as $colName) {
$output .= "<th>$colName</th>";
}
$output .= "</tr>";
foreach($data as $row) {
$output .= "<tr>";
foreach($colNames as $colName) {
$output .= "<td>".$row[$colName]."</td>";
}
$output .= "</tr>";
}
$output .= '</table>';
return $output;
}
Hope it will help you out.
PDO example, as it is both not deprecated and more fun:
// precondition: $row should be a numbered array of column data
function table_row_from_db_row($row) {
$result = '';
foreach($row as $key => $value) {
$result .= "<td>$value</td>\n";
}
return "<tr>\n$result</tr>\n";
}
// precondition: $headers should be an associative array representing the
// first row
function table_head_from_first_row($row) {
$result = '';
foreach($row as $name => $unused) {
$result .= "<th>$name</th>\n";
}
return "<tr>\n$result</tr>\n";
}
// precondition: $sth is a PDO statement handle from a query that returns
// more than 0 rows.
// postcondition: if there were no rows, returns NULL. Otherwise returns
// an HTML table as a string.
function table_from_query_handle($sth) {
$result = '';
// Fetch the first row so we can get column header names.
$row = $sth->fetch(PDO::FETCH_ASSOC);
if(!$row) {
return NULL;
}
$result .= table_head_from_first_row($row);
do {
$result .= table_row_from_db_row($row);
}
while($row = $sth->fetch(PDO::FETCH_ASSOC));
return "<table>\n$result</table>\n";
}
// Alias the column names to the table headers we want to use on the page.
// If we wanted to build the table manually it would still help that we don't
// have two different names for each field (e.g. `dt` and `data`).
$query = "select usr Nick, id ID, email Email, dt Data from ava_members";
// Connect to the database. This belongs in another file in production code.
$dbh = new PDO('mysql:host=localhost;dbname=test');
// Execute the query and get a statement handle.
$sth = $dbh->query($query);
echo table_from_query_handle($sth);

Search multiple tables and display as multiple tables

I want my users to search my database to return data from two different tables which I have done using UNION but I want it to not only search from two tables but to also display as two tables..How can I go about doing this?
$result .= "<table border='1'>";
$result .="<tr><td>Cater</td><td>Part</td><td>Gids</td></tr>";
while ($row = mysql_fetch_array($sql)){
$result .= '<tr>';
$result .= '<td>'.$row['Name'].'</td>';
$result .= '<td>'.$row['Part'].'</td>';
$result .= '<td>'.$row['Gid'].'</td>';
$result .= '</tr>';
}
$result .= "</table>";
$result .= "<table border='1'>";
$result .="<tr><td>Cater</td><td>Dish</td><td>Gids</td></tr>";
while ($row = mysql_fetch_array($sql)){
$result .= '<tr>';
$result .= '<td>'.$row['Name'].'</td>';
$result .= '<td>'.$row['Dish'].'</td>';
$result .= '<td>'.$row['Gid'].'</td>';
$result .= '</tr>';
}
$result .= "</table>";
If you're going to do it this way, you need some way to tell where the first results end and the second start. An easy way is to add an extra column in the result set:
Select
0 as resultset,
Name,
Part,
Gid
From
Parts
Union All
1,
Name,
Dish,
Gid
From
Dishes
Order By
resultset -- I'm not sure if you need this, or whether you get it for free
Then you need to break out of the first loop if you've moved to the second result set. Also, the column names in the union will all reflect the first part, so I've changed Dish to Part. You also have to deal with the possibility that either or both of the parts of the union may return nothing.
$result .= "<table border='1'>";
$result .="<tr><td>Cater</td><td>Part</td><td>Gids</td></tr>";
while ($row = mysql_fetch_assoc($sql) && $row['resultset'] === 0) {
$result .= '<tr>';
$result .= '<td>'.$row['Name'].'</td>';
$result .= '<td>'.$row['Part'].'</td>';
$result .= '<td>'.$row['Gid'].'</td>';
$result .= '</tr>';
}
$result .= "</table>";
$result .= "<table border='1'>";
$result .="<tr><td>Cater</td><td>Dish</td><td>Gids</td></tr>";
while ($row){
$result .= '<tr>';
$result .= '<td>'.$row['Name'].'</td>';
$result .= '<td>'.$row['Part'].'</td>';
$result .= '<td>'.$row['Gid'].'</td>';
$result .= '</tr>';
$row = mysql_fetch_assoc($sql);
}
$result .= "</table>";
Your probably do have two tables but right next to each other. Try putting something visble in between. I put an HR but you can put what makes sense visually for your page. Even a BR ot table header text would work.
$result .= "<table border='1'>";
$result .="<tr><td>Cater</td><td>Part</td><td>Gids</td></tr>";
while ($row = mysql_fetch_array($sql)){
$result .= '<tr>';
$result .= '<td>'.$row['Name'].'</td>';
$result .= '<td>'.$row['Part'].'</td>';
$result .= '<td>'.$row['Gid'].'</td>';
$result .= '</tr>';
}
$result .= "</table>";
$result .= "<hr />"; <=========
$result .= "<table border='1'>";
$result .="<tr><td>Cater</td><td>Dish</td><td>Gids</td></tr>";
while ($row = mysql_fetch_array($sql)){
$result .= '<tr>';
$result .= '<td>'.$row['Name'].'</td>';
$result .= '<td>'.$row['Dish'].'</td>';
$result .= '<td>'.$row['Gid'].'</td>';
$result .= '</tr>';
}
$result .= "</table>";

Categories