phpでapiをつくってみたいっす。

こんばんわ。

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

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

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

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

回答の条件
  • 1人2回まで
  • 13歳以上
  • 登録:2010/11/29 05:04:05
  • 終了:2010/11/29 23:30:48

ベストアンサー

id:windofjuly No.4

うぃんど回答回数2625ベストアンサー獲得回数11492010/11/29 16:17:45

ポイント40pt

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】セキュリティ

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

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

id:kia_44

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

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

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

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

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

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

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

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

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

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

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

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

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

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

2010/11/29 16:54:34

その他の回答(3件)

id:niwa-mikiho No.1

niwa-mikiho回答回数508ベストアンサー獲得回数382010/11/29 07:49:53

ポイント40pt

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 を作るうえで重要なのは、


呼びやすさ


かと思います。

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

id:kia_44

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

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

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

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

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

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

2010/11/29 11:58:01
id:deflation No.2

deflation回答回数1036ベストアンサー獲得回数1262010/11/29 10:17:10

ポイント20pt

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インジェクション処理を施しましょう。

id:kia_44

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

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

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

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

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

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

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

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

2010/11/29 12:06:20
id:deflation No.3

deflation回答回数1036ベストアンサー獲得回数1262010/11/29 12:22:02

ポイント20pt

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

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

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

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


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

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

id:kia_44

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

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

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

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

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

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

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

2010/11/29 13:14:39
id:windofjuly No.4

うぃんど回答回数2625ベストアンサー獲得回数11492010/11/29 16:17:45ここでベストアンサー

ポイント40pt

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】セキュリティ

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

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

id:kia_44

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

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

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

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

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

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

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

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

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

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

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

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

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

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

