PHPの最近のブログ記事

写真ギャラリーサイトフォト蔵のAPIを使って見ようと思いましたが、残念ながらそのままでは検索結果はFlash内に持ってこれません。
これは、crossdomain.xmlによるもので、proxyをどうにかしなければ、解決はできません。

自分のサーバーへ下のPHPファイルを一つおき、これを通すことでFlash内に持ち込めるようになります。
今回はフォト蔵用ですが、その他いろいろな場合によって$urlの部分を書き換えて使うことができます。

下のファイルへのアクセスには、検索させたいパラメータもURLに含み、
http://ファイルのパス.php?keyword=さくら
とすると、さくらで検索してくれます。


<?php
$keyword =  $_GET['keyword'];
$limit = 10;
$url = "http://api.photozou.jp/rest/search_public";    

$url .= "?type=photo&keyword=".urlencode($keyword)."&limit=".$limit;

$photoxml = file_get_contents($url);
echo $photoxml;
?>

フォト蔵 フォト蔵 API
任意のファイル名でXMLファイルを作成、サーバー上に保存するなどのように、「domxml 」を使ったPHPは、PHP5になると動きません。


代わりにSimpleXMLを使って記述すればPHP5で動作しますが、既にPHP4で動くものを手早くPHP5に対応させるには、
http://alexandre.alapetite.net/doc-alex/domxml-php4-php5/index.en.htmlにある
Scripts for PHP4 domxml compatible with PHP5 domを利用させていただきました。

ここから、domxml-php4-to-php5.phpを引っ張ってきて、既にあるdomxmlを使ったPHPの頭に



//PHP//////////////////////////////////////////////////////////////////


if (version_compare(PHP_VERSION,'5','>='))
 require_once('domxml-php4-to-php5.php');


と記述して読込むことでPHPのバージョンを判定して、そのままPHP5で動作するように読み替えてくれます。
MacでPHPのテスト環境を構築しました。
MacOSXでは、OSにApacheが搭載されているので、これを利用することもできると思いますが、なにやらターミナルなどから設定していかないと行けないようなので、今回はXAMPPをインストールして利用してみました。
XAMPPは、ここからダウンロードしました。
ファイルは91.1MBありましたが、ダウンロードにはずいぶん時間がかかりました
ダウンロードしたら、インストーラーを立ち上げてインストールを進めます。
http://wwwwwww.com/xxx.php?userid=12345
のように、?以降で渡された値を取得して利用します。
今回の例では、useridはセッションIDとして利用しています。
もちろんこの先、FLASHにこの値を受け渡して、FLASH内で利用することもできます。

//php//////////////////////////////////////////////////////////////////
<?php
$userid = $_GET['userid'];
session_id($userid);
session_start();
?>
やっぱりどうせwebを作るなら、HTML-lintで100点!ということで、PHPで作っても、XML宣言ははずせません。
ただ、普通に
<?xml version="1.0" encoding="UTF-8"?>
と書いてしまうと、<?があるせいか、PHPだと思われて処理されてしまうので、PHP側でechoで宣言文を出力させて回避します。
下のような一文を、HTMLタグのはじめに来るように組みます。

//php//////////////////////////////////////////////////////////////////

<?php echo '<?xml version="1.0" encoding="UTF-8"?>'."\n" ?>
サーバー上の指定ディレクトリ内にあるファイルの一覧を取得できるものを作ります。

サーバーの指定ディレクトリ内にあるファイルの一覧を取得して、flashで全ファイルの一覧を表示させようと考えています。
そこで、手始めに、PHPで指定ディレクトリ内のファイル名を返してくる簡単なPHPを作ってみました。
下のソースを書いたPHPファイルをサーバー内に保存して、ブラウザでアクセスすると、ファイル名がズラーっと返ってきます

//php//////////////////////////////////////////////////////////////////

<?php
//ディレクトリ名
$res_dir = opendir( './フォルダ名/' );//./フォルダ名/に取得したいフォルダのパスを記述

//ディレクトリ内のファイル名を取得する
while( $file_name = readdir( $res_dir ) ){
    //取得したファイル名を表示させる
    print "{$file_name}\n";
}

//ディレクトリをクローズする
closedir( $res_dir );
?>
https://www.bute-studio.com/mt/mt-search.cgi?tag=echo&blog_id=5
のように、アドレスの後に?から続く文字列を使って変数を渡します。
これは、HTTPのGETメソッドのひとつで、渡される変数がわかりやすいです。
逆に言えば、変数に入っている値がバレバレなので、そのような場合には適しません。

変数の送る側では、<a>内に<a href="http://www...../xxx.php?id=00000">のように入れて送ります。
これは、固定であれば、そのままhtmlに入れることもできますが、今回私はセッションIDと連携させて、動的にIDを与えたかったので、
//送り側PHP//////////////////////////////////////////////////////////////////
$userid = mt_rand();//乱数を定義
session_id($userid);
...略...
<a href="http://www......./file.php?<? echo 'userid='.$userid ?>">

という形で、<a>の中に動的に変わるuseridが入るようにしました。
これを応用し、JavaScriptでwindow.openを使ってfunctionを定義し、それをFlashのGetURL()で呼んで使っています。
これにより、リンクを開いた際には、http://www......./file.php?userid=00000というアドレスに飛ぶようになります。


次に、受け取る側です。
こちらはいたって簡単。
PHPの、$_GET変数を使って受け取ります。


//受け取り側PHP//////////////////////////////////////////////////////////////////
$userid = $_GET['userid'];

これだけで、アドレスに付加されてきた?userid=012345という値があるとすると、$userid =012345と代入され、この後、PHPで自由に扱える値になります。





ファイルをアップする際に、規定サイズを超えるものは、規定サイズにリサイズし、それに満たないものは、そのままのサイズを保持して保存するシステムを作っているところです。

今回は、アップした画像が規定サイズと比べてどうかの判定を作りました。
getimagesizeデ、ファイルのサイズを取得し、事前に規定した$width,$heightと比較しています
printで出力している結果の部分に、リサイズする、しない場合の処理をあとで入れると、簡易的ですが完成しそうです。

//PHP//////////////////////////////////////////////////////////////////

//一時ファイル名を取得
$up_filename = $_FILES['up_filename']['tmp_name'];

//規定画像サイズを規定
$width = 300;
$height = 200;

list($org_width,$org_height,$org_type,$org_attr)=getimagesize($up_filename);
   
    if($org_width>$width || $org_height>$height){
        print "\tリサイズします";//リサイズする場合の動作をここに置き換える
    } else {
        print "\tリサイズなし";//リサイズしない場合の動作をここに置き換える
}
ユーザー固有のアドレスを持ったファイルを生成し、そのアドレスをメールで知らせる処理を作りました。
フラッシュ上で、送り先のアドレスなどを入力させ、送信処理をPHPで行いました。
フラッシュでの入力と、変数の内容のPHPへの受け渡しができました。
ただし、入力項目のチェック等は不十分なので、改善の余地ありです。


//ActionScript//////////////////////////////////////////////////////////////////
mail_btn.onRelease = function  () {
   
    send_ml = new LoadVars();
    load_ml = new LoadVars();
   
    send_ml.mailto_php = mailto;
    send_ml.mailfm_php = mailfm;
    send_ml.mailct_php = mailct;
    send_ml.mailsb_php = mailsb;
   
    load_ml.onLoad = function() {
    result = load_ml.mail_php;
    };
    send_ml.sendAndLoad("PHPファイル名.php", load_ml, "POST");
   
}

//PHP//////////////////////////////////////////////////////////////////

<?php

//言語設定
mb_language('Japanese');

//文字エンコーディング設定
mb_internal_encoding("UTF-8");

//セッションをスタート
session_start();

//useridをセッションIDから生成する
$userid = session_id();

//moviefileのアドレスを生成
$moviefile = "http://アドレス/ファイル名.php?userid=".$userid;


//送信先
$to = htmlspecialchars($_POST["mailto_php"]);

//送信元
$from = htmlspecialchars($_POST["mailfm_php"]);

//本文
$content = htmlspecialchars($_POST["mailct_php"]);

//件名
$subject = htmlspecialchars($_POST["mailsb_php"]);

