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
?
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 ...
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.