Tabel header sorteerbaar maken werkt niet
Momenteel ben ik het boek "Via het boek "PHP and MySQL for Dynamic Web Sites Visual QuickPro Guide 4th Edition" aan het volgen.
Ik ben nu bij de hoofdstuk 10 en ik probeer de header van een tabel sorteerbaar te maken. D.w.z. dat elke tabel header klikbaar wordt en wanneer je klikt op een header dan kun je kolom sorteren.
En voorheen werkt de select query wel, maar nu helaas niet meer.
Ik heb veel geprobeerd, maar kom helaas niet uit, want alle code komt uit het boek met kleine aanpassingen van mezelf.
De foutmeldin is als volgt:
Warning: mysqli_num_rows() expects parameter 1 to be mysqli_result, boolean given in /mnt/weba/e1/99/51995699/htdocs/dev/test2/view_users.php on line 77
URL: http://dev.pc-on-rails.nl/test2/view_users.php
Op zich is de foutcode wel logisch, maar het lukt me niet om het te verhelpen.
Zie hieronder graag de broncode:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
<?php
$sort = (isset($_GET['sort'])) ?
$_GET['sort'] : 'rd';
//Determine the sorting order:
switch ($sort) {
case 'fn':
$order_by = 'firstname ASC';
break;
case 'ln':
$order_by = 'lastname ASC';
break;
case 'em':
$order_by = 'email ASC';
break;
case 'pn':
$order_by = 'pharmacyname ASC';
break;
case 'tl':
$order_by = 'telephone ASC';
break;
case 'rd':
$order_by = 'registration_date ASC';
break;
default:
$order_by = 'registration_date ASC';
$sort = 'rd';
break;
}
// Make the query:
$q = "SELECT firstname, lastname, email, pharmacyname, telephone, DATE_FORMAT(registrationdate, '%M %d, %Y') AS dr, user_id FROM users ORDER BY $order_by LIMIT $start, $display";
$r = @mysqli_query ($connection, $q); // Run the query.
//Count the number of returned row:
$num = mysqli_num_rows($r);
if ($num > 0) { // If it ran OK, display the records.
//Print how many users there are:
echo "<p>There are currently $num registered users</p>\n";
// Table header.
echo '<table align="center" cellspacing="3" cellpadding="3" width="75%">
<tr>
<td align="left"><b><a href="view_users.php?sort=fn">FirstName</a></b></td>
<td align="left"><b><a href="view_users.php?sort=ln">LastName</a></b></td>
<td align="left"><b><a href="view_users.php?sort=em">EmailAddress</a></b></td>
<td align="left"><b><a href="view_users.php?sort=pn">PharmacyCompany</a></b></td>
<td align="left"><b><a href="view_users.php?sort=tl">Telephonenumber</a></b></td>
<td align="left"><b><a href="view_users.php?sort=dr">Registration Date</a></b></td>
<td align="left"><b>Edit</b></td>
<td align="left"><b>Delete</b></td>
</tr>';
// Fetch and print all the records:
while ($row = mysqli_fetch_array($r, MYSQLI_ASSOC)) {
echo '<tr>
<td align="left">' . $row['firstname'] .'</td>
<td align="left">' . $row['lastname'] .'</td>
<td align="left">' . $row['email'] .'</td>
<td align="left">' . $row['pharmacyname'] .'</td>
<td align="left">' . $row['telephone'] .'</td>
<td align="left">' . $row['dr'] .'</td>
<td align="left"><a href="edit_user.php?id=' . $row['user_id'] .'">Edit</a></td>
<td align="left"><a href="delete_user.php?id=' . $row['user_id'] .'">Delete</a></td>
</tr>';
}
echo '</table>'; // Close the table.
mysqli_free_result ($r); // Free up the resources.
} else { // If no records were returnd.
echo '<p class="error">There are currently no registered users</p>';
} // End of if ($r) IF.
mysqli_close($connection); // Close the database connection.
// Make the links to other pages, if necessary.
if ($pages > 1) {
// Add some spacing and start a paragraph:
echo '<br /><p>';
// Determine what page the script is on:
$current_page = ($start/$display) + 1;
// If it's not the first page, make a Previous link:
if ($current_page != 1) {
echo '<a href="view_users.
php?s=' . ($start - $display) .
'&p=' . $pages . '&sort=' .
$sort. '">Previous</a> ';
}
// Make all the numbered pages:
for ($i = 1; $i <= $pages; $i++) {
if ($i != $current_page) {
echo '<a href="view_users.
php?s=' . (($display * ($i -
1))) . '&p=' . $pages .
'&sort=' . $sort.'">' . $i . '</a> ';
} else {
echo $i . ' ';
}
} // End of FOR loop.
// If it's not the last page, make a Next button:
if ($current_page != $pages) {
echo '<a href="view_users.
php?s=' . ($start + $display) .
'&p=' . $pages .
'&sort=' . $sort.'">Next</a>';
}
echo '</p>'; // Close the paragraph.
} // End of links section.
include ('includes/footer.php');
?>
$sort = (isset($_GET['sort'])) ?
$_GET['sort'] : 'rd';
//Determine the sorting order:
switch ($sort) {
case 'fn':
$order_by = 'firstname ASC';
break;
case 'ln':
$order_by = 'lastname ASC';
break;
case 'em':
$order_by = 'email ASC';
break;
case 'pn':
$order_by = 'pharmacyname ASC';
break;
case 'tl':
$order_by = 'telephone ASC';
break;
case 'rd':
$order_by = 'registration_date ASC';
break;
default:
$order_by = 'registration_date ASC';
$sort = 'rd';
break;
}
// Make the query:
$q = "SELECT firstname, lastname, email, pharmacyname, telephone, DATE_FORMAT(registrationdate, '%M %d, %Y') AS dr, user_id FROM users ORDER BY $order_by LIMIT $start, $display";
$r = @mysqli_query ($connection, $q); // Run the query.
//Count the number of returned row:
$num = mysqli_num_rows($r);
if ($num > 0) { // If it ran OK, display the records.
//Print how many users there are:
echo "<p>There are currently $num registered users</p>\n";
// Table header.
echo '<table align="center" cellspacing="3" cellpadding="3" width="75%">
<tr>
<td align="left"><b><a href="view_users.php?sort=fn">FirstName</a></b></td>
<td align="left"><b><a href="view_users.php?sort=ln">LastName</a></b></td>
<td align="left"><b><a href="view_users.php?sort=em">EmailAddress</a></b></td>
<td align="left"><b><a href="view_users.php?sort=pn">PharmacyCompany</a></b></td>
<td align="left"><b><a href="view_users.php?sort=tl">Telephonenumber</a></b></td>
<td align="left"><b><a href="view_users.php?sort=dr">Registration Date</a></b></td>
<td align="left"><b>Edit</b></td>
<td align="left"><b>Delete</b></td>
</tr>';
// Fetch and print all the records:
while ($row = mysqli_fetch_array($r, MYSQLI_ASSOC)) {
echo '<tr>
<td align="left">' . $row['firstname'] .'</td>
<td align="left">' . $row['lastname'] .'</td>
<td align="left">' . $row['email'] .'</td>
<td align="left">' . $row['pharmacyname'] .'</td>
<td align="left">' . $row['telephone'] .'</td>
<td align="left">' . $row['dr'] .'</td>
<td align="left"><a href="edit_user.php?id=' . $row['user_id'] .'">Edit</a></td>
<td align="left"><a href="delete_user.php?id=' . $row['user_id'] .'">Delete</a></td>
</tr>';
}
echo '</table>'; // Close the table.
mysqli_free_result ($r); // Free up the resources.
} else { // If no records were returnd.
echo '<p class="error">There are currently no registered users</p>';
} // End of if ($r) IF.
mysqli_close($connection); // Close the database connection.
// Make the links to other pages, if necessary.
if ($pages > 1) {
// Add some spacing and start a paragraph:
echo '<br /><p>';
// Determine what page the script is on:
$current_page = ($start/$display) + 1;
// If it's not the first page, make a Previous link:
if ($current_page != 1) {
echo '<a href="view_users.
php?s=' . ($start - $display) .
'&p=' . $pages . '&sort=' .
$sort. '">Previous</a> ';
}
// Make all the numbered pages:
for ($i = 1; $i <= $pages; $i++) {
if ($i != $current_page) {
echo '<a href="view_users.
php?s=' . (($display * ($i -
1))) . '&p=' . $pages .
'&sort=' . $sort.'">' . $i . '</a> ';
} else {
echo $i . ' ';
}
} // End of FOR loop.
// If it's not the last page, make a Next button:
if ($current_page != $pages) {
echo '<a href="view_users.
php?s=' . ($start + $display) .
'&p=' . $pages .
'&sort=' . $sort.'">Next</a>';
}
echo '</p>'; // Close the paragraph.
} // End of links section.
include ('includes/footer.php');
?>
Alvast bedankt voor jullie feedback!
Gewijzigd op 11/11/2016 22:13:20 door - Ariën -
Een goede tip, onderdruk geen fourmeldingen met @.
Het probleem heb ik nu opgelost.
Boven de SQL query had ik daar staan de verkeerde kolomsnaam. Na het aanpassen van kolomsnaam wordt nu wel alles weergeven. De tabel headers zijn nu ook klikbaar en het is mogelijk om het te sorteren. Echter, ik merk nu dat enkel ASC werkt en niet DESC. Dus wanneer de lijst als ASC wordt weergegeven kan ik niet terug naar DESC...
Iemand een idee?
Je hebt helemaal geen DESC sortering in deze pagina ingebouwd, dus logischerwijs wordt er altijd ASC gesorteerd.
Je hebt helemaal gelijk.
Na het analyseren van de code kwam ik tot dezelfde conclusie.
Ik ga eens kijken hoe ik DESC sorting ook erin kan krijgen. En eigenlijk lijkt het praktijk het een filter functie ook heeft. D.w.z. een functie zoals dat mogelijk is in Excel. Je kiest dus zelf resultaten worden weergegeven op basis van een gekozen onderdeel.
Jan
Bedankt voor je suggestie.
Dit is natuurlijk ook een optie, maar is het handiger om het via SQL te doen, aangezien deze nu reeds geïntegreerd is sql query en verder in de tabel?
Het is voor grote hoeveelheden data altijd handiger om het in SQL te doen, al is het alleen maar omdat je er bakken bandbreedte mee bespaart. Ik zou nooit javascript sortering adviseren in je data tenzij je een bijzondere reden hebt om het te gebruiken.