At 7:35 PM -0700 6/29/02, Brad Melendy wrote: >Steve, >Thanks very much.
You're welcome! >This make total sense to me. Now, I was pretty sure that >I was getting an array back from mysql_fetch_array because when I do a >'print $myCourses' without specifying any value, I just get 'array' which I >believe I am supposed to, IF it is truly an array. Anyway, I'm going to >revisit the mysql_fetch_array function right now. Thanks for your help, it >is greatly appreciated. > >...Brad Just to clarify a bit - mysql_fetch_array() DOES return an array - thus the name - but it is an array containing one record from the result set. For instance, if the result of the statement SELECT C.CourseName FROM tblcourses C, tblusers U, tblEnrollment E WHERE C.ID = E.CourseID AND E.UserID = U.ID AND U.ID = 1 through the MySQL commandline was +-----------------+ | C.CourseName | +-----------------+ | Basketweaving | | Noodle twirling | | Poodle furling | | Puddle curling | +-----------------+ then the first use of mysql_fetch_array($result) through PHP would retrieve the array 'C.CourseName' => 'Basketweaving', 0 => 'Basketweaving' the second call would retrieve 'C.CourseName' => ' Noodle twirling', 0 => ' Noodle twirling' and so on. If you had two columns in the result set: +-----------------+------------+ | C.CourseName | C.CourseNo | +-----------------+------------+ | Basketweaving | 12 | | Noodle twirling | 23 | | Poodle furling | 24 | | Puddle curling | 25 | +-----------------+------------+ you would get results like 'C.CourseName' => 'Basketweaving', 0 => 'Basketweaving', 'C.CourseNo' => 12, 1 => 12 and so on. The reason you get the doubled keys (associative & numeric) is for historical compatibility; to turn off the feature, and retrieve only the associated indexes (the behavior you normally want), you can use mysql_fetch_array($result, MYSQL_ASSOC); Incidentally, I just learned something here myself; there's a relatively new (>= version 4.0.3) function mysql_fetch_assoc() which does what you want...return ONLY the associated indexes. See: http://www.php.net/manual/en/function.mysql-fetch-assoc.php -steve >"Steve Edberg" <[EMAIL PROTECTED]> wrote in message >news:p05100300b943f2a7feef@[168.150.239.37]... >> At 3:27 PM -0700 6/29/02, Brad Melendy wrote: >> >Hi All, >> >I've stumped myself here. In a nutshell, I have a function that returns >my >> >array based on a SQL query and here's the code: >> > >> >-------------begin code------------------- >> >function getCourses($UID) >> > { >> > global $link; > > > $result = mysql_query( "SELECT C.CourseName FROM tblcourses C, tblusers >U, >> >tblEnrollment E WHERE C.ID = E.CourseID AND E.UserID = U.ID AND U.ID = > > >$UID", $link ); >> > if ( ! $result ) >> > die ( "getRow fatal error: ".mysql_error() ); >> > return mysql_fetch_array( $result ); >> > } >> >------------end code ---------------- >> > >> >I call this from a PHP page with the following code: >> > >> >------------begin code-------------- >> >$myCourses = getCourses($session[id]); >> >foreach ($myCourses as $value) >> > { >> > print "<br>$value"; >> > } >> >------------end code--------------- >> > >> >Now, when I test the SQL from my function directly on the database, it >> >returns just want I want it to return but it isn't working that way on my >> >PHP page. For results where there is a single entry, I am getting the >same >> >entry TWICE and for records with more than a single entry I am getting >ONLY >> >the FIRST entry TWICE. >> > >> >Now I know my SQL code is correct (I am testing it against a MySQL >database >> >using MySQL-Front) so I suspect I'm doing something stupid in my foreach >> >loop. >> >> >> I think your problem lies in a misunderstanding of the >> mysql_fetch_array() function. It doesn't return the entire result set > > in an array - just one record at a time. You can fix this in one of >> two ways: >> >> (1) Loop though the entire result set in your function: >> >> function getCourses($UID) >> { >> global $link; >> >> $ResultSet = array(); >> >> $result = mysql_query( "SELECT C.CourseName FROM tblcourses C, >tblusers U, >> tblEnrollment E WHERE C.ID = E.CourseID AND E.UserID = U.ID AND >U.ID = >> $UID", $link ); >> >> if ( ! $result ) >> die ( "getRow fatal error: ".mysql_error() ); >> >> while ($Row = mysql_fetch_array( $result )) >> { >> $ResultSet[] = $Row['C.CourseName']; >> } >> >> return $ResultSet; >> } >> >> ... >> >> $myCourses = getCourses($session[id]); >> foreach ($myCourses as $value) >> { >> print "<br>$value"; >> } >> >> or (2) set a flag in getCourses() so that the query is only executed >> once, otherwise returning a result line - something like: >> >> function getCourses($UID) >> global $link; >> static $result = false; >> >> if (!$result) >> { >> $result = mysql_query( "SELECT C.CourseName FROM tblcourses C, >> tblusers U, >> tblEnrollment E WHERE C.ID = E.CourseID AND E.UserID = U.ID AND >U.ID = >> $UID", $link ); >> if ( ! $result ) >> die ( "getRow fatal error: ".mysql_error() ); >> } >> { >> return mysql_fetch_array( $result ); >> } >> >> ... >> >> while ($Row = getCourses($session[id]) as $value) >> { >> print "<br>", $Row['C.CourseName']; >> } >> >> (standard caveats about off-top-of-head, untested code apply) >> >> The reason you are getting the first record TWICE is becaouse of the >> default behaviour of the mysql_fetch_array() function. It returns >> both an associative array - ie, elements of the form <field-name> => >> <value> - and a numerically indexed array (0, 1, 2, etc.). You can >> alter this behaviour by the second parameter of the function: see >> >> http://www.php.net/manual/en/function.mysql-fetch-array.php >> > > -steve -- +------------------------------------------------------------------------+ | Steve Edberg [EMAIL PROTECTED] | | University of California, Davis (530)754-9127 | | Programming/Database/SysAdmin http://pgfsun.ucdavis.edu/ | +------------------------------------------------------------------------+ | The end to politics as usual: | | The Monster Raving Loony Party (http://www.omrlp.com/) | +------------------------------------------------------------------------+ -- PHP General Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php