Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Проблема с циклом действий через CURL

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: Требуется помощь с циклом определенных действий через CURL
Нирвана
Отправлено: 03 Января, 2008 - 02:53:15
Post Id



Новичок


Покинул форум
Сообщений всего: 13
Дата рег-ции: Янв. 2008  


Помог: 0 раз(а)




Доброго времени суток господа!
Возникла проблема с циклом определенных действий через CURL.

Что нужно:
делать разные запросы в цикле через CURL и обрабатывать полученную инфу с внесением в БД. Ключи для запросных полей храняться в базе данных.

Привожу пример моего нерабочего кода:
-------------------------------- ---------------------------
PHP:
скопировать код в буфер обмена
  1.   $query = "SELECT data FROM `test`";
  2.   $result = mysql_query($query, $connect) or die('Не могу подключиться базе данных');
  3.  
  4.   while ($row=mysql_fetch_assoc($result))
  5.        {
  6.  
  7.   for ($i=0; $i<count($row['data']); $i++)
  8.      {
  9.  
  10.       $data = $row['data'];
  11.       $counts=100;
  12.  
  13.   $xml='<charity.post>'
  14.       .'<id_fond>'.$data.'</id_fond>'
  15.       .'<rows>'.$counts.'</rows>'
  16.       .'<name>fullname</name>'
  17.       .'</charity.post>';
  18.  
  19.   $answer = xmlcharity("http://www.mydomain.com/change_charity.asp", $xml);
  20.  
  21.   $base = xmlmassiv($answer);
  22.  
  23.   for ($i=0;$i<$base[7]['attributes']['cnt'];$i++)
  24.      {
  25.  
  26.        $datas = $base[7]['elements'][$i]['elements'][0]['text'];
  27.        $names = $base[7]['elements'][$i]['elements'][1]['text'];
  28.  
  29.        ----- ЗДЕСЬ ЗАПИСЬ В БАЗУ ДАННЫХ MySQL (INSERT и т.д.)-----
  30.      }
  31. }
  32. }
  33.  

