За последние 24 часа нас посетили 17515 программистов и 1653 робота. Сейчас ищут 924 программиста ...

Объясните, пожалуйста, почему так???

Тема в разделе "PHP для новичков", создана пользователем xela1980, 30 июл 2009.

  1. xela1980

    xela1980 Активный пользователь

    С нами с:
    30 июл 2009
    Сообщения:
    40
    Симпатии:
    0
    Помогите понять.Есть такой код ?

    <?php

    class DataBaseInfo
    {

    public $result=0;


    function db_OpenConnection() //коннектимся к базе
    {
    $link = mysql_connect("localhost", "root")
    or die("Could not connect: " . mysql_error());
    print ("Connected successfully </br>");
    return $link;
    }

    function db_SelectDB ($link) //выбираем базу
    {
    $db = mysql_select_db("class",$link)
    or die ('Can\'t use subject : ' . mysql_error());
    print ("Database is selected successfully</br>");

    mysql_query('SET NAMES "utf8"');
    mysql_query("SET collation_connection='utf8_general_ci'");
    mysql_query("SET collation_server='utf8_general_ci'");
    mysql_query("SET character_set_client='utf8'");
    mysql_query("SET character_set_connection='utf8'");
    mysql_query("SET character_set_results='utf8'");
    mysql_query("SET character_set_server='utf8'");

    }




    function db_Query($StringQuery) // выполнение запроса
    {
    $link=self::db_OpenConnection();
    self::db_SelectDB ($link);

    $this->result= mysql_query($StringQuery)
    or die("Invalid query: " . mysql_error());
    print ("Query is successfully</br>");




    }

    function db_Show() //показ что сохранено в свойстве класса
    {

    while ($row = mysql_fetch_array($this->result, MYSQL_NUM))
    {

    print_r($row);
    echo "</br>";
    }





    }


    function db_GetAllRows() // помещение резултата в массив
    {
    $a=array();

    while ($row = mysql_fetch_array($this->result, MYSQL_NUM))
    {

    $a[]=$row;

    }

    echo "<pre>";
    print_r($a);
    echo "</pre>";


    }

    function db_Count()
    {
    $num_rows = mysql_num_rows($this->result);
    echo $num_rows;

    }



    }




    function Main ()
    {


    $l=new DataBaseInfo ();
    $StringQuery="SELECT * FROM subject";
    $l->db_Query($StringQuery);

    $l->db_GetAllRows();

    $l->db_Count();

    $l->db_GetAllRows();

    $l->db_Count();



    }


    Main ();




    ?>

    Объясните пожалуйста почему вызов метода db_GetAllRows() второй раз возвращает пустой массив. Спасибо. У меня вот такой результат

    Connected successfully
    Database is selected successfully
    Query is successfully

    Array
    (
    [0] => Array
    (
    [0] => 1
    [1] => Математика
    [2] => Погорелов
    [3] => 2009-07-27
    [4] => Офигенный учебник по математике
    )

    [1] => Array
    (
    [0] => 2
    [1] => История
    [2] => Кульчицкий
    [3] => 2009-07-08
    [4] => Фиговый учебник по истории
    )

    [2] => Array
    (
    [0] => 3
    [1] => Русский язык и литература
    [2] => Иванов
    [3] => 2006-07-04
    [4] => Хорошая книжка по русскому языку
    )

    [3] => Array
    (
    [0] => 4
    [1] => Биология
    [2] => Живчиков
    [3] => 2004-01-03
    [4] => Неплохая книжка о мухах
    )

    [4] => Array
    (
    [0] => 5
    [1] => Физика
    [2] => Ньютонов
    [3] => 2008-07-10
    [4] => Книга о последствиях падений яблок
    )

    [5] => Array
    (
    [0] => 6
    [1] => Химия
    [2] => Склодовская-Кюрьева
    [3] => 2005-11-11
    [4] => Книга о защите от радиации
    )

    )

    6
    Array ПОЧЕМУ ЗДЕСЬ ПУСТО???
    (
    )

    6
    СПАСИБО ЗА ПОМОЩЬ!
     
  2. neverlose

    neverlose Активный пользователь

    С нами с:
    27 авг 2008
    Сообщения:
    1.112
    Симпатии:
    20
    $l->db_Query($StringQuery);

    Надо второй раз тоже.
     
  3. xela1980

    xela1980 Активный пользователь

    С нами с:
    30 июл 2009
    Сообщения:
    40
    Симпатии:
    0
    neverlose, спасибо большое. Работает. Только вот все равно понять не могу, я же один раз вызвал $l->db_Query($StringQuery) и сохранил указатель на результат запроса в свойстве класса $this->result= mysql_query($StringQuery) Дальше другими методами класса я хочу просто обрабатывать возвращенный результат. Поэтому я передаю указатель на резултьтат запроса хранящийся в свойстве класса result этим методам. В методе db_GetAllRows() это выглядит так while ($row = mysql_fetch_array($this->result, MYSQL_NUM)) и тд . Затем в методе Мain я создаю экземпляр класса и вызываю метод $l->db_Query($StringQuery). Я так понимаю после этого свойство результ уже содержит указатель на даные и я могу его использовать сколько угодно передавая его в другие методы и вызывая их. Так почему я должен каждый раз выполнять db_Query($StringQuery)? Как загнать раз и навсегда указатель на возвращенные данные и обрабатывать их разными методами, не выполняя каждый раз обращение к базе? Подскажите пожалуйста. Спасибо.
     
  4. neverlose

    neverlose Активный пользователь

    С нами с:
    27 авг 2008
    Сообщения:
    1.112
    Симпатии:
    20
    Используйте (копируйте всегда) копию указателя, вместо ссылки на него
    После чтения указателя, его позиция всегда увеличивается на 1, пока не дойдёт до конца. После этого, указатель на начало не переходит.