CURL и PHP, отображающие "1"
У меня есть PHP script, с которым я хочу читать серверы из базы данных и подключаться к ним с помощью cURL. Серверы отвечают результатами запроса sql. Проблема в том, что script после каждого ответа с сервера отображает номер 1. Вывод выглядит следующим образом:
Сервер 1: некоторые результаты
1Server 2: некоторые результаты
1Server 3: некоторые результаты
1
Вот код, который считывает серверы из базы данных и подключается к ним:
<?php
$mysql_id = mysql_connect('localhost', 'ms', 'pass');
mysql_select_db('servers', $mysql_id);
mysql_query("SET NAMES utf8");
$query = "SELECT * FROM svr";
$result = mysql_query($query);
$num = mysql_num_rows($result);
while ($data = mysql_fetch_assoc($result))
{
$server[] = $data;
}
mysql_close($mysql_id);
$i = 0;
while($i < $num) {
$dealer = $server[$i]['dealer'];
echo $dealer . "<br />";
$data = "val=a"; //just for testing
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Content-Type: text/html; charset=utf-8')
);
$result = curl_exec($ch);
echo $result;
$i++;
}
?>
Я обнаружил, что 1 отображается с "echo $result;" и код для создания ответа таков:
<?php
$mysql_id1 = mysql_connect('localhost', 'ms', 'pass');
mysql_select_db('servers', $mysql_id1);
mysql_query("SET NAMES utf8");
$query2 = "SELECT * FROM data";
$result2 = mysql_query($query2);
$num2 = mysql_num_rows($result2);
while ($data2 = mysql_fetch_assoc($result2))
{
$deli[] = $data2;
}
$i1 = 0;
$space = " ";
while ($i1 < $num2) {
echo $space . $deli[$i1]['id'] . " ";
echo $deli[$i1]['artikel'] . " ";
echo $deli[$i1]['znamka'] . " ";
echo $deli[$i1]['model'] . " ";
echo $deli[$i1]['letnik'] . " ";
echo $deli[$i1]['cena'] . " € ";
echo $deli[$i1]['zaloga'] . "<br />";
$i1++;
}
echo "<br />";
mysql_close($mysql_id1);
?>
Пожалуйста, помогите мне
Ответы
Ответ 1
Используйте опцию CURLOPT_RETURNTRANSFER
. В противном случае cURL автоматически отобразит данные и просто вернет true
(который преобразуется в 1
с помощью эха).
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
PHP.net говорит,
TRUE для возврата передачи в виде строки возвращаемого значения curl_exec() вместо непосредственного вывода.
Ответ 2
Вам нужно использовать CURLOPT_RETURNTRANSFE
или curl_exec
возвращает код состояния и отправляет ответ на stdout:
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
Ответ 3
CURLOPT_RETURNTRANSFER
shoud be TRUE, чтобы вернуть передачу как строку возвращаемого значения curl_exec()
, а не выводить ее напрямую. Прочитайте полную документацию php.net
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
или вы можете сделать
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
Ответ 4
Чувак, если пользователь может изменить поле дилера или поля $ deli, у вас есть сохраненная XSS-уязвимость здесь.
$dealer = $server[$i]['dealer'];
echo $dealer . "<br />";
echo $space . $deli[$i1]['id'] . " ";
...etc
используйте
htmlentities($your fields)
для решения этой проблемы
Ответ 5
Используйте CURLOPT_RETURNTRANSFE
иначе он вернет код состояния и отправит ответ на стандартный stdout
:
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);