-------------------------------- --------------
funk.php
-------------------------------- --------------
PHP:
скопировать код в буфер обмена
  1.  
  2. function xmlcharity($address, $xml)
  3.   {
  4.         $ch = curl_init($address);
  5.         curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)");
  6.         curl_setopt($ch, CURLOPT_HEADER, 0);
  7.         curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
  8.         curl_setopt($ch, CURLOPT_POST,1);
  9.         curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
  10.         $result=curl_exec($ch);
  11.         return $result;
  12. }
  13.  
  14. function xmlmassiv ($xml)
  15.    {
  16.         $xmlary = array ();
  17.        
  18.         $ReElements = '/<(w+)s*([^/>]*)s*(?:/>|>(.*?)<(/s*1s*)>)/s';
  19.         $ReAttributes = '/(w+)=(?:"|')([^"']*)(:?"|')/';
  20.        
  21.         preg_match_all ($ReElements, $xml, $elements);
  22.         foreach($elements[1] as $ie => $xx){
  23.                 $xmlary[$ie]["name"] = $elements[1][$ie];
  24.                 if( $attributes = trim($elements[2][$ie])){
  25.                         preg_match_all ($ReAttributes, $attributes, $att);
  26.                         foreach($att[1] as $ia => $xx)
  27.                                 $xmlary[$ie]["attributes"][$att[1][$ia]] = $att[2][$ia];
  28.                 }
  29.                
  30.                 $cdend = strpos($elements[3][$ie],"<");
  31.                 if($cdend > 0){
  32.                         $xmlary[$ie]["text"] = substr($elements[3][$ie],0,$cdend -1);
  33.                 }
  34.                
  35.                 if(preg_match ($ReElements, $elements[3][$ie])){
  36.                         $xmlary[$ie]["elements"] = xmlmassiv ($elements[3][$ie]);
  37.                 }elseif(isset($elements[3][$ie])){
  38.                         $xmlary[$ie]["text"] = $elements[3][$ie];
  39.                 }
  40.         }
  41.        
  42.         return $xmlary;
  43. }


Помогите пожалуйста сделать рабочий код.
 
 Top
evgenijj
Отправлено: 03 Января, 2008 - 12:00:14
Post Id



Участник


Покинул форум
Сообщений всего: 1212
Дата рег-ции: Авг. 2006  
Откуда: Москва


Помог: 10 раз(а)




Вот это вот
PHP:
скопировать код в буфер обмена
  1.  
  2. for ($i=0; $i<count($row['data']); $i++)
  3.  

полная фигня. Потому как count($row['data']) ВСЕГДА равно 1 и цикл будет выполнен один раз. Так что смысла в нем никакого нет.

Как я понимаю, ты посылаешь запрос на удаленный сервер в формате xml. Получаешь ответ - тоже в формате xml. Из полученного ответа получаешь с помощью рег. выражений нужные данные и записываешь их в БД.

Так что конкретно не получается? Послать запрос и получить ответ? Тогда curl_errno() и curl_error() тебе в помощь
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. $result=curl_exec($ch);
  4. echo "\\n\\ncURL error number:" .curl_errno($ch);  
  5. echo "\\n\\ncURL error:" . curl_error($ch);  
  6. ?>
  7.  

Кстати, а почему ты не завершаешь сессию curl?

Если же проблема в том, что не получается извлечь нужные данные с помощью рег.выражений, то где xml, из которого нужно извлекать данные? Или ты думаешь, тут все ясновидящие и по регулярному выражению способны восстановить xml, из которого извлекаются данные?

И последнее. Извлекать данные из xml с помощью рег.выражений - не самая лучшая идея. В PHP есть много средств для работы с xml:

* расширение DOM XML для PHP4
* встроенные функции DOM XML для PHP5
* Simple XML для PHP5

Вот пример использования SimpleXML:
Обработка XML в PHP
 
 Top
Нирвана
Отправлено: 03 Января, 2008 - 15:16:16
Post Id



Новичок


Покинул форум
Сообщений всего: 13
Дата рег-ции: Янв. 2008  


Помог: 0 раз(а)




Конкретно не получается делать запросы в цикле. Тоесть не один запрос, а запросы по очереди с подстановкой ключей из базы данных. В данный момент получается только один запрос, дальше останавливается.

Цитата:
$xml='<charity.post>'
.'<id_fond>'.$data.'</id_fond>'
.'<rows>'.$counts.'</rows>'
.'<name>fullname</name>'
.'</charity.post>';


$data - берется из базы данных.
Например запрос1:

Цитата:
$xml='<charity.post>'
.'<id_fond>556789</id_fond>'
.'<rows>100</rows>'
.'<name>fullname</name>'
.'</charity.post>';



Запрос 2:

Цитата:
$xml='<charity.post>'
.'<id_fond>257890</id_fond>'
.'<rows>100</rows>'
.'<name>fullname</name>'
.'</charity.post>';


И так далее. Тоесть мне нужен цикл. Все остальное работает как часы, проблема в том, что физически получается один запрос, дальше остановка с ошибкой mysql_fetch_assoc.
Тоесть цикл запросов неработает. Предположительно нужно будет делать около 500 запросов, сейчас 50. Вот это все нужно сделать в цикле, потому что руками делать - не катит Улыбка))))

Ты правильно понял, что я получаю xml ответ. По поводу сессии,я её завершаю - здесь это пример - не весь участок кода. CURL - я дал в урезанном виде. Чтобы был понятен смысл моих действий. Вопрос заключается в цикле запросов, через CURL.

Я ЮЗАЮ php4

Цитата:
$query = "SELECT data FROM `test` WHERE data=556789";
$result = mysql_query($query, $connect) or die('Не могу подключиться базе данных');

while ($row=mysql_fetch_assoc($result))
{

$data = $row['data'];
$counts=100;

$xml='<charity.post>'
.'<id_fond>'.$data.'</id_fond>'
.'<rows>'.$counts.'</rows>'
.'<name>fullname</name>'
.'</charity.post>';

$answer = xmlcharity("http://www.mydomain.com/change_charity.asp", $xml);

$base = xmlmassiv($answer);

for ($i=0;$i<$base[7]['attributes']['cnt'];$i++)
{

$datas = $base[7]['elements'][$i]['elements'][0]['text'];
$names = $base[7]['elements'][$i]['elements'][1]['text'];

----- ЗДЕСЬ ЗАПИСЬ В БАЗУ ДАННЫХ MySQL (INSERT и т.д.)-----
}
}

