2013-03-28 4 views
3

Я пытаюсь выполнить завиток, используя следующий код.CURL не работает при использовании внутри функции

mainFunction{ 
    . 
    . 
    $url = strtolower($request->get('url', NULL)); 
    $html_output= $this->startURLCheck($url); 
    . 
    . 
} 

function startURLCheck($url) 
{ 
$ch = curl_init(); 
curl_setopt($ch,CURLOPT_URL,$url); 
curl_setopt($ch, CURLOPT_HEADER, false); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true); 
curl_setopt($ch, CURLOPT_TIMEOUT, 30); 
$html_output = curl_exec($ch); 
} 

Когда я даю строку URL прямо, это работает нормально. Но затем я передаю строковые данные через функцию curl, которая не выполняется. curl_error дает также отсутствие ошибок. Я пробовал много методов кодирования и декодирования для строки с тем же результатом. Я делаю что-то неправильно? Я работаю с сервером XAMPP на окнах.

Я передаю URL-адрес этой функции после получения URL-адреса из запроса на отправку HTML в другой функции.

+0

$ url находится за пределами вашего scope: http://php.net/manual/en/language.variables.scope.php al поэтому 'curl_error()' даст более информативную информацию о том, что пойдет не так в curl call –

+0

, можете ли вы добавить синтаксис, используемый для определения функции? – Stu

+0

убедитесь, что ваша функция si похожа на runCurl ($ url) {...}, а затем в вашем коде вы можете выполнить runCurl ('http: // foo/bar'); – chrislondon

ответ

1

Эй, ребята, я нашел problem..Finally ..

Когда я установил CURLOPT_FOLLOWLOCATION для завитка это работает отлично ...

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); 

Но зачёте не ясно, почему это работает когда я жестко закодировал URL-адрес внутри функции и не работал, когда передал URL-адрес в качестве переменной в функцию, не задав CURLOPT_FOLLOWLOCATION ... Когда я установил этот параметр, он работает в обоих направлениях.

+1

Рад, что вы его нашли. Я думаю, вам, возможно, потребуется включить больше задействованного кода, если вам нужна помощь в отношении жестко закодированного URL-адреса внутри функции vs pass-in-as-argument. Лучше всего написать автономный тестовый пример, который другие в stackoverflow могут запускать себя и тестировать. Это не обязательно точный код, с которым вы имеете дело, просто пример, который воспроизводит ошибку. – David

+0

это не работает для меня –

1

Это работает хорошо.

<?php 
function excURL() 
{ 
$ch = curl_init(); 
$url = "http://www.google.com"; 
curl_setopt($ch,CURLOPT_URL,$url); 
curl_setopt($ch, CURLOPT_HEADER, false); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true); 
curl_setopt($ch, CURLOPT_TIMEOUT, 30); 
$html_output = curl_exec($ch); 
echo $html_output; 
} 

excURL(); 

?> 
+0

Да, это тоже работает для меня. Но затем я передаю URL-адрес через переменную в функцию, которая не работает. –

2

Проблема в том, что ваша функция startURLCheck фактически не возвращает значение для основной программы. Измените последнюю строку:

function startURLCheck($url) 
{ 
    $ch = curl_init(); 
    curl_setopt($ch,CURLOPT_URL,$url); 
    curl_setopt($ch, CURLOPT_HEADER, false); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true); 
    curl_setopt($ch, CURLOPT_TIMEOUT, 30); 
    return curl_exec($ch); 
} 

В коде вызова, вывезти "$ this->"

$html_output = startURLCheck($url); 

$ html_output теперь содержит результаты завитка вызова.

Я предположил, что вы скопировали и вставляли этот код откуда-то, так как ваше объявление «mainFunction» синтаксически неверно, и вы использовали «$ this->», не указав, что startURLCheck был методом объекта.

Если на самом деле вы собираетесь startURLCheck быть метод объекта, и вы хотите, чтобы установить $ html_output на объект, сделать это:

<?php 

class Example { 
    private $html_output; 

    function mainFunction() 
    { 
     $url='http://www.ebay.com/itm/Apple-iPhone-5-16GB-Black-Slate-Cricket-intl-UNLOCKED-pleeze-read-ad-/251252227033'; 
     $this->startURLCheck($url); 
     echo "HTML output: " . $this->html_output; 
    } 

    function startURLCheck($url) 
    { 
     $ch = curl_init(); 
     curl_setopt($ch,CURLOPT_URL,$url); 
     curl_setopt($ch, CURLOPT_HEADER, false); 
     curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
     curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true); 
     curl_setopt($ch, CURLOPT_TIMEOUT, 30); 
     $this->html_output = curl_exec($ch); 
    } 
} 

$example = new Example(); 
$example->mainFunction(); 

Я тестировал этот код в командной строке (не в веб-страница). Если вы скопируете и вставьте это в файл и запустите его, используя php -r, вы увидите результаты. (И обратите внимание, что я не включил закрывающий тег>. Закрывающий тег является необязательным, если файл содержит только код PHP и HTML. На самом деле рекомендуется оставлять закрывающий тег в таких случаях. См. http://php.net/manual/en/language.basic-syntax.instruction-separation.php)

Также обратите внимание, что в вашем вопросительном коде для mainFunction у вас есть незаконные пробелы перед «pleeze» в вашем URL-адресе, и вам не хватает точки с запятой в конце задания $ url.

Надеюсь, это поможет. Удачи.

+0

Что я делаю теперь заметили, что когда я печатаю $ html_output, используя print_r, он печатает «Пожалуйста, подождите ... Перенаправление на» и url..but, когда я жестко задаю URL-адрес внутри функции, он печатает содержимое страницы html ... Извините о неполном коде .. то, что я дал, является частью моей функции тоже. Я анализирую html_output, используя регулярное выражение и возвращаю другой вывод. –