2017-04-04 20 views
0

名(「Jドウ」)と電話番号(1234567)を提出し、単純な角度1.1 $ https.postフォーム全体を送信していない:へ

<!DOCTYPE html> 
<html> 
<head> 
<script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular.min.js"> </script> 
    <script> 
    var app = angular.module('myApp',[]); 
    app.controller('myCtrl',function($scope,$http){ 
     $scope.insertData=function(){ 
      $http.post("cgi-bin/in.cgi",{ 
       'bname':$scope.bname, 
       'bphone':$scope.bphone 
       }).then(function(response){ 
        console.log("Data Inserted Successfully"); 
       },function(error){ 
        alert("Sorry! Data Couldn't be inserted!"); 
        console.error(error); 

       }); 
      } 
     }); 
    </script> 
</head> 
<body> 
    <div ng-app="myApp" ng-controller="myCtrl"> 
     <form> 
      Name:- <input type="text" ng-model="bname" /> 
      Phone:-<input type="text" ng-model="bphone" /> 
      <input type="button" value="Submit" ng-click="insertData()" /> 
     </form> 
    </div> 

</body> 
</html> 

#!/usr/bin/perl -w 

use strict; 
use warnings; 
use CGI qw(:standard); 
use DBI; 
use POSIX qw(strftime); 
use JSON; 

my $sql; 

my $dbh = DBI->connect('****', '****', '****') || die "Connecting from Perl to MySQL database failed: $DBI::errstr"; 

my $cgi = CGI->new; 
my $name = $cgi->param('bname') || "unknown"; 
my $phone = $cgi->param('bphone') || "unknown"; 

print "Content-type:text/html\r\n\r\n"; 

$sql = "insert into TestDB values ('$name', '$phone')"; 
$dbh->do("$sql") || die ("Connecting from Perl to MySQL database failed: $DBI::errstr"); 

$dbh->disconnect; 

print "Record insert successfully"; 

しかし、DBに挿入されている唯一のものは、次のとおりです:

+---------+---------+ 
| Name | Phone | 
+---------+---------+ 
| unknown | unknown | 
+---------+---------+ 
1 row in set (0.00 sec) 

名前と電話はどこにもありませんが、MySQLへの挿入を行うPerlスクリプト$ CGI->のparam(「POSTDATA」)の印刷には、以下を与える:

{"json":"J Doe"} 

[OK]を、私はいくつかの奇妙な「JSON」キーと一緒に、名前、「Jドウ」を見つけましたが、どこの電話番号は?
私は何が欠けていますか?

+0

||を削除するとどうなりますか$ nameと$ phoneの割り当てから "不明"? – Jason

+0

|| "unknown" $ nameと$ phoneが設定されていないため、実行エラーがスローされます。どうやら、$ cgi-> param( 'name')などは存在しません。 – user2569618

+0

データタイプの不一致があるようです。以下の答えが示すように、フォームエンコーディングのパラダイムを混在させています。データをどの形式で送信しますか? – Jason

答えて

2

header : { 'Content-Type': 'application/json' } 

$ CGI->のparam( 'POSTDATA')はそこから

{ "bname" : "J Doe", "bphone" : "1234567" } 

になった、Perlのdecode_jsonはに文字列を変換しますハッシュは問題を終了しました。

my $decoded = decode_json($cgi->param('POSTDATA')); 
$sql = "insert into TestDB values ('$decoded->{bname}', '$decoded->{bphone}')"; 

スタックオーバーフローが再び発生します。

+0

コンテンツタイプのAngularJSのデフォルトは 'application/json'です。私はそれがすでにそれを送信していないことに驚いています。あなたのコードはそのデフォルトをどこかで上書きしましたか?詳細については、[AngularJS $ http APIリファレンス - HTTPヘッダーの設定]を参照してください(https://docs.angularjs.org/api/ng/service/$http#setting-http-headers) – georgeawg

+0

元々、POSTDATAは私が望むデータのように見えました(元の投稿を見てください)が、POSTDATAにjson形式のすべてのデータが含まれているかどうかを明示的に "application/json"と宣言するJasonの提案に従うまででした。 – user2569618

1

あなたはx-www-form-urlencodedを使用しているので、そのモードを使用して投稿するたびに投稿されたURLのデータをクエリ文字列として追加する必要があります。

それは次のようになります。

$scope.insertData=function(){ 
     $http.post("cgi-bin/in.cgi?bname=" + $scope.bname + "&bphone=" + $scope.bphone, { 
      headers: { 'Content-Type': 'application/x-www-form-urlencoded' } 
      }).then(function(response){ 
       console.log("Data Inserted Successfully"); 
      },function(error){ 
       alert("Sorry! Data Couldn't be inserted!"); 
       console.error(error); 

      }); 
     } 
    }); 

しかし、あなたが適切にあなたが送信されている値をエンコードする必要があります、詳細については、以下のリンクを参照してください。 How do I POST urlencoded form data with $http in AngularJS?

お役に立てば幸いです。 JSONを入力するには$ http.postのヘッダを設定することにより