Stuart wrote: > 2009/6/18 PJ <af.gourmet@xxxxxxxxxxxx>: > >> I snipped to make it short... continue at bottom... >> >>> Step back from the code and consider the steps you need to perform... >>> >>> 1) Get an array of the categories, ideally in the form $cats[<catid>] >>> = categoryname. >>> >>> 2) Get an array of the category IDs that should be selected, i.e. >>> $selectedcats = array(3, 5, 7, 9). >>> >>> 3) Start the HTML select element >>> >>> 4) foreach ($cats as $id => $catname) >>> >>> 5) Determine whether it should be selected. e.g. $selected = >>> (in_array($id, $selectedcats) ? 'selected="selected"' : ''. >>> >>> 6) Output the HTML option element, like <option value="$id" >>> $selected>$catname</option>, escaping where appropriate. >>> >>> 7) End of loop, job done. >>> >>> If your code doesn't have that structure then you may want to consider >>> starting again. >>> >>> >> I'm quite sure the structure is correct. >> >>> Secondly, check that you're not using the same variable name twice. >>> >> I did find that in an instance of $id being repeated so I changed it to >> $bid. >> >>> In >>> one of your previous emails you used $selected to hold the array of >>> selected categories, and in another you used it for the text to be >>> inserted into the option element. The latter will blat over the former >>> leading to no more than 1 option selected, and even then only if it's >>> the first option displayed. >>> >>> >> The $selected were not mine... as I was using $ccc ; only started using >> $selected a couple of hours ago. >> >>> If you're still stuck please post more of your code in a single chunk >>> including all the elements in my step-by-step above. The snippets >>> you're currently posting are not giving us enough context to spot even >>> the most common mistakes. >>> >> 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. >> > > It's best practice to initialise all variables before using them. The > code you have will not create the $selected variable if there are no > results... > > (code repeated for clarity) > >> if ( ( $results = mysql_query($sql, $db) ) ) { >> > > If there are no results this will still "work" so will drop through to... > > >> while ( $row = mysql_fetch_assoc($results) ) { >> $selected[] = $row['id']; >> } >> > > But since there are no results the first call to mysql_fetch_assoc > will return false so the line in the middle will never get executed. > > >> } >> else $selected = Array( 0 => '0'); >> > > Drop this else line and instead put $selected = array(); before the > mysql_query line. Not sure why you want an element 0 => '0' in there, > I'm guessing it's one of your attempts to get rid of the notice. > > >> 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. >> > > Can you post the HTML you're getting for this select using the above > code. If the selected attributes are in the code correctly then there > must be a syntax error in there somewhere and the easiest way to find > it will be by looking at the HTML. > > Stuart, you are one clear-headed dude. This is such a nice and clear explanation - it's what we need for dummies llike me. I had tried to declcare the variable, but didn't understand that it needed to be declared as an array; I had put $selected = ""; and obviously it din't work. As for the seconf problem, today it works. without any changes. I think the Quirk Daemon struck my browser. Actuall, I have been sabotaged by the cache when, in not thinking and not taking my ridalin, I would confuse refresh with go to previous page. I guess I can get some sleep now. THANKS TO ALL in clearing my brain toward the path of PHP enlightenment. :-) -- Hervé Kempf: "Pour sauver la planète, sortez du capitalisme." ------------------------------------------------------------- Phil Jourdan --- pj@xxxxxxxxxxxxx http://www.ptahhotep.com http://www.chiccantine.com/andypantry.php -- PHP General Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php