$query = "SELECT data FROM `test` WHERE data=257890";
$result = mysql_query($query, $connect) or die('Не могу подключиться базе данных');

while ($row=mysql_fetch_assoc($result))
{

$data = $row['data'];
$counts=100;

$xml='<charity.post>'
.'<id_fond>'.$data.'</id_fond>'
.'<rows>'.$counts.'</rows>'
.'<name>fullname</name>'
.'</charity.post>';

$answer = xmlcharity("http://www.mydomain.com/change_charity.asp", $xml);

$base = xmlmassiv($answer);

for ($i=0;$i<$base[7]['attributes']['cnt'];$i++)
{

$datas = $base[7]['elements'][$i]['elements'][0]['text'];
$names = $base[7]['elements'][$i]['elements'][1]['text'];

----- ЗДЕСЬ ЗАПИСЬ В БАЗУ ДАННЫХ MySQL (INSERT и т.д.)-----
}
}


Такая конструкция не катит, сам представь 500 запросов Улыбка)) Я конечно маньяк, но не да такой же степени Улыбка))))) Поэтому нужен цикл запросов Улыбка))
 
 Top
evgenijj
Отправлено: 03 Января, 2008 - 15:58:41
Post Id



Участник


Покинул форум
Сообщений всего: 1212
Дата рег-ции: Авг. 2006  
Откуда: Москва


Помог: 10 раз(а)




Проверь, когда ты записываешь данные в БД, не используешь ли ты еще раз переменную $result. Я несколько раз делал такую ошибку.
PHP:
скопировать код в буфер обмена
  1.  
  2. $query = "SELECT data FROM `test`";
  3. $result = mysql_query($query, $connect) or die('Не могу подключиться базе данных');
  4.  
  5. while ($row=mysql_fetch_assoc($result))
  6. {
  7.    .....................................
  8.  
  9. }
  10.  


http://phpfaq[dot]ru/debug

Цитата:
дальше остановка с ошибкой mysql_fetch_assoc

А сам текст ошибки? Еще раз повторяю - для особо догадливых: ЗДЕСЬ ТЕЛЕПАТОВ НЕТ!
 
 Top
Нирвана
Отправлено: 03 Января, 2008 - 16:01:34
Post Id



Новичок


Покинул форум
Сообщений всего: 13
Дата рег-ции: Янв. 2008  


Помог: 0 раз(а)




[quote=evgenijj]Проверь, когда ты записываешь данные в БД, не используешь ли ты еще раз переменную $result. Я несколько раз делал такую ошибку.
PHP:
скопировать код в буфер обмена
  1.  
  2. $query = "SELECT data FROM `test`";
  3. $result = mysql_query($query, $connect) or die('Не могу подключиться базе данных');
  4.  
  5. while ($row=mysql_fetch_assoc($result))
  6. {
  7.    .....................................
  8. http://phpfaq.ru/debug[/quote]
  9.  
  10.  
  11. }
  12.  


Использую, причем два раза - для записи в базу или обновления данных. Ок - изменю на другие переменные,а с циклом что? Как правильно сделать?\n\n(Добавление)
Да там я сам напортачил, уже исправил теперь вот это выкидывает:
Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in
 
 Top
evgenijj
Отправлено: 03 Января, 2008 - 16:08:49
Post Id



Участник


Покинул форум
Сообщений всего: 1212
Дата рег-ции: Авг. 2006  
Откуда: Москва


Помог: 10 раз(а)




Нирвана пишет:
Использую, причем два раза - для записи в базу или обновления данных.


А ты парень не без юмора. Смотри, что ты делаешь:
PHP:
скопировать код в буфер обмена
  1.  
  2. $query = "SELECT data FROM mytable";
  3. $res = mysql_query( $query );
  4. while ( $row = mysql_fetch_assoc( $res ) )
  5. {
  6.   echo $row['data'].'<br/>';
  7.   $res = 'Я Вася Пупкин';
  8. }
  9.  

Функция mysql_fetch_assoc( $res ) ожидает в качестве параметра результат запроса к БД, а ты ей передаешь строку 'Я Вася Пупкин'

Добавление: а по английски это выглядит так
Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in
(переданный аргумент НЕ ЯВЛЯЕТСЯ результатом запроса к MySQL)

Цитата:
Ок - изменю на другие переменные,а с циклом что? Как правильно сделать?

Когда перестанешь использовать еще раз переменную $result внутри цикла - и ошибка сама пропадет.
 
 Top
Нирвана
Отправлено: 03 Января, 2008 - 16:19:45
Post Id



Новичок


Покинул форум
Сообщений всего: 13
Дата рег-ции: Янв. 2008  


Помог: 0 раз(а)




УФФФФФФ, Спасибо тебе большое - бадяга была в $result - изменил переменную - заработало - count я убрал. Чичас проверил - данные записались в базу, какие нужно.\n\n(Добавление)
evgenijj пишет:
Нирвана пишет:
Использую, причем два раза - для записи в базу или обновления данных.


А ты парень не без юмора. Смотри, что ты делаешь:
PHP:
скопировать код в буфер обмена
  1.  
  2. $query = "SELECT data FROM mytable";
  3. $res = mysql_query( $query );
  4. while ( $row = mysql_fetch_assoc( $res ) )
  5. {
  6.   echo $row['data'].'<br/>';
  7.   $res = 'Я Вася Пупкин';
  8. }
  9.  

Функция mysql_fetch_assoc( $res ) ожидает в качестве параметра результат запроса к БД, а ты ей передаешь строку 'Я Вася Пупкин'

Добавление: а по английски это выглядит так
Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in
(переданный аргумент НЕ ЯВЛЯЕТСЯ результатом запроса к MySQL)

Цитата:
Ок - изменю на другие переменные,а с циклом что? Как правильно сделать?

Когда перестанешь использовать еще раз переменную $result внутри цикла - и ошибка сама пропадет.

Понял. Спасибо за помощь и понятный ответ.Улыбка))) Теперь работает Улыбка)))
 
 Top
Dastar
Отправлено: 03 Января, 2008 - 17:35:56
Post Id



Частый гость


Покинул форум
Сообщений всего: 199
Дата рег-ции: Янв. 2008  
Откуда: Израиль


Помог: -6 раз(а)




Такой вопрос, а если $data['name'] является массивом, то count() все равно будет равен одному?


-----
Не знаешь - молчи.
 
 Top
evgenijj
Отправлено: 03 Января, 2008 - 17:50:31
Post Id



Участник


Покинул форум
Сообщений всего: 1212
Дата рег-ции: Авг. 2006  
Откуда: Москва


Помог: 10 раз(а)




Dastar пишет:
Такой вопрос, а если $data['name'] является массивом, то count() все равно будет равен одному?

Странный какой-то ворос. $row - массив. $row['data'] - значение одного из элементов массива. Т.е. скаляр - строка, число и т.п. Применение к ней функции count вообще некорректно. Что-то вроде "Взвесьте мне 5 километров апельсинов"

В общем случае любой из элементов массива тоже может быть массивом
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. $arr = array( 'first' => array( 'first-first', 'first-second', 'first-third' ),
  4.               'second' => 'second',
  5.                'third' => array( 'third-first', 'third-second' )
  6.                          );
  7. foreach ($arr as $key => $value) {
  8.   echo 'key='.$key.'<br/>';
  9.   if ( is_array( $value ) ) {
  10.     echo 'array, '.'count='.count( $value ).'<br/>';
  11.         foreach( $value as $k => $v ) echo 'key='.$k.', value='.$v.'<br/>';
  12.   } else {
  13.     echo $value;
  14.   }
  15.   echo '<hr>';
  16. }
  17. ?>
  18.  

Результат
PHP:
скопировать код в буфер обмена
  1.  
  2. key=first
  3. key=0, value=first-first
  4. key=1, value=first-second
  5. key=2, value=first-third
  6. -------------------------------
  7. key=second
  8. second
  9. -------------------------------
  10. key=third
  11. key=0, value=third-first
  12. key=1, value=third-second
  13.  
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Программирование на PHP »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB