SSブログ

(罠)phpでクライアントとサーバーの間でテキストを自由にやりとりする [プログラミング]

 こんにちは。前回に続き,今日はphpでクライアントとサーバーの間でテキストを自由にやりとりすることを実現したいと思います。やはりいくつか罠にはまったもので,同様の罠にはまった方の参考になれば幸いです。 まずはtext_no_yaritori.htmlのプログラムコード。
<!DOCTYPE html>
<html lang="ja">

<head>
<meta charset="UTF-8">
<title>テキストノヤリトリ</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<script language="javascript">
var sepa = "V(^_^)V";
function download() {
    var contact_form_contents = {
        password : $('#password').val(),
        filename : $('#filename').val()
    };
    $.ajax({
        type: 'POST',
        url: 'download.php',
        cache: false,
        data: contact_form_contents,
        success: function(text){
            alert(text.substr(0, text.indexOf(sepa)));
            text = text.substr(sepa.length+text.indexOf(sepa));
            $('#textdata').val(text.substr(0, text.indexOf(sepa)));
        },
        error: function(){
            alert("通信失敗");
        }
    });
}

function upload() {
    var contact_form_contents = {
        password : $('#password').val(),
        filename : $('#filename').val(),
        textdata : $('#textdata').val()
    };
    $.ajax({
        type: 'POST',
        url: 'upload.php',
        cache: false,
        data: contact_form_contents,
        success: function(text){
            alert(text.substr(0, text.indexOf(sepa)));
        },
        error: function(){
            alert("通信失敗");
        }
    });
}
</script>
</head>

<body>
<br />
<form>
<p>
秘密の暗号:<input id="password" type="password" size="40">
</p>
<p>
テキストファイル名:<input id="filename" type="text" size="40">
</p>
<p>
<input type="button" onclick="download(); return false;" value="サーバーにあるテキストファイルの内容を下の窓に転写(注意:窓の内容は上書きされます)">
</p>
<p>
<textarea id="textdata" rows="20" cols="80"></textarea>
</p>
<p>
<input type="button" onclick="upload(); return false;" value="上の窓の内容をサーバーにあるテキストファイルに転写(注意:テキストファイルの内容は上書きされます)">
</p>
</form>
<br /><hr /><br />
</body>

</html>

 htmlファイルが多少長いので少しだけ解説しておくと,画面の上の方のボタンを押すとdownload.phpが,下の方のボタンを押すとupload.phpがそれぞれ呼び出されます。ただし,form要素の中でphpファイルを直接呼び出してしまうと,戻ってきた際に画面が変わってしまうため,jQueryのajax関数を用いてphpファイルを直接呼び出す工夫を行っています。なお,input要素のonclickの文字列の最後にreturn false;がついているのは,form要素に処理が飛ばないようにするためです。(ただし,今回のform要素にはactionが記述されていないため,なくても大丈夫かも知れません。)
 次にdownload.phpのプログラムコード。
<?php
$password = $_POST['password'];
$filename = $_POST['filename'];
$sepa = "V(^_^)V";
if($password != 'PASSWORD'){
    echo "秘密の暗号が一致しません".$sepa;
    exit;
}
echo "成功しました".$sepa.file_get_contents($filename).$sepa;
fclose(fopen($filename, 'r'));
exit;
?>

 短いプログラムコードの割にいろいろ不思議な処理を行っています。まず,$_POST引数はプログラムの先頭で拾っておかないと途中でなくなってしまうらしい。次に,phpファイルからの戻り値はecho出力のみですが,レンタルサーバーによっては末尾に余計な文字列がくっついてしまうため,$sepaをセパレータとしています。最後に,下の方に
fclose(fopen($filename, 'r'));

という一見無駄な処理がありますが,これはfile_get_contentsがしばしばファイルクローズをサボってしまうらしいので,苦肉の策です。
 最後にupload.phpのプログラムコード。
<?php
$password = $_POST['password'];
$filename = $_POST['filename'];
$textdata = $_POST['textdata'];
$sepa = "V(^_^)V";
if($password != 'PASSWORD'){
    echo "秘密の暗号が一致しません".$sepa;
    exit;
}
if(file_exists($filename)){
    fclose(fopen($filename, 'r'));
    unlink($filename);
}
$fp = fopen($filename, 'w');
flock($fp, LOCK_EX);
fwrite($fp, $textdata);
flock($fp, LOCK_UN);
fclose($fp);
echo "成功しました".$sepa;
exit;
?>

 phpファイルからの戻り値はdownload.phpと同様にecho出力のみのため,$sepaを間に挟んでhtmlファイル側で分割してもらうようにしています。なお,ファイルを置くフォルダのパーミッションを「777」にしておかなければなりません。おしまい。

参考: http://gomokuankake.com/2013/11/22/4652/
nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

※ブログオーナーが承認したコメントのみ表示されます。

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。