2009/6/18 PJ <af.gourmet@xxxxxxxxxxxx>: > 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. > :-) I'd strongly recommend disabling any client-side caching your browser is doing while developing. On some browsers you can set the cache size to 0 which will do it. If you can't control it they usually bypass the cache if you hold control or shift or something else when refreshing. -Stuart -- http://stut.net/ -- PHP General Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php