<?php
$q=$_GET["q"];$con = mysql_connect('localhost', 'peter', 'abc123');
if (!$con)
 {
 die('Could not connect: ' . mysql_error());
 }
mysql_select_db("my_db", $con); 
$sql="SELECT * FROM person WHERE id = '".$q."'";
$result = mysql_query($sql);  echo "<table border='1'>
<tr>
<th>Firstname</th>
<th>Lastname</th>
<th>Age</th>
<th>Hometown</th>
<th>Job</th>
</tr>";while($row = mysql_fetch_array($result))   //这句是个什么意思哦??执行原理是什么??要求详细点;
 {
 echo "<tr>";
 echo "<td>" . $row['FirstName'] . "</td>";
 echo "<td>" . $row['LastName'] . "</td>";
 echo "<td>" . $row['Age'] . "</td>";
 echo "<td>" . $row['Hometown'] . "</td>";
 echo "<td>" . $row['Job'] . "</td>";
 echo "</tr>";
 }
echo "</table>";mysql_close($con);
?>数据库
id    FirstName     LastName Age      Hometown Job 
1     Peter         Griffin   41      Quahog Brewery 
2     Lois          Griffin   40      Newport Piano Teacher 
3     Joseph        Swanson   39       Quahog Police Officer 
4     Glenn         Quagmire  41      Quahog Pilot 

解决方案 »

  1.   

    本帖最后由 xuzuning 于 2011-06-11 19:38:21 编辑
      

  2.   

    下面是mysql扩展mysql_fetch_array的关键源码, 根据不同的mysql驱动使用不同的方法, 目前php中可用的myslq驱动有libmysql, libmysql是mysql提供给c语言的库, 后来, php为了引进mysql新的特性, 改进底层驱动, 所以实现了mysqlnd..
    至于具体的网络连接怎么来实现, 需要看libmysql的源码..
    大致的过程是:
    php调用mysql_query实际调用libmysql的mysql_real_query发送查询语句给服务端, 产生一个struct MYSQL_RES(libmysql中定义).
    php中调用mysql_fetch_array最终调用libmysql的mysql_fetch_row抓取服务端数据.
    然后由PHP的mysql扩展将返回数据组织到结果数组中返回.//使用libmysql
    #ifndef MYSQL_USE_MYSQLND
        //抓取结果集
        if ((mysql_row = mysql_fetch_row(mysql_result)) == NULL  ||
            (mysql_row_lengths = mysql_fetch_lengths(mysql_result)) == NULL) {
            RETURN_FALSE;
        }    
        //初始化结果数组
        array_init(return_value);    mysql_field_seek(mysql_result, 0);
        for (mysql_field = mysql_fetch_field(mysql_result), i = 0; 
             mysql_field;
             mysql_field = mysql_fetch_field(mysql_result), i++) 
        {    
            //这里处理将结果放入结果数组
        }
    //使用mysqlnd    
    #else
        mysqlnd_fetch_into(mysql_result, ((result_type & MYSQL_NUM)? MYSQLND_FETCH_NUM:0) | ((result_type & MYSQL_ASSOC)? MYSQLND_FETCH_ASSOC:0), return_value, MYSQLND_MYSQL);
    #endif
    有不对的地方, 请各位大侠拍砖
      

  3.   

    mysql_query($sql)是执行查询并获取返回结果保存在内存中。
    mysql_fetch_array()就是用游标,每次读出一行数据并放在array里,那个$row就是一行记录,datatype是array,而array是一个hashmap,对应这一条记录。
    然后while主体里面,是取出这条记录里对应filedname的具体值。
      

  4.   

    我想知道的是while里的语句是这么执行的。
    也就是这句$row = mysql_fetch_array($result)
    $row是空的?然后后面的语句找不到内容返回空就成立?
      

  5.   

    mysql_fetch_array从结果集中取得一行作为关联数组,或数字数组,或二者兼有,然后将这个结果赋给$row变量,如果没有更多行则返回False。显然,如果结果集中有记录,那么$row肯定不为空,则会执行while循环体中的代码,并将当前"游标"指向下一行记录继续判断,直至没有更多行返回False,循环结束
      

  6.   

    $row 变量没有在前面定义呀,$row 在while循环里也能声明的吗?
      

  7.   

    PHP中的变量不用提前声明while($row = mysql_fetch_array($conn))中, while需要的是一个表达式, $row=mysql_fetch_array($conn)是一个赋值表达式, 赋值表达式的返回值是赋值之后表达式的左值的值.所以, 这种写法同时实现两个操作:
    1. 条件检测
    2. 变量赋值.
      

  8.   

    能举例跟我说下$row赋值过程和怎么进行条件检测的不?
    上面有数据库的文件
      

  9.   


    这个你最好去把表达式和控制语句搞清楚..
    简单说一下:
    while的控制结构定义:
    while( condition ) {
        statements;
    }
    condition是一个表达式.
    while要判断condition是真或假, 就要对这个表达式求值.
    你的代码中, condition是$row=mysql_fetch_array($result)
    那么, 程序就执行这一句进行求值.
    $row=mysql_fetch_array($result)是一个赋值表达式
    赋值表达式定义为:
    左值 赋值操作赋 右值
    左值是变量$row
    赋值操作赋是=
    右值是mysql_fetch_array($result), 右值的值就是mysql_fetch_array($result)的返回值.
    因此, 在求condition的值时就将mysql_fetch_array($result)的返回值赋给了变量$row
    而$row=mysql_fetch_array($result)整个这个表达式的值为赋值后左值的值, 即变量$row的新值.
    while需要进行的是条件检测, 因此, 对$row进行隐式类型转换, 转换为bool型.好了, 现在条件检测和赋值目的都达到了..
      

  10.   

    估计我要看到实际流程才能理解了(也就是这段代码运行的全部过程。。我只有一点点javascript基础,6天时间把w3school全部看完消化掉了就是这个while 
    我还是一头舞水)
    $conn得到什么值然后开始和$row匹配,然后在什么情况下开始循环?循环终止的条件又是哪里决定的,由什么来决定的?
    $conn初始值是不是空值? 还是应该把他当成循环体外的变量同等看待?$row['FirstName']里的作用是什么,是决定终止循环的条件之一吗?(能帮我写下程序运行后,各值的变化吗?也就是虚拟程序运行的全过程,先行谢过了,javascript和php里的while那里的说明都反复看了,感觉还是不能理解,因为那里定义的2个$i var i 都在循环外设定了初始值,而这里却没有)while 
    只要指定的条件成立,则循环执行代码块

    此时的$row到底是个什么概念
      

  11.   

    <?php
    $q=$_GET["q"];
    #获取数据库连接, 赋值给变量$con
    $con = mysql_connect('localhost', 'peter', 'abc123');
    if (!$con){
     die('Could not connect: ' . mysql_error());
    }
    #切换数据库连接的当前数据库.
    mysql_select_db("my_db", $con); 
    $sql="SELECT * FROM person WHERE id = '".$q."'";
    #发送一条$sql, 返回一个结果集对象, 赋值给$result
    $result = mysql_query($sql, $con); //这里楼主代码少个$con
    #循环从结果集中每次抓取一行记录, 每次循环将抓取到的结果赋值给$row, 并进行条件检测, 当结果集中没有记录时, mysql_fetch_array($result)返回FALSE
    while($row = mysql_fetch_array($result)){
    }
    mysql_close($con);
    ?>这个问题就这样了, 如果你还不能理解, 就回去找一本程序设计相关的书, 好好从基础学起吧...
    6天把xxxx学会只会害了你, 就像吃不熟的东西一样 算不得什么好事...