プロが教えるわが家の防犯対策術!

お世話になります。

jQueryを使用します。
Handsontableを使いたいと思います。
表に入力した内容をperlのCGIにデータ送信して、処理をしたいのですが
どのようにすればいいのかがわからずにいます。

http://handsontable.com/demo/ajax.html
こちらにサンプルがあるのですが、saveのときの処理がよくわかりません。
$.ajax の data にただの文字列を設定すれば、CGIでの受け取り方がわかるのですが、
表のデータ?(handsontable.getData()の部分)の場合、CGIではどのように
受け取れば良いのでしょうか?

$.ajax({
  url: "netaut2.cgi",
  data: {"data": "abcde"},
  dataType: 'json',
  type: 'POST',
   :
}

↑こうであれば、CGI側は

$form = new CGI;
$val = $form->param('data');

このようにして$valに"abcde"とデータが取れますが、

var json_data = [
{"name" : "Taro", "age" : 19},
{"name" : "Hana", "age" : 25}
];
$.ajax({
  url: "netaut2.cgi",
  data: json_data,
  dataType: 'json',
  type: 'POST',
   :
}

のようにした場合がわかりません。

宜しくお願い致します。

このQ&Aに関連する最新のQ&A

A 回答 (3件)

use CGI;


use JSON qw/encode_json decode_json/;

my $query = CGI->new;
my $data = $query->param('POSTDATA'); <-今回の質問の肝はおそらくこちらです
my $json_array = $json->decode( $data ); <-JSONデータをPerlで解釈できるように変換

$json_arrayから、扱いたいデータが扱えると思います。

全て英語ですが…参考URLです。
https://metacpan.org/pod/CGI#HANDLING-NON-URLENC … CGI.pmのparam('POSTDATA')について

http://stackoverflow.com/questions/908113/how-ca …
http://stackoverflow.com/questions/15899616/jque …

JSONモジュールについて
http://d.hatena.ne.jp/perlcodesample/20100427/12 …
    • good
    • 0
この回答へのお礼

アドバイス頂き、ありがとうございます。
どうしても$dataに値が入ってこないのです…
使い方を間違えているのかもしれません。
<STDIN>だと、一列で全データが入ってきます。(URIエンコードされた状態)
もう少し試してみます。
ありがとうございました。

お礼日時:2013/11/20 16:45

大分時間が経ってますが、jQueryはその形式をサポートしていないようです。



http://api.jquery.com/jQuery.ajax/
dataのフォーマットはPlainObject or Stringとなっています。

配列はPlainObjectではありませんが、
nameプロパティとvalueプロパティが含まれるオブジェクトの配列であれば、name=valueというデータとして送信できるようです。これは非公式の書き方かもしれません。

[
{"name": "name1", "value": "value1"},
{"name": "name2", "value": "value2"}
]

name1=value1&name2=value2

ご参考まで。
    • good
    • 0
この回答へのお礼

遅くなり、申し訳ありません。

アドバイス、ありがとうございます。
簡単に取得できる方法はないのですね。
name=valueの羅列で入ってきたデータを解析して使用するようにしました。

ありがとうございました。

お礼日時:2013/12/05 09:51

拙作では$.ajaxではcontentTypeを指定しているのですが、この指定はありますか?



$.ajax {
 type: "POST",
 contentType: "application/json",
 ・・・

以下のURLを見る限り、必要そうなので・・・
http://tarotaro.jugem.cc/?eid=1542
    • good
    • 0
この回答へのお礼

遅くなり、申し訳ありません。

contentTypeの指定は無かったので追加してみたのですが、
変化がありませんでした。

アドバイスありがとうございます。

お礼日時:2013/12/05 09:48

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QjQuery,Ajaxでcgiに接続する方法がわからなくて困っています

jQuery,Ajaxでcgiに接続する方法がわからなくて困っています。
あるデータベースのあるテーブル(仮にpersonテーブル)を参照して、html上のformタグに文字を入れるとselectボックス内に表示されるものがマッチしたものが表示されるようなものを作りたいと思っています。

例えば、
personテーブルのperson_nameカラムには(秋本、本田、寺西、寺本、戸田、吉岡)という情報が入っていて、selectボックス内は最初全ての人名が出ているとします。
person.htmlというテンプレートのformのところに【寺】と入力するとselectボックス内は寺西と寺本だけ表示される。

そのようなものを作りたいと思っていますがうまくいきません。何か参考になるURLだけでもかまいませんのでご教授下さい。
できればサンプルソースがあればうれしです。

Aベストアンサー

とりあえずjQueryのサンプルです。
(cgiがperlでなくPHPで申し訳ない)
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="ja-JP">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta http-equiv="Content-Script-Type" content="text/javascript">
<script type="text/javascript" charset="utf-8" src="/jslib/jquery-1.4.2.min.js"></script>
<script type="text/javascript" charset="utf-8">
<!--
$(function(){
$("#search_name").keyup(function(){
if(!$(this).val()) return false;
console.log($(this).val());
$.ajax({
type: "POST",url:"/hogehoge.php?",dataType:"json",
data:{"search_name":$(this).val()},
success:function(data){
$('#person').empty();
for(var i=0;i<data.length;i++){
var option=$("<option>");
option.val(data[i]);
option.text(data[i]);
$('#person').append(option);
}
},
error:function(XMLHttpRequest,status,errorThrown){
alert(XMLHttpRequest.url + ":"+ status);
}
});
});
});
// -->
</script>
<body>
<body>
<form>
<input id="search_name" type="text" value="">
</form>
<select name="person" id="person">
<option value="秋本">秋本<option value="本田">本田<option value="寺西">寺西
<option value="寺本">寺本<option value="戸田">戸田<option value="吉岡">吉岡
</select>
</body>
</html>

cgi(PHP)側のサンプル
<?php
header("Content-type:text/javascript");
mb_language("japanese");
mb_internal_encoding("UTF-8");
mb_http_output("UTF-8");
if(isset($_POST['search_name'])){
/*
ここにDB検索処理を記述
「$_POST['search_name']をキーにして読み込んだデータを
配列変数$dataに格納する。」
*/
$data= array("寺西","寺本"); //テスト用サンプル
echo json_encode($data);
}
?>

とりあえずjQueryのサンプルです。
(cgiがperlでなくPHPで申し訳ない)
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="ja-JP">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta http-equiv="Content-Script-Type" content="text/javascript">
<script type="text/javascript" charset="utf-8" src="/jslib/jquery-1.4.2.min.js"></script>
<script type="text/javascript" chars...続きを読む

QHTML上(javascript)からCGIを実行する方法

javascriptから外部実行ファイル(javascriptファイルではなくperlなどのCGI)
を実行する方法を探しています。
下記のようにindex.htmとtest.cgiファイルを用意して、index.htm内の
javascriptから外部cgiを実行させ、cgiの結果(test.cgiでは単に
『test』と表示するのみ)を表示したいと考えています。

利用増ですが、cgiやssiが使用できないサーバにindex.htmを置いて、
cgiが使用できるサーバ上のcgi結果を取得したいものです。
通常のcgiのように、1ページでcgi結果を表示するものではなく、
HTMLファイルの一部にcgi処理結果を表示させたいものです。

そもそも、SSIを使用しなければ下記のようなHTML内にcgiなどの
実行結果を表示する事は出来ないのでしょうか。
よろしくお願い致します。

※下例のプログラムではcgi結果は表示されませんでした・・・。

---<index.htm>----------------------------------------
<HTML>
<BODY>
<SCRIPT language="Javascript" src="http://xxx.xxx.xxx.xxx/test.cgi"></SCRIPT>
</BODY>
</HTML>

---<test.cgi>----------------------------------------
#!/usr/bin/perl

print "test"

javascriptから外部実行ファイル(javascriptファイルではなくperlなどのCGI)
を実行する方法を探しています。
下記のようにindex.htmとtest.cgiファイルを用意して、index.htm内の
javascriptから外部cgiを実行させ、cgiの結果(test.cgiでは単に
『test』と表示するのみ)を表示したいと考えています。

利用増ですが、cgiやssiが使用できないサーバにindex.htmを置いて、
cgiが使用できるサーバ上のcgi結果を取得したいものです。
通常のcgiのように、1ページでcgi結果を表示するものではなく、
HTML...続きを読む

Aベストアンサー

「Google AdSense」のjavascriptでは#1さんの回答にもありますがiframeを使用するような仕掛けになっているようです。
・javascriptでiframeを展開。
・iframeのsrcでcgiを指定。

>外部cgiでjavascriptを生成する仕組みを作り、その生成されたjavascriptを参照するという間接的な仕組みを設ければ可能になる
そういう仕組みも可能です。
また、直接的に<script type="text/javascript" src="xxxx.cgi"></script>
こういう書き方も可能です。
※xxxx.cgiでは処理結果をjavascriptのコードとして
print "Content-Type: application/x-javascript\n\n";
print "document.write('xxxx');";
みたいにして吐き出す必要があります。

Q数値かどうかの判定方法

$aに代入されているものが数値かどうかを判定するにはどのようにしたらよいのでしょうか?

Aベストアンサー

$a =~ /^[0-9]*$/
上記の場合、*は「直前のパターンの0回以上の繰り返し」の意味なので、0から9がなくても、つまり$aが空でもマッチしてしまいます。
なので、
$a =~ /^[0-9]+$/
としましょう。
(+は「直前のパターンの1回以上の繰り返し」)
また、0-9は\dで表すこともできるので
$a =~ /^\d+$/
と書くこともできます。

Qperlを使ってレコード件数を取り出してみると、すごい数が・・・。

perlのDBIモジュールを使って、mysqlのレコード件数を表示させてみると、すごい数が表示されました。ソースは以下の通りです。
use DBI;
$dbh=DBI->connect("DBI:mysql:データベース名:サーバ名", "ユーザ名", "パスワード") || die $DBI::errstr;
if(!$dbh){
print "エラーです。入力を確認してください。";
exit;
}else{
#接続成功

# SELECT文発行
$sth=$dbh->prepare("SELECT sei, mei, mail FROM table");
#実行
$sth->execute;
$num_rows = $sth->rows;
print "該当 $num_rows, 件\n";

# 開放
$sth->finish;
# AUTO COMMITがOFFの場合はCOMMITが必要
$dbh->commit;
# 切断
$dbh->disconnect;
}

実行すると該当 4294967294, 件 とブラウザに表示されました。僕はレンタルサーバを使っているわけですが、僕のデータベースにはレコードは3件しかないのです。これはレンタルサーバのデータベースすべての件数が表示されているのでしょうか?
なんだかSQLを実行するのが怖いので、考えられる原因を教えてください。よろしくお願いします。
プログラムを初めてまだ、数ヶ月しか経ってない初心者なので、みなさんの知恵を貸していただけると幸いです。

perlのDBIモジュールを使って、mysqlのレコード件数を表示させてみると、すごい数が表示されました。ソースは以下の通りです。
use DBI;
$dbh=DBI->connect("DBI:mysql:データベース名:サーバ名", "ユーザ名", "パスワード") || die $DBI::errstr;
if(!$dbh){
print "エラーです。入力を確認してください。";
exit;
}else{
#接続成功

# SELECT文発行
$sth=$dbh->prepare("SELECT sei, mei, mail FROM table");
#実行
$sth->execute;
$num_rows = $sth->rows;
print "該当 $num_rows, 件\...続きを読む

Aベストアンサー

こんにちは。

まず、全然関係ないですが、SELECT文ではCOMMIT不要です。
さて本題ですが、この場合のrowsは何が返るかわかりません。
rowsでレコード数を取り出せるのは下記の場合のみです。
1.doメソッドで実行した場合(条件付き)
2.SELECT以外のSQL。
3.SELECT実行後、すべての行を取り出した後。

ところで、件数取得はCOUNT()じゃダメ?
(^^ゞ

QJavaScriptde途中で、「exit」するには?

function kensaku(){
s_data = document.kaiin_form.input_name.value;

if(!s_data){ alert("キーワードを入れて下さい!"); }

if(s_data != dumy){ ...... }
for(i=st_no;i<=n;i++){
......省略.................;
.......省略................}
}

----------------------------------
3行目で表示されたアラートをOKで閉じても、4行目以下が実行されてしまいます。
3行目でexitするにはどうすれば良いでしょうか?

Aベストアンサー

>関数(kensaku())からは抜けられませんでした。
そうですね、勘違いしていました、f(^^;
すみません。
if(!s_data){
alert("キーワードを入れて下さい!");
return;
}
ですね。

Qcgi 実行時のエラー

perl初心者でまた質問させていただきます。「送信」ボタンをクリックすると、HPで入力してもらった情報をメールで送信するcgiを作成しました。ただ、実行すると、
Can't locate object method "new" via package "Net::SMTP" (perhaps you forgot to load "Net::SMTP"?) at C:\www\cgi-bin\downloadmail.cgi line 62.
というエラーが出ます。
cgiは、
my $smtp = Net::SMTP->new($192.1.1.1);
$smtp->mail($email);
$smtp->to($to);

$smtp->data();
$smtp->datasend("From:$email\n");
$smtp->datasend("To:***@***.co.jp\n");
$smtp->datasend("Subject:テストメール\n"); #件名
$smtp->datasend("Content-Type: text/plain; charset=iso-2022-jp\n\n");
$smtp->datasend("テストメール\n");
$smtp->dataend();
$smtp->quit;
というものです。どなたか分かりましたらお願いします。

perl初心者でまた質問させていただきます。「送信」ボタンをクリックすると、HPで入力してもらった情報をメールで送信するcgiを作成しました。ただ、実行すると、
Can't locate object method "new" via package "Net::SMTP" (perhaps you forgot to load "Net::SMTP"?) at C:\www\cgi-bin\downloadmail.cgi line 62.
というエラーが出ます。
cgiは、
my $smtp = Net::SMTP->new($192.1.1.1);
$smtp->mail($email);
$smtp->to($to);

$smtp->data();
$smtp->datasend("From:$email\n");
$smtp->datasend...続きを読む

Aベストアンサー

Net::SMTPモジュールのロードを指示する
use Net::SMTP;
は書いてある?

1行目の
#!/usr/bin/perl
の下あたりに
use Jcode;
って書いてあると思うので、そこを
use Net::SMTP;
use Jcode;
にしましょう。

QOracle(オラクル)で、日付時刻型の検索方法について

質問させていただきます。
データベースはオラクルを使っていて、
SQL文で、抽出するときにエラーが出て困っています。

日付時刻型が「2005/05/26 19:13:00」という感じで入ってます。
2005/05/26 を抽出したいのですが、
BETWEEN '2005/05/26 00:00:00' AND '2005/05/26 23:59:59'

だと、エラーでできません。
どなた様か、ご教授よろしくお願いしますm(_ _)m

Aベストアンサー

日付検索を行う場合は、以下のように書式を含める必要があります。

col BETWEEN TO_DATE('2005/05/26 00:00:00','YYYY/MM/DD HH24:MI:SS') AND TO_DATE('2005/05/26 23:59:59','YYYY/MM/DD HH24:MI:SS')

ただ、厳密には

col >= TO_DATE('2005/05/26', 'YYYY/MM/DD')
AND
col < TO_DATE('2005/05/27', 'YYYY/MM/DD')

と書くべきでしょうね。

QPerlのデバッグ方法って。。。ないでしょうか??_no

こんにちは。よろしくお願いします。

Perl担当者の方が休まれているため、急遽、Perlシステムの修正作業を行うことになったPerl初心者の者です。


普段はASPを使っているので、デバッグ時に「response.write」など、処理内容をブラウザ上に表示させてしまう~などのことが可能なのですが。。。
Perlの場合、何か方法は無いでしょうか??

多分、この変数とこの入力値の比較の時に不正があるんだろ??のような部分は発見したのですが。。。その値~の表示ができないので、確証が持てない&修正が容易ではないです。


Perlのデバッグは。。。どのように行っているのでしょうか。。。?
ご存知の方いましたら、ご教授願えませんでしょうか。よろしくお願いします。

(エラーについての質問は別で立てさせていただきたいと思います。

Aベストアンサー

> 多分そのように思います。(「.cgi」や>「.pl」拡張子は、CGIスクリプト。という> 覚え方であっていればですが。

.plはシェルのコマンドラインで起動するファイルにも
使いますのでなんともいえませんが、
.cgiという拡張子ならまあCGI用でしょうね。

日本語のドキュメントがあるかどうかわかりませんが、

CGI::Carpには、メッセージの出力先を切り替える
メソッドがあります。
ちょっと引用すると

The carpout() function requires one argument, which should be a
reference to an open filehandle for writing errors. It should be called
in a "BEGIN" block at the top of the CGI application so that compiler
errors will be caught. Example:

BEGIN {
use CGI::Carp qw(carpout);
open(LOG, ">>/usr/local/cgi-logs/mycgi-log") or
die("Unable to open mycgi-log: $!\n");
carpout(LOG);
}

とすると、
Perlからのログ出力が
/usr/local/cgi-logs/mycgi-log
になります。
ここを適当なディレクトリと名前にしてやってみてはどうでしょう。

詳しい説明はPerlがインストールされている環境で

perldoc CGI::Carp

とすればでてきます。

ちょっと余計なことかもしれませんが、別の質問において提示されている
プログラム片を見る限りずいぶんと古いスタイルでお書きのようですね。

歴史があるプログラムかもしれませんが、もうちょっと
担当者の方は勉強されたほうが良いかと思います。

あともう一つ。
サーバソフトがわからなかったので前回の回答で
httpdと書きましたが、IISらしいということがわかりましたので
IISのログを調べてみてください。
IISは使ったことないので具体的に、「ここだよっ」
とはいえませんが。

> 多分そのように思います。(「.cgi」や>「.pl」拡張子は、CGIスクリプト。という> 覚え方であっていればですが。

.plはシェルのコマンドラインで起動するファイルにも
使いますのでなんともいえませんが、
.cgiという拡張子ならまあCGI用でしょうね。

日本語のドキュメントがあるかどうかわかりませんが、

CGI::Carpには、メッセージの出力先を切り替える
メソッドがあります。
ちょっと引用すると

The carpout() function requires one argument, which should be a
reference to an open fil...続きを読む

QAjaxが動きません~『status=0』?

Ajaxを使うため、
web上のサンプルをとってきて実行してみたところ、動きません。

いろいろ調べてみたところ、
通常
 if(httpObj.status == 200)
などで使われるstatusが0になっていることが分かりました。

どこかで
 『ローカル上ではstatusは0になる』
という記述を見たのですが、Apache2.0.59が入っています。

Apacheが入っていてもstatusは0になるのでしょうか?

今回使用したサンプルは以下のサイトをのモノを貼り付けました。
http://www.openspc2.org/JavaScript/Ajax/Ajax_study/chapter02/004/index.html
その上で、
  if ((httpObj.readyState == 4) && (httpObj.status == 200))
  {
    displayData();
  } else {
    document.ajaxForm.result.value = httpObj.status;
  }
としました。


これで2日悩んでいるので、解決したいのです。
よろしくお願いいたします。

Ajaxを使うため、
web上のサンプルをとってきて実行してみたところ、動きません。

いろいろ調べてみたところ、
通常
 if(httpObj.status == 200)
などで使われるstatusが0になっていることが分かりました。

どこかで
 『ローカル上ではstatusは0になる』
という記述を見たのですが、Apache2.0.59が入っています。

Apacheが入っていてもstatusは0になるのでしょうか?

今回使用したサンプルは以下のサイトをのモノを貼り付けました。
http://www.openspc2.org/JavaScript/Ajax/Ajax_study/c...続きを読む

Aベストアンサー

> error.logにしか書き込みがないという時点で失敗なのがよく分かりました。
Apacheの起動に失敗してるのでは?

まさかとは思いますが、Apacheをインストールしただけで動いてないとか、使ってないとか、
そういうことはないですよね?
アクセスするアドレスってどうなってます?
ちゃんとhttp://localhost/~ または http://127.0.0.1/~としてますか?

> 『ローカル上ではstatusは0になる』
語弊のある書き方ですが、ウェブサーバーを使わずにファイルを読み込んだ場合、
つまり、file:///~のようなアドレスになる場合にstatusを受け取れません。
ローカルでもウェブサーバーを使っていればstatusコードを受け取れます。

蛇足になりますが
statusを見るだけだったらContent-typeは関係ないですよ。
ファイルが有れば200、エラーならそのエラーコードが入ります。
404 FileNotFoundとかのHTTP Status codeと同じですので。

>   if ((httpObj.readyState == 4) && (httpObj.status == 200))
>   {
>     displayData();
>   } else {
>     document.ajaxForm.result.value = httpObj.status;
>   }
この書き方では、else文はたぶん意味はないと思います。

readyStateの変遷を見るためなら

document.ajaxForm.result.value += httpObj.readyState + ', '+ httpObj.status + '\n';

、、、を、if文の前に書いた方がいいと思います。(たぶん動くと思うので)

> error.logにしか書き込みがないという時点で失敗なのがよく分かりました。
Apacheの起動に失敗してるのでは?

まさかとは思いますが、Apacheをインストールしただけで動いてないとか、使ってないとか、
そういうことはないですよね?
アクセスするアドレスってどうなってます?
ちゃんとhttp://localhost/~ または http://127.0.0.1/~としてますか?

> 『ローカル上ではstatusは0になる』
語弊のある書き方ですが、ウェブサーバーを使わずにファイルを読み込んだ場合、
つまり、file:///~のよ...続きを読む

QjQueryのpostからのリクエストをCGIで受信して処理したい

jQueryのpostからのリクエストをCGIで受信して処理したい
こんにちわ。CGIはまったくの素人に近いですが、よろしくお願いします。
今作成中のページからjavascript(具体的にはjQuery)を使ってpostでリクエストをサーバに送信し、それをCGIで受け取ってカウンタを増やして返す的なことをやろうとしています。
送信側ではとりあえずページをロードしたら(view()で)リクエストを送り(下のtest.cgi)、帰ってきた値を(ID"count1"で)ページにまた反映するという形をとっています。

javascriptのpost部分抜粋
function view() {jQuery.post("../../../cgi-bin/test.cgi",
{"key1":"1"},
function(data){
$("#count1").html(data)
}
);
};

送信はできてるみたいなのですが受け取るCGIが問題で、「フォームからデータを送る場合」というのは山ほど解説があるのですが単純に送られてきたリクエストを受け取るのは下のプログラムではダメみたいです。

CGI部分
#!/usr/bin/perl
my $counter=0;
read( STDIN, $buffer, $ENV{'CONTENT_LENGTH'} );
$counter++;
return("$counter");

当初CGIが必要だとは思わずにいたので、昨日からCGIを勉強し始めたレベルの素人ですが
じっくりと腰をすえて一人で解決する時間もないので、よろしくお願いします。

jQueryのpostからのリクエストをCGIで受信して処理したい
こんにちわ。CGIはまったくの素人に近いですが、よろしくお願いします。
今作成中のページからjavascript(具体的にはjQuery)を使ってpostでリクエストをサーバに送信し、それをCGIで受け取ってカウンタを増やして返す的なことをやろうとしています。
送信側ではとりあえずページをロードしたら(view()で)リクエストを送り(下のtest.cgi)、帰ってきた値を(ID"count1"で)ページにまた反映するという形をとっています。

javascriptのpost部分抜粋
fu...続きを読む

Aベストアンサー

Ajaxに値を戻すなら、普通にブラウザへ表示(HTTPヘッダ付き標準出力)するようにします。
例:
return("$counter");
 の行を
 print "Content-type: text/plain\n\n";
 print $counter;
 とします。
ただ、Ajax側のリストをよく見ていないので動くかどうかはやってみてください。


人気Q&Aランキング