Reputation: 11
I have a portfolio which I would like to have listed in ASC sort order, according to several fields to choose from on top of the list. Without sorting the printout is perfect, but when activating the sort statement (line 35) I get the following error message:
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /home/domain/public_html/db_name/portfolio.php on line 47
Can somebody please help and tell me what to do with this code? Many thanks for any advice:
<html>
<head>
<meta http-equiv="Content-Language" content="en-us">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Portfolio</title>
<link rel="stylesheet" type="text/css" href="../scripts/css/formate.css" />
</head>
<body>
<?php
// Connects to Database
mysql_connect("localhost","user","passw") or die(mysql_error());
mysql_select_db("db_name") or die(mysql_error());
?>
<table>
<tr>
<th><a href="?orderBy=ref_id">Order by Villa name |</a></th>
<th><a href="?orderBy=bedrooms">Order by no. of Beds |</a></th>
<th><a href="?orderBy=max_occupants">Order by Sleeps </a></th>
</tr>
</table>
<?php
// sort table as selected
$orderBy = array('ref_id', 'bedrooms', 'max_occupants');
$order = 'ref_id';
if (isset($_GET['orderBy']) && in_array($_GET['orderBy'], $orderBy)) {
$order = $_GET['orderBy'];
}
// Read table ---> and sort it:
// $data = mysql_query("SELECT * FROM res_properties");
$data = mysql_query("SELECT * FROM db_row ORDER BY '.$order");
Print "<table border cellpadding=3>";
Print "<br><h3>Portfolio</h3 ><p> <br>";
echo 'Listings as per: - ';
print date('r');
print "\\n";
Print "<br><p> <br>";
Print "<table border cellpadding=3 >";
Print "<tr align='center'><th width=130>Villa Name</th><th width=40>Beds</th><th width=40>Baths</th><th width=60>Sleeps</th><th width=200 >Property Website </th><th width=50 >Prop.ID</th></tr>";
while($info = mysql_fetch_array( $data ))
{
Print "<tr align='center'><font face='arial' size='2' color='000000'>";
Print "<td>".$info['ref_id'] . "</td> ";
Print "<td>".$info['bedrooms'] . " </td>";
Print "<td>".$info['bathrooms'] . " </td>";
Print "<td>".$info['max_occupants'] . " </td>";
Print "<td><a href=\"http://www.domain.com/properties/index.php/property/" . $info['slug'] . ".html\">Open website here</a></td>";
Print "<td>".$info['id'] . "</td></tr> ";
}
Print "</table>";
?>
</body>
</html>
Upvotes: 0
Views: 406
Reputation: 57312
try
$data = mysql_query("SELECT * FROM db_row ORDER BY '$order'");
or
$data = mysql_query("SELECT * FROM db_row ORDER BY " . $order."'");
NOTE 2 : Use of mysql_*
function are deprecated even it will generate E_DEPRECATED
warning in php5.5 so use PDO
or MySQLi
instead if you want to learn pdo here is good tutorial
Upvotes: 2
Reputation: 3352
Maybe you are looking for something like this?:
$data = mysql_query('SELECT * FROM db_row ORDER BY ' . $order . ' ASC');
In order to do ascending and descending sorting, you need to add another parameter to your link. Should it be asc
or desc
by default is your call, whatever makes more sense. In this case I made 0 for ascending and 1 for descending.
<a href="?orderBy=ref_id&sort=0">
The next thing you want to do is to add logic for sort handling:
$sortBy = array('asc', 'desc');
$sort = 0;
if (isset($_GET['sort']) && in_array($_GET['sort'], array_keys($sortBy))) {
$sort = $_GET['sort'];
}
And the last thing to do is the change of asc
to desc
and vice versa when you click the link second time. If you put the code I provided (logic for sort handling) and the code for the $order
handling above your navigation table (to make the variables accessible within the table), you can add a condition into the link:
<a href="?orderBy=ref_id&sort=<?php echo ($order == 'ref_id' ? !$sort : 0); ?>">
And you MySQL query will look something like this:
$data = mysql_query('SELECT * FROM db_row ORDER BY ' . $order . ' ' . $sortBy[$sort]);
Upvotes: 1
Reputation: 5513
I think its simply how your building your query.
$data = mysql_query("SELECT * FROM db_row ORDER BY '.$order");
to
$data = mysql_query("SELECT * FROM db_row ORDER BY " . $order);
If that doesn’t work add mysql_error after execution of that statement and see what the error is.
Upvotes: 3