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

Reply via email to