人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

phpでapiをつくってみたいっす。
こんばんわ。

phpでフォームを作り、そこにSQLを入力すると値をHTMLのテーブルとして返すphpが作れました。

これをどうにかapiにしたいのですが、どうやれば良いんでしょう?
apiの作り方について、ヒントをください。

現状こんな感じ
http://memo.bz/blg/sqlsarver2000php/
リンク先のphpのコードで、$query = $aaa とし、をまるまる外に出した状態です。
フォーム(a.html)から$aaaを受け取って表示させてます。

先日質問したflashBuilder4のsqlsarverへの接続の代替案としていけそうなんです。


●質問者: きあ
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:AAA API HTML PHP SQL
○ 状態 :終了
└ 回答数 : 4/4件

▽最新の回答へ

1 ● niwa-mikiho
●40ポイント

API と格好良く言われてますが、


呼び出しに対して応答してるだけ


です。


bbs.cgi?board=test&thread=123456789

このような掲示板なども大げさに言えば 「API」 を扱っているともいえます。

board=test&thread=123456789 というパラメーターを受け取り、HTML を結果として返します。



さて、不特定多数へ提供する API ですが、応答を HTML で返されたのでは呼び出し元に対して優しくありません。


そこで多く用いられるのが XML や JSON という形になっています。

API によっては URL にパラメーターを与えず、XML の記述に則って各種パラメーターを定義し、

その XML の内容をパラメーターとして受け取る API もあります。




ものすごく大雑把な簡単な例ですが・・・


En2Jp.cgi

use strict;

use warnings;

use CGI;

my $in = new CGI;

my $str = $in->param('str');

print honyaku($str); # 英語から日本語への翻訳


とすれば、英語を和訳にする API として動かせます。

(API というにはなんの昨日もありませんがw)


これで大体はお分かりいただけたでしょうか?


API を作るうえで重要なのは、


呼びやすさ


かと思います。

複雑怪奇な設定は避けるべきです。

◎質問者からの返答

ご回答ありがとうございます。

何となくイメージはついてきました。

現状HTMLから受けて、HTMLで吐き出しているものを、

何か(FLEXとか)からPOSTし、XMLをGETするような感じですよね。

ちょっと、テーブルじゃなくてXMLとして吐けるか試してみたいと思います。

PHPは昨日覚え始めたのでできるかどうか。


2 ● deflation
●20ポイント

apiというのは「WebAPI」のことですか?

それでしたら方式が3種類あります。まず、どの方式を採用するかご検討下さい。

  1. REST
  2. XML-RPC
  3. SOAP

http://d.hatena.ne.jp/hikm/20070228/1172684400


ここでは、RESTでコールしてXMLで受け取る方式について回答します。

http://www.usamimi.info/~ryouchi/wiki/


なお、入力されたSQLをそのままDBに渡すことは禁忌です。

SQLインジェクション処理を施しましょう。

◎質問者からの返答

ご回答ありがとうございます。

現状閉ざした状態なので、SQLインジェクションは後から考慮したいと思います。

本当に始めて作るものなので、極力単純に勧めたいんです。

もちろん運用する際には対応したいと思います。

といっても、イントラ限定での運用なのです。

現状、DBにあるテーブルすべてに作用するので、便利といえば便利なんですよ。

必要な分ビューを作って、Where文の必要な箇所のみを入力させる予定です。

この辺もきっとノウハウが必要なんでしょうね。


3 ● deflation
●20ポイント

現状閉ざした状態なので、SQLインジェクションは後から考慮したいと思います。

本当に始めて作るものなので、極力単純に勧めたいんです。

失礼ながら、その方針は間違っています。

便利だからセキュリティ対策は後回しにして、とりあえずプログラムが走るようにしようというのは間違いです。


自分以外の人間が利用可能な状況にあるシステムは、常にSQLインジェクション対策やXSS対策を施すべきです。

そしてこれらの対策はプログラムの根幹やフレームワークの使い方に及ぶ内容ですので、最初から設計に組み込んでおかないと、あとで対応することは非常に困難です。

◎質問者からの返答

ご指摘ありがとうございます。

現状、自分以外の人間が利用可能な状況にあるシステムでは無いため、後でいいかなぁと思いまして。

テスト用DBですし、ベーシック認証もかけてあるので。

しかしこれはかなり難しいですね。

商品名とか’入るものもありますし。

PHPのエラーメッセージもそのまま出ちゃうし。

当面は参照だけに絞って運用する予定です。