2010/11/29 16:54:34
  • id:kia_44
    環境ですが、PHPは5。SQLsarver2000に接続してます。
    今回必要なのはこれぐらいでしょうか。
  • id:windofjuly
    うぃんど 2010/11/29 17:30:22
    私の回答はHTML出力のままなので、XMLやJSONでの出力は下記部分の書き換えが必要になります
    while($row = mssql_fetch_array($res)){
    print(implode(",",$row) . "<br>\n");
    }
     
    ツイッターAPIを使ったことがあるということなので以下XMLを対象とします
    データベースの項目が不明なので、
    下記では書籍を対象にして管理IDと著者名とタイトルだけを出力するようにしてます
     
    前述の3行を例えば下記のような具合にします
    echo "<?xml version="1.0" encoding="UTF-8"?>";
    echo "<books>";
    while($row = mssql_fetch_array($res)){
    echo '<book>';
    echo '<id>' . $row['id'] . '</id>';
    echo '<author>' . $row['著者フィールド'] . '</author>';
    echo '<title>' . $row['タイトルフィールド'] . '</title>';
    echo '</book>';
    }
    echo "</books>";
     
    XMLの書き方は1つではなく複数ありますが上記のように項目別に分かれているほうが多分扱いやすいでしょう
    文字コードに関してはMSSQLなのでShift-JISで出力されているかもしれません
    (SQLServerの実験環境は用意できないので確認できません。すみません)
     
    php用のXML処理系を追加インストールして用いればさらに細かく色々できるのですが、
    まずはxmlを出力するということを体験するところからはじめてみてください
  • id:kia_44
    windofjulyさんありがとうございます。
    現在、XML_Serializerとやらをいじっているのですが、なかなかうまくいきません。
    Pashでこけてる感じなんですが。
    教えていただいた方法で実際に一つ一つ設定してあげるのがだたしいんでしょうね。
    ちょっといじってみたいと思います。
  • id:windofjuly
    うぃんど 2010/11/30 01:40:05
    ただしいとは言いませんが、仕組みを理解したほうが後々が楽だと思いますので提案しました
     
    さて、XML_Serializerがうまくいかないということですが、多分どちらかが問題ではないかと思います
     
    (1)PATHでこけているならPEARのインストールに問題があるのかもしれないです
    serializer.phpのコピーだけでは動かないはずです
    参考にしたサイトを読み直してみてください
    下記は慣れないと読みづらいかもしれないですがPEARの公式マニュアルです
    http://pear.php.net/manual/ja/installation.php
     
    (2)parceでこけているなら配列がXML_Serializerで扱えるようになっていないのかもしれないです
    アバウトに直接書きますが下記のような流れになります
    $serializer = new XML_Serializer(オプション);
    $xmldata = array( "item" => array() );
    while( $row = mssql_fetch_array($res) ){
    array_push( $xmldata['item'], $row )
    }
    if ( ( $serializer->serialize($xmldata) ) === true ) {
    echo $serializer->getSerializedData();
    }
    オプションの指定を飛ばしてたりするのかもしれないので参考にしているページを良く見てください
     
    以下、半分は愚痴のようなものですが「SQLServerにはXML出力する機能があるのに、
    php側に受け取る仕組みが用意されてないために使えない」というのが至極面倒ですね
    SQLServerならば情報の多いasp(VBScript)に転向するのも手かもしれないです
    http://msdn.microsoft.com/ja-jp/library/cc364061.aspx
    以前質問しておられたようにFLASHスクリプトでSQLServerを直接叩くという手もありますけど、
    ID/パスワードをネットワーク上に垂れ流すことになるので、この手はそもそも無しなんですよね
    家庭内で個人的に使ってるだけならいいかもしれませんけど、
    今回のようなワンクッションは必須だと思っておいたほうがベターです
    何かと大変でしょうけど、試験的なものということで、無理せず適度にがんばってください
  • id:windofiuly
    質問者様のスキルはかなり低いようです。
    クライアントPCがインターネットに接続できることは、すなわちイントラネットではないということです。
     
    「こんばんわ」「みたいっす」など、そもそも日本語のスキルが低いのですね。
    もう一度小学校からやり直した方がよろしいかと存じます。
  • id:windofiuly
    余談ながら・・・
    回答1は概念論に終始するだけで、具体的な回答になっていません。
     
    回答2,3はググる能力しかなく、実際にプログラミングの経験がない人間の回答です。
     
    こうした悪質回答者に回答させないために、「不適切な回答」にチェックを入れ、今後回答されないようにした方がよろしいかと存じます。
  • id:kia_44
    windofiulyさんコメントありがとうございます。
    windofjulyさんにそっくりなIDなんて奇遇ですね。

    ご指摘の件、今回はヒントくださいなんでOKでしょう。
    REST XML-RPC SOAPって何だろ?と、きっかけになりました。
    PHP初心者ですからキーワードだけでもきければ調べる範囲も使えるキーワードも広がります。
    同様に、概念だけでもありがいものです。
    何せ初心者ですからググるのも時間かかって大変です。
    回答から得られるものは内容だけではなく、文章に使われたキーワードも十分価値のあるものだと思います。
    それがきっかけで答えが見つかることもありますから。

    確かに、「こんばんわ」が2行目に書いてある。不思議です。きっと眠かったんです。

    >クライアントPCがインターネットに接続できることは、すなわちイントラネットではないということです。
    違うでしょう。

    >こうした悪質回答者に回答させないために、「不適切な回答」にチェックを入れ、今後回答されないようにした方がよろしいかと存じます。
    残念ながらコメント欄にはその機能がないんですよ~。

    せっかくコメントをいただいたのですが、何を伝えようとしてくれたのかわかりませんでした。
    理解できずごめんなさい。
  • id:kia_44
    windofjuly さん
    細かいところまでフォローありがとうございます。
    勉強時間を奪われてしまい中途半端で止まってしまいました。
    aspも考えたんですが、たしかIISでしか動かないですよね。

    方向性として、できる限りMS依存の状態を変えていきたいと考えています。
    規模を広げるたびにライセンス料が出るのがもったいなくて。
    開発のコストを下げる意味も含めてPHPに持ち込めないかなと思ってました。

    会社の基幹システムがかなり古く(VB6で構築)、リモート接続で動かしてる状態なんです。
    WindowsXPもなくなりますし、環境を維持するのもめんどくさくなりそうに感じています。
    幸いリモート接続なのでWindows7でもOKでしたが、いつ使えなくなるか分からないのは不安です。
    そもそもサーバー側のプログラムが動かなくなったら作り直しです。
    ダウングレードできるといっても期限はあるでしょう。

    データベースの移行なども視野に入れつつ、現状打てる手を考えた結果、
    FLASH/FLEXに持ち込めればAIRでローカルプログラムとしても動かせるだろうと思いつきまして。
    素直に.NETにするのも考えてはみました。

    とりあえずWEB側に持ち込めれば、新しい手が考えられるんです。

    システム屋さんに聞いてみたところ、どうもWEBへの移行に自信がないとのこと。
    実績がないわけじゃないが、正直得意分野ではないそうです。そりゃそうでしょうね。

    ためしにWEB屋さんにこの話をしてみたところ、ざっくりとした見積もり金額だけでも3倍ぐらい安かったんです。
    (.NETとAJAX+PHPを比べた形)
    システム屋さんに比べて、業務システムを開発をしたことがないので小さくいってしまったのかも知れませんが。
    基本的にデータの出し入れができればOKなんですよね。後は入力や出力などの効率。
    言語が何でできてようがちゃんと動いてくれれば問題ないんです。

    と、長くなりましたが、バブル期に作った基幹システムの維持や拡張に悩んでる次第です。
    こんな中小企業結構あるんじゃないかな。

    ついでに、WEBならiPadなどのタブレットPCを使用して、
    飲食店で使用している注文用の端末代のように運用できないかなぁとも考えてます。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません