PJ wrote:
> I'm including the relevant code:
>
> // select categories for book to be updated
> $sql = "SELECT id, category FROM categories, book_categories
> WHERE book_categories.bookID = '$bid' &&
> book_categories.categories_id = categories.id";
> if ( ( $results = mysql_query($sql, $db) ) ) {
> while ( $row = mysql_fetch_assoc($results) ) {
> $selected[] = $row['id'];
> }
> }
> else $selected = Array( 0 => '0');
> echo $selected;
> print_r($selected);
>
> $sql = "SELECT * FROM categories";
> echo "<select name='categoriesIN[]' multiple size='8'>";
> if ( ( $results = mysql_query($sql, $db) ) !== false ) {
> while ( $row = mysql_fetch_assoc($results) ) {
> if (in_array($row['id'], $selected)) {
> echo "<option value=", $row['id'], " selected='selected'
>> ", $row['category'], "</option><br />";
> }
> else echo "<option value=", $row['id'], ">",
> $row['category'], "</option><br />";
> }
> }
>
> Problem #1) in the first query result. I can't figure out how to deal
> with it. The code works fine if there are categories assigned to the
> book. If not, an undefined variable error is spewed out for selected.
>
That's because the test you use for the success of the query:
( ( $results = mysql_query($sql, $db) ) !== false )
is true if and only if the query succeeds, whether or not you get any rows
returned.
You then start looping over the fetched rows, and if there are none $selected
never gets anything assigned to it, and so never gets defined.
Since you don't rely on $selected being actually populated (in_array works fine
on an empty array...), you might be better off pre-setting $selected before you
start the first query:
$selected = Array();
$sql = "SELECT id, category FROM categories, book_categories
WHERE book_categories.bookID = '$bid' &&
book_categories.categories_id = categories.id";
if ( ( $results = mysql_query($sql, $db) ) )
{
while ( $row = mysql_fetch_assoc($results) )
{
$selected[] = $row['id'];
}
}
> Problem #2) in the second query, the selected is in the source code but
> it is not highlited. Several times I did get the categories highlighted,
> but I could never catch what it was that made it work. When I had the
> $id problem, i was trying this code from Yuri (but I don't understand
> where he got the $id from ) :
>
The HTML you generate in the selected case is not quite right - you should have
quotes around the "value" attribute's value, and you missed a closing '>' off
the option tag...
while ( $row = mysql_fetch_assoc($results) )
{
if (in_array($row['id'], $selected))
{
echo "<option value='", $row['id'], "' selected='selected' >",
$row['category'], "</option><br />";
}
else
{
echo "<option value=", $row['id'], ">", $row['category'], "</option><br
/>";
}
}
More succinctly:
while ( $row = mysql_fetch_assoc($results) )
{
$sel = in_array($row['id'], $selected) ? "selected='selected'":"";
echo "<option value='{$row['id']}' $sel>{$row['category']}</option><br />";
}
Unless the code is seriously performance critical, I still think variable
interpolation is nicer to read than all those quotes and commas, and it keeps
the HTML structure together better...
Good luck
--
Peter Ford phone: 01580 893333
Developer fax: 01580 893399
Justcroft International Ltd., Staplehurst, Kent
--
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php