• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

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

  • Автор темы buxar
  • Дата начала
B

buxar

Нуждаюсь в помощи
Нужно перевести функцию с запросами в MySQL, на запросы через ADODB

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

Код:
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>'; 

} 

}

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

Код:
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>'; 
} 
}

При запуске выдает:

Код:
Fatal error: Maximum execution time of 30 seconds exceeded in z:homebuxarnet.coscriptincludesfunctions.php on line 237

Это строка
Код:
$post[] = $data[0];

Что делать?
 
M

MajestiC

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

MajestiC

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

buxar

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

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

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

buxar

С этим разобрался


Теперь мой код такого вида:
Код:
$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:
Код:
array(4) { [0]=> string(475) "Текст." [1]=> string(3) "420" [2]=> string(10) "1159515287" [3]=> string(4) "2764" }
А показывает:
Код:
array(4) { ["post"]=> string(475) "Текст." ["topic_id"]=> string(3) "420" ["post_date"]=> string(10) "1159515287" ["pid"]=> string(4) "2764" }
Кто подскажет в чем может быть причина?

4. Вот так скорее всего вам придется обращаться к полям записи: $result->fields[$i], где $i - номер поля в записи.
Может это и нужно, но как сделать?
 
M

MajestiC

Возникла другая проблема, почемуто в $data не совсем то, что нужно
Должно быть (при просмотре var_dump($data):D:
Код:
array(4) { [0]=> string(475) "Текст." [1]=> string(3) "420" [2]=> string(10) "1159515287" [3]=> string(4) "2764" }
А показывает:
Код:
array(4) { ["post"]=> string(475) "Текст." ["topic_id"]=> string(3) "420" ["post_date"]=> string(10) "1159515287" ["pid"]=> string(4) "2764" }
Кто подскажет в чем может быть причина?

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

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

Обучение наступательной кибербезопасности в игровой форме. Начать игру!