web-dev-qa-db-fra.com

Afficher les champs sous forme de valeurs dans un tableau à partir d'une base de données SQL externe

Avoir un jeu de données SQL comme celui-ci:

    Title   Author  Device1 Device2 Device3
    Title1  j cool  inputA  inputA  inputB
    Title2  l maker inputA  inputB  inputC
    Title3  m smith inputB  inputB  inputB

Voulez-vous afficher comme ceci:

    Title   Author  header1 header2 header3
    Title1  j cool  inputA: inputB:
                    Device1 Device3
                    Device2 
    Title2  l maker inputA: inputB: inputC:
                    Device1 Device2 Device3
    Title3  m smith inputB:
                    Device1
                    Device2
                    Device3

Avoir le php suivant, avec du HTML dans une table, à translittérer en wpdb :

    $sqlSelect = "SELECT * FROM titles WHERE `active` = 0 ORDER BY author, title";
    $myquery = $mysqli->query ($sqlSelect);
    if ($myquery = $mysqli->query ($sqlSelect)) {
      $result = array();
      while($row = mysqli_fetch_assoc($myquery)){
        $tmp = array();
        foreach (array('device1', 'device2', 'device3', 'device4') as $key) {
          if (!isset($tmp[$row[$key]])) $tmp[$row[$key]] = array();
          $tmp[$row[$key]][] = $key;
        }
        $result[$row['title'] . "</td><td>" . $row['author']] = $tmp;
       }

      $max = 0;
      foreach ($result as $data => $inputs) {
        $max = max($max, count($inputs));
      }
      // looping rows begins here
      foreach ($result as $data => $inputs) {
        print('<tr><td>' . $data . '</td>');
        foreach ($inputs as $input => $devices) {
          print('<td>' . $input . ':<br/>' . implode('<br/>', $devices) . '</td>');
        }
    //next two lines are for displaying no cells where there is no $data
        for ($i = 0; $i < $max - count($inputs); ++$i) {
          print('<td class="db"></td>');
        }

        print('</tr>');

J'ai essayé ceci:

    $mydb = new wpdb('user','password','database','server');
    $results = $mydb -> get_results("SELECT * FROM titles WHERE `active` = 1 ORDER BY author, title");
    $result = array();
    while ($result = $row) { //this doesn't work; and only one row without data except all devices displays without it 
        $tmp = array(); //ditto to the end

WordPress ne semble pas aimer $data. Y a-t-il un moyen de faire cela avec wpdb?

1
motorbaby

Je ne vois aucune raison d'utiliser wpdb pour cela, à moins que votre table ne soit dans la base de données Wordpress. De plus, votre code serait beaucoup plus clair (et donc moins sujet aux erreurs) si vous sépariez la récupération du résultat dans un tableau et le traitement de ce tableau pour la transformation de la génération de la sortie HTML finale. Séparez la logique de la présentation.

Donc, mettez d'abord toutes les données dans un tableau de la manière standard:

$query = ("SELECT * FROM titles WHERE `active` = 0 ORDER BY author, title");
$results_array = array();
$result = $mysqli->query($query);
while ($row = $result->fetch_assoc()) {
  $results_array[] = $row;
}

La première ligne de ce tableau, à savoir $results_array[0], par exemple, sera le tableau ('Title' => 'Title 1','Author' => 'j cool', 'Device1' => 'inputA',...)

Edit : Sinon, si vous insistez pour utiliser la classe wpdb, remplacez le code ci-dessus par:

$mydb = new wpdb('user','password','database','server');
$results_array = $mydb->get_results("SELECT * FROM titles WHERE `active` = 0 ORDER BY author, title",ARRAY_A);

$results_array a le même contenu avec les deux approches. Le reste du code ne change pas.

Fin de l'édition

Vous voulez obtenir de $results_array un tableau associatif qui associe à chaque auteur une entrée de mappage de table vers des périphériques, comme ceci:

array('j cool' => array('inputA' => array('Device1', 'Device2'),
                        'inputB' => array('Device3')),
      'l maker' => array('inputA' => array('Device1'),
                        'inputB' => array('Device2'),
                        'inputC' => array('Device3')),
       'm this' => ...)

Le code suivant suppose que vous connaissez à l'avance toutes les valeurs possibles des entrées et que celles-ci ne correspondent pas exactement aux auteurs ou aux titres.

 $inputs = array('inputA','inputB','inputC');

 $input_table = array();

 foreach ($results_array as $row) {
   $row_inputs = array();
   foreach ($inputs as $in) {
      //get all keys (devices) in $row  that have input $in as value
      $devices = array_keys($row,$in); 
      if (!empty($devices))
        $row_inputs[$in] = $devices;
   }
   $input_table[$row['Author']] = $row_inputs;
 }

Cela génère un tableau où chaque ligne, indexée par l'auteur, est un tableau semblable à l'exemple ci-dessus. Maintenant nous ajoutons le titre:

$final_table = array();
foreach ($results_array as $row) {
  $final_table[] = array('Title' => $row['Title'],
                       'Author' => $row['Author'],
                       'Inputs' => $input_table[$row['Author']]);
}

Enfin, affichez le tableau résultant en html:

$html = '';
//$html .= '<html><body>';
$html .= "<table>"; //add here code for table headers too

foreach ($final_table as $row) {
  //first row for author
  $html .= '<tr><td>'. $row['Title'] . '</td><td>' . $row['Author'] . '</td>';
  foreach (array_keys($row['Inputs']) as $in) {
    //output input names for this author
    $html .= '<td>'.$in.'</td>';
  }
  $html .= '</tr><td></td><td></td>';
  //second row for author, starting in third column
  foreach ($row['Inputs'] as $in => $devices) {
    $html .= '<td>'.implode(" ",$devices).'</td>';
  }
  $html .= '</tr>';
}

$html .= '</table>';
// $html .= </body></html>
echo $html;

Ajustez la présentation à votre guise ...

1
adelval

Pour que cela fonctionne, installez le plug-in WP DB Driver et sautez wpdb complètement. Cependant, la page ne peut récupérer que les modèles d'en-tête et de pied de page. La requête mysqli semble incompatible avec le codex WordPress.

0
motorbaby