Переход с Mysql на Adodb

Тема в разделе "PHP программирование", создана пользователем buxar, 21 июл 2007.

  1. buxar

    buxar Active Member

    Регистрация:
    15 мар 2007
    Сообщения:
    30
    Симпатии:
    0
    Нуждаюсь в помощи
    Нужно перевести функцию с запросами в MySQL, на запросы через ADODB

    Сама функция:

    Код (Text):
    function lastMes(){
    global $dbhost, $dblogin, $dbpassword, $dbname, $newsid, $fPrefics, $fURL, $lang, $newsL;
    mysql_connect($dbhost, $dblogin, $dbpassword);
    mysql_select_db($dbname);
    mysql_query("set character set cp1251");

    $query_id=mysql_query('SELECT post, topic_id, post_date, pid FROM '.$fPrefics.'posts ORDER BY `post_date` DESC LIMIT 0 , 3');
    while($data=mysql_fetch_row($query_id)) {
    $cN = strlen($data[0]);
    if ($cN>$newsL){
    $data[0] = substr($data[0],0, $newsL);
    $p = explode(' ', $data[0]);
    $cN = count($p);
    $p[$cN-1] = '...';
    $post[] = implode(' ', $p);
    }else{
    $post[] = $data[0];
    }
    $tid[]  = $data[1];
    $pDate[]= $data[2];
    $pid[]  = $data[3];
    }

    $iMax = count($tid);
    for($i=0; $i<$iMax; $i++){
    $query_id = mysql_query('SELECT forum_id, title, last_poster_name, last_poster_id FROM '.$fPrefics.'topics WHERE tid='.$tid[$i]);
    $data=mysql_fetch_row($query_id);

    echo '<b><a href="'.$fURL.'index.php?showtopic='.$tid[$i].'&view=findpost&p='.$pid[$i].'">'.$data[1].'</a></b><br>';
    echo $post[$i].'<br><br>';

    }

    }
    Пытакля сам наковырять и вот что вышло:

    Код (Text):
    function lastMes(){
    global $db, $newsid, $fPrefics, $fURL, $lang, $newsL;
    $db->execute("SET character SET cp1251");
    $result = $db->execute('SELECT post, topic_id, post_date, pid FROM '.$fPrefics.'posts ORDER BY `post_date` DESC LIMIT 0 , 3');
    if ($result === false) die("failed");  
    while (!$result->EOF) {
    $data = $result->FieldCount();
    $cN = strlen($data[0]);

    if ($cN>$newsL){
    $data[0] = substr($data[0],0, $newsL);
    $p = explode(' ', $data[0]);
    $cN = count($p);
    $p[$cN-1] = '...';
    $post[] = implode(' ', $p);
    }else{
    $post[] = $data[0];
    }
    $tid[]  = $data[1];
    $pDate[]= $data[2];
    $pid[]  = $data[3];
    }
    for ($i=0, $max= count($tid); $i < $max; $i++){
    $result = $db->execute('SELECT forum_id, title, last_poster_name, last_poster_id FROM '.$fPrefics.'topics WHERE tid='.$tid[$i]);
    if ($result === false) die("failed");
    $data= !$result->EOF;
    echo '<b><a href="'.$fURL.'index.php?showtopic='.$tid[$i].'&view=findpost&p='.$pid[$i].'">'.$data[1].'</a></b><br>';
    $result->MoveNext();
    echo $post[$i].'<br><br>';
    }
    }
    При запуске выдает:

    Код (Text):
    Fatal error: Maximum execution time of 30 seconds exceeded in z:homebuxarnet.coscriptincludesfunctions.php on line 237
    Это строка
    Код (Text):
    $post[] = $data[0];
    Что делать?
     
  2. MajestiC

    MajestiC Гость

    Есть предположение что вы забыли $result->MoveNext(); в цикле while.
     
  3. buxar

    buxar Active Member

    Регистрация:
    15 мар 2007
    Сообщения:
    30
    Симпатии:
    0
    Вставил после:
    Код (Text):
    $pid[]= $data[3];
    Вроди сработало, но почему-то второй запрос к базе выдает false
     
  4. MajestiC

    MajestiC Гость

    Есть еще 4 предположения по коду (с ADODB последний раз просто 2 года назад работал, и то на другом языке):
    1. Возможно в вашей выборке выбирается всего 1 запись, из-за этого и false.
    2. Очень странно выглядит конструкция $data = $result->FieldCount(), она по идее не должна выдавать вам данные, и, как я думаю совсем их не выдает, а выдает кол-во полей в row-е, то есть не массив, а простое число.
    3. А уж тем более странно выглядит конструкция $data= !$result->EOF;
    4. Вот так скорее всего вам придется обращаться к полям записи: $result->fields[$i], где $i - номер поля в записи.
     
  5. buxar

    buxar Active Member

    Регистрация:
    15 мар 2007
    Сообщения:
    30
    Симпатии:
    0
    Спасибо, что-то я ступил
    Думал переход на ADODB - это просто замена обного запроса, а тут получается всю функцию переписывать нужно.
    Пошло $data = $result->fields; вместо $data = $result->FieldCount(), , но опять стал дальше на $cN = strlen($data[0]);

    В общем буду с нуля сам все разгребать, если что не выйдет, надеюсь на помощь.

    Спасибо (тему пока не прикрывайте)
     
  6. buxar

    buxar Active Member

    Регистрация:
    15 мар 2007
    Сообщения:
    30
    Симпатии:
    0
    С этим разобрался


    Теперь мой код такого вида:
    Код (Text):
    $result = $db->SelectLimit('SELECT post, topic_id, post_date, pid FROM '.$fPrefics.'posts ORDER BY `post_date` DESC ',10);
    if ($result === false) die("failed");
    while (!$result->EOF) {
    $data = $result->fields;
    Возникла другая проблема, почемуто в $data не совсем то, что нужно
    Должно быть (при просмотре var_dump($data):D:
    Код (Text):
    array(4) { [0]=> string(475) "Текст." [1]=> string(3) "420" [2]=> string(10) "1159515287" [3]=> string(4) "2764" }
    А показывает:
    Код (Text):
    array(4) { ["post"]=> string(475) "Текст." ["topic_id"]=> string(3) "420" ["post_date"]=> string(10) "1159515287" ["pid"]=> string(4) "2764" }
    Кто подскажет в чем может быть причина?

    Может это и нужно, но как сделать?
     
  7. MajestiC

    MajestiC Гость

    Дело все в настройке вашей ADODB библиотеки. У вас возвращается ассоциативный массив вместо обычного. Я не знаю какую вы конкретно используете, но в ней явно должна быть настройка (или функция) которая возвращает обычный массив.

    С другой стороны, зачем обращатся к данным через $data[0], $data[1] и т.д, когда намного удобней $data['post'], $data['topic_id'], $data['post_date']
    Ведь это намного понятней, и в коде не будет возникать путаницы с индексами массива.
     
Загрузка...

Поделиться этой страницей