//メール本文
$body = $moviefile."\n".$content;

//ヘッダー情報
$headers = "From: $from\nErrors-To: $from\nReturn-Path: $from";

//sendmail へのオプション -f
$option = "-f" . $from;

//メール送信
$send = mb_send_mail($to,$subject,$body,$headers,$option);

//送信終了後の処理
if($send == True){
print "送信完了";
}else{
print "送信失敗";
}
?>

今回、メールの送り先は
$to = htmlspecialchars($_POST["mailto_php"]);
となっていて、フラッシュから出力されたmailto_phpという変数を参照するようになっていますが、
一般的に使うメールフォームでは、送り先はそのお店のアドレスなど、一定なので、
$to = "abcd@domain.com";
とします。
このとき、abcd@domain.comは変数でなく、普通の文字列として扱うので、""で囲みます。

同じように、ほかの項目を追加するときは、ASで、
send_ml.hensuname = xxx;
のように、新たな変数を定義して、PHPで
//新しく受け取る変数
$atarashii = htmlspecialchars($_POST["hensuname"]);
のようにして、PHP内での変数$atarashiiに受け取ります。
PHPで、XMLを作成するものを作成しました。
作成されるXMLは、

<?xml version="1.0"?>
<id>
<x>xxx</x>
</id>

です。
ファイル名は、セッション名.xmlで保存されるようにしました。
このセッション名は、前の記事にあるように、乱数からとったセッションになっているので、この乱数=個々のIDとして、それぞれの設定値を保存するXMLファイルとしています。
このxxxの部分にフラッシュから、変数を送り、XMLを保存するようにする予定です。

//以下PHP//

<?php
session_start();
$xmlname = session_id().".xml";

    // 新規XMLドキュメントを作成
    $dom = domxml_new_doc("1.0");
    

$root = $dom->create_element("id");  // ルートとなる要素生成 (<html>タグ)
$root = $dom->append_child($root);
 
// <x>タグ生成
$x = $dom->create_element("x");
$x = $root->append_child($x);

// <x>タグの中にテキスト挿入
$text = $dom->create_text_node("xxx");
$text = $x->append_child($text);

    // 現在のディレクトリを取得し、xmlファイルのパスを設定
    $xmlfile = "upload/".$xmlname;

    // xmlファイルにDOMドキュメントの内容を書き出す
    $dom->dump_file($xmlfile);
?>

前回のやり方では、同セッション中に、別の画像をアップさせたい場合に、上書きされてしまいます。
 そのため、次のようにして、この問題を回避しました。
セッションIDをアクセスするたびに変数から取得し、この変数を
/upload.php?userid=679957896
の形で渡していく。

 もしくは、セッションIDなので、
session_start();
session_id();
で取得することもできる。

PHPで、セッションを定義する部分。
<?php
$userid = mt_rand();//乱数を定義
session_id($userid);
session_start();
?>
 
PHPで、aaa=セッションIDの変数を出力させる部分
<?php
session_start();
echo 'aaa='.session_id();
?>
 
フラッシュでは、変数名にaaaを入れたダイナミックテキストを配置すると、セッションIDがテキストエリアに読み込まれる。
これを使い、セッションID.jpgの名前でPHPから保存した画像を、フラッシュ内で
 
file = "../upload/"+ aaa + ".jpg"
_root.null_mc.loadMovie(file);

として、読み込むことができました。
<?php
$updir = "./upload/"; //ファイルのアップ先を指定
$kakucho = substr($_FILES['myfile']['name'],-4); //アップされた拡張子
$userid = session_id();
$newfile = $userid.$kakucho; //サーバーにアップされたファイル名を乱数と拡張子をセットして定義
$uppath = $updir . $newfile; //アップされたファイルのパス

 $rtn = @move_uploaded_file($_FILES['myfile']['tmp_name'], $uppath);

echo 'file='.$newfile;
?>

<img src="<? echo $uppath ?>">



//ここからAction Script(概略のみ)//
filename = file
null_mc.loadMovie(filename);

と、session_idを使ってみた。
でも、sessionが変わらない場合には、ファイルは上書きされてしまう。
けれど、まあ、システムとしては組めました。
価格.com ブロードバンド