4 ● うぃんど
●40ポイント ベストアンサー

APIだからHTML形式で出力してはいけないというルールはありませんが、

他のシステムからの利用を考えるのであれば確かにJSONやXMLで出力するほうが「相手側が楽」ですね

だけれども、いろいろなシステムから使える汎用のもの(≒API)である必要性はありますか?

自分の作成したシステム内から使うつもりならば関数にしてしまえば良いと思いますし、

将来性と学習もかねてクラスとして実装してみても良いと思いますよ

【1】関数の例

関数は同一phpファイル内に書いても良いですが、

汎用性を持たせたいならば別ファイルにしておいたほうがいいですね

ここでは仮に別ファイルmssql.phpとします

ご自身が作られたものをベースにして書き足しただけのもので動作は未確認です

<?php
 function HTML_TABLE($query){
 $server = 'YourServer\sqlexpress';
 $userid = 'foo';
 $passwd = 'secret';
 $dbName = 'MyDatabase';

 $db = mssql_connect($server, $userid, $passwd);
 mssql_select_db($dbName, $db);
 $res = mssql_query($query, $db);

 while($row = mssql_fetch_array($res)){
 print(implode(",",$row) . "<br>\n");
 }

 mssql_free_result($res);
 mssql_close();
 }

使い方の例

<?php
 require_once 'mssql.php';
 HTML_TABLE("SQL文");
 $a = "SQL文";
 HTML_TABLE($a);

【2】クラスの例

ファイル名は仮にmssqlc.phpとする

MySQL用に自作して使っているものから抜粋してMSSQL向けに書き直しただけのもので動作未確認です

<?php
class MSSQL_DBI {
 protected $server = 'YourServer\sqlexpress';
 protected $userid = 'foo';
 protected $passwd = 'secret';
 protected $dbName = 'MyDatabase';
 protected $db = false;
 function __construct() {
 if ($this->db = mssql_connect($this->server, $this->userid, $this->passwd)) {
 if(!(mssql_select_db($this->dbName, $this->db))) {
 mssql_close($this->db);
 }
 }
 }
 function __destruct() {
 mysql_close($this->db);
 }
 public function HTML_TABLE($query){
 $res = mssql_query($query, $this->db);
 while($row = mssql_fetch_array($res)){
 print(implode(",",$row) . "<br>\n");
 }
 mssql_free_result($res);
 }
}

使い方の例

<?php
 require_once 'mssqlc.php';
 $db = new MSSQL_DBI;
 $db->HTML_TABLE("SQL文");
 $a = "SQL文";
 $db->HTML_TABLE($a);

【3】関数とクラスの比較

関数は簡単に作れますが色々な機能を追加していくうちに同じ名前がかぶってしまうこともあります

クラスの場合は上記の$db->のようにインスタンス単位となりますので、その心配はありませんし、

利用するクラスを変えるだけ($db = new MSSQL_DBIの部分)で、機能変更が可能なので、

環境に合わせたりバージョンアップしたりが楽になります(クラスを身に付けるにはちょっと練習が必要)

【4】セキュリティ

関数/クラスの側で行えば良いので後から改変することも容易ではありますが、

先に施しておくことを私も念押ししておきたいですね

◎質問者からの返答

ご回答ありがとうございます。

具体的な内容でたすかります。ちょうどドツボにハマッていまして。

いただいたものとしばらくにらめっこします。

セキュリティのご指摘ですが、何せ真面目にPHPに取り組んだのが昨日からでして、繋ぐだけで精一杯。

ソースとPHP入門サイトを往復してます。

これに対策施すにしても、もうちょっと把握しないとできなさそうですし、自分が読めなくなる可能性が…。

コピペしていじって…と把握している状態です。おかげでだんだん読めるようになってきましたが細かい部分はまだまだです。

FlashBuilderで扱えそうだからAPIにしたいと思いました。

参考本のサンプルになっていたツイッターAPIは難なく設定できました。

APIが作れればつながるんじゃないのか?と思いまして。

FlashBuilderの情報は全然見つけられないのですが、PHPの情報は大量にあるので、こっち側から寄せてみようかと。

最終的に社内で使うものは業者に依頼するつもりですが、調査という名目の勉強時間を楽しんでいるところです。

後ついでに、MSのSQLserver2000への接続についての情報はかなり少ないのですが、MySQLのソースを書き換えると大丈夫みたいです。Mysql_?のyとsを入れ替えるだけでほとんどサンプルが動いてます。

きっと関数作る人も意識してたんでしょうね。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