【问题标题】:cURL and PHP displaying "1"cURL 和 PHP 显示“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 = "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;";
    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);
?>

请帮帮我

【问题讨论】:

    标签: php mysql database curl


    【解决方案1】:

    使用CURLOPT_RETURNTRANSFER 选项。否则 cURL 会自动回显数据,只返回true(通过回显转换为1)。

    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    

    PHP.net 说,

    TRUE 将传输作为 curl_exec() 的返回值的字符串返回,而不是直接输出。

    【讨论】:

    • 救命稻草。我已经添加了PHP.net给出的解释以供大家了解。谢谢@Emil!干杯。
    【解决方案2】:

    您需要使用CURLOPT_RETURNTRANSFEcurl_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 代码的更新版本。这将帮助其他用户理解问题和答案
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-05-28
          • 2011-01-09
          • 2016-12-06
          相关资源
          最近更新 更多