Heim > Backend-Entwicklung > PHP-Problem > Was soll ich tun, wenn PHP keine Parameter empfangen kann?

Was soll ich tun, wenn PHP keine Parameter empfangen kann?

藏色散人
Freigeben: 2023-03-17 21:54:01
Original
4266 Leute haben es durchsucht

Lösung dafür, dass PHP keine Parameter empfängt: 1. Ändern Sie den Sendecode in „$data = array ('openid' => "123",'keyword' => "321");$data = json_encode( $data );..."; 2. Ändern Sie den empfangenden Endcode in „$obj=file_get_contents("php://input");$data=json_decode(...)".

Was soll ich tun, wenn PHP keine Parameter empfangen kann?

Die Betriebsumgebung dieses Tutorials: Windows 10-System, PHP-Version 8.1, DELL G3-Computer

Was soll ich tun, wenn PHP keine Parameter empfangen kann?

  • Curl-Übermittlungsparameter können von PHP nicht empfangen werden

Detaillierte Problembeschreibung:

Ich habe eine Schnittstelle mit thinkphp geschrieben.

Verwenden Sie Curl, um die Schnittstelle auf der Remote-Seite aufzurufen. Curl ist wie folgt geschrieben:

function curl($url,$method,$params,$auth){
    
    
    //初始化CURL句柄
    $curl = curl_init();
    
    curl_setopt($curl, CURLOPT_URL, $url);//设置请求的URL
    #curl_setopt($curl, CURLOPT_HEADER, false);// 不要http header 加快效率
    curl_setopt($curl, CURLOPT_RETURNTRANSFER,1); //设为TRUE把curl_exec()结果转化为字串,而不是直接输出
    
    //SSL验证
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);    // https请求时要设置为false 不验证证书和hosts  FALSE 禁止 cURL 验证对等证书(peer's certificate), 自cURL 7.10开始默认为 TRUE。从 cURL 7.10开始默认绑定安装。
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);//检查服务器SSL证书中是否存在一个公用名(common name)。
    
    $header[] = "Content-Type:application/json;charset=utf-8";
    if(!empty($header)){
        curl_setopt ( $curl, CURLOPT_HTTPHEADER, $header );//设置 HTTP 头字段的数组。格式: array('Content-type: text/plain', 'Content-length: 100')
    }
    
    //请求时间
    $timeout = 30;
    curl_setopt ($curl, CURLOPT_CONNECTTIMEOUT, $timeout);//设置连接等待时间
    
    //不同请求方法的数据提交
    switch ($method){
        case "GET" :
            curl_setopt($curl, CURLOPT_HTTPGET, true);//TRUE 时会设置 HTTP 的 method 为 GET,由于默认是 GET,所以只有 method 被修改时才需要这个选项。
            break;
        case "POST":
            if(is_array($params)){
                $params = json_encode($params,320);
            }
            #curl_setopt($curl, CURLOPT_POST,true);//TRUE 时会发送 POST 请求,类型为:application/x-www-form-urlencoded,是 HTML 表单提交时最常见的一种。
            #curl_setopt($curl, CURLOPT_NOBODY, true);//TRUE 时将不输出 BODY 部分。同时 Mehtod 变成了 HEAD。修改为 FALSE 时不会变成 GET。
            curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "POST");//HTTP 请求时,使用自定义的 Method 来代替"GET"或"HEAD"。对 "DELETE" 或者其他更隐蔽的 HTTP 请求有用。 有效值如 "GET","POST","CONNECT"等等;
            //设置提交的信息
            curl_setopt($curl, CURLOPT_POSTFIELDS,$params);//全部数据使用HTTP协议中的 "POST" 操作来发送。
            break;
        case "PUT" :
            curl_setopt ($curl, CURLOPT_CUSTOMREQUEST, "PUT");
            curl_setopt($curl, CURLOPT_POSTFIELDS,json_encode($params,320));
            break;
        case "DELETE":
            curl_setopt ($curl, CURLOPT_CUSTOMREQUEST, "DELETE");
            curl_setopt($curl, CURLOPT_POSTFIELDS,$params);
            break;
    }
    
    
    
    $data = curl_exec($curl);//执行预定义的CURL
    $status = curl_getinfo($curl, CURLINFO_HTTP_CODE);//获取http返回值,最后一个收到的HTTP代码
    curl_close($curl);//关闭cURL会话
    $res = json_decode($data,true);
    
    return $res;
}
Nach dem Login kopieren

Ich habe ein Problem festgestellt, das heißt, wenn der Beitrag übermittelt wird, kann der Hintergrund die übergebenen Parameter nicht empfangen.

Backend-Empfang:

  public function getUserById(){
       $custid = I("post.cust_uid");
        $companyId = I("post.company_id");
      
        $model = M('chatuser','snake_',$this->db);
      
        $mine = $model->field('username,avatar,sign,id')->where(['id'=>$custid])->find();
        $company = $model->field('username,avatar,sign,id')->where(['id'=>$companyId])->find();
        
            
        $return['mine'] =$mine;
        $return['company'] =$company;
        $return['status'] = 1;
       
     $this->ajaxReturn($return);
    }
Nach dem Login kopieren

Nach verschiedenen Debugging-Vorgängen wurde festgestellt, dass

$header[] = "Content-Type:application/json;charset=utf-8";
Nach dem Login kopieren

und

 if(is_array($params)){
               $params = json_encode($params,320);
           }
Nach dem Login kopieren

im Header Daten vom JSON-Typ übermittelten und bei Verwendung von Postman zum Testen der Schnittstelle die Formulardaten des Körpers verwendet wurden

Dringend, Wir können es nur zuerst tun. Kommentieren Sie die beiden oben genannten Codes aus. Normal absenden. Wenn Sie Zeit haben, werfen wir einen Blick auf die JSON-Empfangsmethode.

Wenn es Schüler gibt, die es wissen und eine Nachricht hinterlassen möchten, um Zweifel auszuräumen, sind wir dankbar!

Der korrekte Lösungscode lautet wie folgt:

//发送端
$data = array (
            'openid'  => "123",
            'keyword' => "321"
        );
        $data = json_encode($data);
        ...
        curl_setopt($curl, CURLOPT_POST, 1);   
        curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
//接受端
$obj = file_get_contents("php://input");
$data = json_decode($obj, true);
Nach dem Login kopieren

Empfohlenes Lernen: „PHP-Video-Tutorial

Das obige ist der detaillierte Inhalt vonWas soll ich tun, wenn PHP keine Parameter empfangen kann?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage