cURL 和 PHP 显示“1”
Posted
技术标签:
【中文标题】cURL 和 PHP 显示“1”【英文标题】:cURL and PHP displaying "1" 【发布时间】:2012-06-10 03:51:58 【问题描述】:我有一个 php 脚本,我想用它从数据库中读取服务器并使用 cURL 连接到它们。服务器以 sql 查询的结果进行响应。问题是服务器每次响应后的脚本显示数字 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() 的返回值的字符串返回,而不是直接输出。
【讨论】:
救命稻草。我已经添加了PHP.net给出的解释以供大家了解。谢谢@Emil!干杯。【参考方案2】:您需要使用CURLOPT_RETURNTRANSFE
或curl_exec
返回一个状态码并将响应发送到标准输出:
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
【讨论】:
【参考方案3】:CURLOPT_RETURNTRANSFER
应该为 TRUE 以将传输作为curl_exec()
的返回值的字符串返回,而不是直接输出。阅读完整文档php.net
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
或者你可以这样做
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
【讨论】:
【参考方案4】:使用CURLOPT_RETURNTRANSFE
,否则它将返回一个状态码并将响应发送到stdout
:
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
【讨论】:
【参考方案5】:伙计,如果用户可以更改dealer 字段或$deli 字段,那么您已经在此处存储了XSS 漏洞。
$dealer = $server[$i]['dealer'];
echo $dealer . "<br />";
echo $space . $deli[$i1]['id'] . " ";
...etc
使用
htmlentities($your fields)
解决这个问题
【讨论】:
请提供 OP 代码的更新版本。这将帮助其他用户理解问题和答案以上是关于cURL 和 PHP 显示“1”的主要内容,如果未能解决你的问题,请参考以下文章