2016-09-30 3 views
1

У меня есть SQL-база данных, где я считываю данные, которые затем отображаются в динамически сгенерированной таблице html. Вот мой код, который работает отлично:Как удалить выбранные столбцы из динамически созданного html-таблицы?

$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); 

Теперь я хочу, чтобы удалить определенные столбцы (например, те, которые являются пустыми или те, которые не так интересны для пользователя, который делает запрос).

Я попробовал его с unset($field[$variable]), однако это не сработало. Кроме того, значения (если они есть) также должны быть удалены.

+0

Если вы можете, переключитесь с 'mysqli' на' PDO': вы сможете сделать простой 'fetchAll' и использовать' array_column' для повторения каждого столбца и проверить, является ли он интересным. – Xenos

ответ

0

Всегда отформатируйте массив перед его печатью. Попытайтесь удалить конкретные столбцы из массива $field, прежде чем вы эхо из HTML, а затем распечатайте финальную таблицу. После того, как HTML-код будет эхом в PHP, вы не сможете удалить его без использования JavaScript.

Вы можете проверить переменную $field[$x]->name и использовать continue, чтобы пропустить столбец.

+0

Это именно то, что я хотел бы сделать! Как я могу проверить значение переменной $ field [$ x] -> name, чтобы пропустить столбец? – Columbus

0
<?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; 

} 
+0

Спасибо, Джеральдо за ваше решение! Это именно то, что я хочу сделать, и отлично работает с вашим массивом $ rows-array! Однако, когда я пытаюсь поместить его в свой код, я всегда получаю таблицу с именами правильного столбца, но с 6 пустыми строками. Я думаю, что проблема должна быть в моем запросе базы данных. Я получаю результаты из базы данных с помощью $ rows = mysqli_fetch_array ($ result), который работает с моим старым кодом, но, к сожалению, не с вашим решением. Не могли бы вы дать мне пример того, как я должен выполнить свой запрос базы данных, чтобы получить мои строки $? – Columbus

+0

Надеюсь, это поможет вам. –

0

Для того, чтобы знать, что столбец пуст, вы должны проверить весь столбец. Существуют разные способы сделать это, один из них может исследовать, какой из них пуст, а затем использовать только те, которые не пусты. Что-то вроде этого:

<?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"; 
    } 
} 

// ... 

Этот кусок кода удалит столбцы со ВСЕМИ пустым значением. Если у вас есть хотя бы одна ячейка в столбце с некоторым значением, вы увидите столбец в своем результате.

Код не оптимизирован - это всего лишь приблизительная идея. Но это отправная точка.