アプリ版:「スタンプのみでお礼する」機能のリリースについて

どうしてもエラーになってしまいます
どこが間違っているかお教え頂けませんでしょうか
宜しくお願い致します


$fp_i = fopen($indexphp, "w");
fwrite($fp_i, "<html>\n<head>\n");
fwrite($fp_i, "<title>title</title>\n");
fwrite($fp_i, "<meta http-equiv=\"content-type\" content=\"text/html; charset=Shift_JIS\">\n");
fwrite($fp_i, "</head>\n");
fwrite($fp_i, "<body>\n");
fwrite($fp_i, "<?php\n");
fwrite($fp_i, "$txt = 'test'\n");
fwrite($fp_i, "print'($txt)';\n");
fwrite($fp_i, "?>\n");
fwrite($fp_i, "</body>\n");
fwrite($fp_i, "</html>");

A 回答 (5件)

利用者によって内容を変える必要がないのであれば、copy でも問題ないでしょう。


その場合ですが、

> copy($file, ./$getuserID/$newfile)

これは、

> copy($file, "./$getuserID/$newfile");

とすれば動作します。

あとは、内容をユーザーに応じて書き変える場合についてですが、
質問者さんには難しすぎたようなのでもうちょっと簡単なコードで説明しておきます。
(ただし、No.4のコード自体はあまり難しいことはしていません。
あれが理解できないようでは今後のプログラム開発が前途多難です。
あのコードは理解できる程度には、PHPについて学習を進めた方がいいと思います。)

以下、単機能化してコメントを入れた、「template/index.php から $getuserID/index.php を作るコード」です。
template/index.php は、回答No.4で示したものを用意しておいてください。
それで、回答No3補足で示されたコードと同じものが出力生成されます。

---
// ファイル./template/index.php の内容を$dataに読み込む
$data = file_get_contents("./template/index.php");

// $data中の「%{getuserID}」という文字列を、変数$getuserIDの内容で置き換える
$data = preg_replace('/%{getuserID}/', $getuserID, $data);

// ファイル ./$getuserID/index.php に、$data を書き込む
$fp_i = fopen("./$getuserID/index.php", "w");
fwrite($fp_i, $data);
fclose($fp_i);
---

No.4の回答は、上述のコードを汎用的に使えるように関数化したものです。
このコードでも、preg_replace 行を追加していけば、
ユーザー毎に生成するファイルに対する内容置き換え項目の追加ができます。

この回答への補足

今回教えていただきました件で

>preg_replace 行を追加していけば、・・・

ということで下記1行追加してみました。

---
$data = preg_replace('/%{getuserID}/', $getuserID, $data);
$data = preg_replace('/%{getuserPASS}/', $getuserPASS, $data);
---

template/index.phpには下記追加しました。
---
print "<b>%{getuserID}さん%{getuserPASS}<br>".$year."/".$mon."月予定表</b><HR><table>";
---

しかし何も表示されませんでした。
アドバイスいただけますと助かります。

補足日時:2011/05/18 21:14
    • good
    • 0
この回答へのお礼

mtaka2様

今回のご指導いただきましたもので上手くいきました。
index.phpをschedule.phpに置き換えまして当初希望のことも無事完了できました。

超初心者の私にもよく分かるようご説明下さり感謝いたします。

スキルを上げるよう努力致します。

お礼日時:2011/05/18 12:09

> 新規登録のログインIDでディレクトリを作成しその中に別に作成してあります


> schedule.phpファイルを自動でコピーしたいと思っております。

そういうことでしたら、いわゆる「テンプレートエンジン」の考え方が近いかと思います。
以下のコードでどうでしょうか。

---ここから---
$indexsrc ="template/index.php";
$schedulesrc="template/schedule.php";

$conv = array( //会員ごとに置き換えを行う文字列を指定する
'getuserID' => $getuserID
);

convert($indexsrc, $indexhtml, $conv);
//convert($schedulesrc, $schedulehtml, $conv); //これでshcdule.php生成も可能

function convert($src, $dst, $conv)
{
$data = file_get_contents($src);
foreach ($conv as $name => $value) {
$data = preg_replace('/%{'.$name.'}/', $value, $data);
}

$fp_i = fopen($dst, "w");
flock($fp_i, 2);
fwrite($fp_i, $data);
flock($fp_i, 3);
fclose($fp_i);
}
---ここまで---

template/index.php を読み込んで、「%{getuserID}」という文字列を、変数$getuserIDの値で置き換えて、$indexhtml に書き込む、というコードです。

template/index.php を
---ここから---
html>
<head>
<title>%{getuserID}</title>
<meta http-equiv="content-type" content="text/html; charset=Shift_JIS">
</head>
<body>
%{getuserID}<hr><br>
初期ページ。
</body>
</html>
---ここまで---
といった内容で作っておけば、これを元に $indexhtml が作成されます。

連想記憶配列 $conv の内容を修正すれば、他の文字列差替も追加できます。

また、schedule.php の生成についても、同様にベースとなるテンプレートファイルを作っておけば、
convert 関数の呼び出しだけで実現できます。

この回答への補足

ご教授ありがとうございます。

しかしながら私のスキルでは難しいようですので

$file = 'example.txt';
$newfile = 'example.txt.bak';
if (!copy($file, $newfile)) {
echo "failed to copy $file...\n";
}

のイメージで上記をテストしましたら同じディレクトリに「example.txt.bak」
が作成されました。

下記に書き換えましてテストしましたがこれはエラーでした
簡単にコピーする方法はないでしょうか?

$file = 'schedule.php';
$newfile = 'schedule.php';
copy($file, ./$getuserID/$newfile)

新規ログインIDは以下のように作成しております。
//ディレクトリを作成mkdir ( $getuserID , 0777);

以上宜しくお願い致します。

補足日時:2011/05/17 20:58
    • good
    • 0

補足について



> 別にs.phpをアップしておいてそれをコピーまたは代入するようにはできないでしょうか?

出来るか出来ないかといえば「出来る」が答えになりますが、その実現方法はいくつもあり、それぞれメリットデメリットがあります。

今の質問からは質問者さんが最終的に「何をしたい」のかが見えませんので、ちょっと回答しにくい質問です。

単に具体的なコードを断片的に示すのではなく、そのバックグランドにある「何をしたい」のかについて説明していただいた方が回答がつきやすいかと思います。

この回答への補足

説明が不十分で申し訳ございませんでした。

会員認証PHPを改良中ですが、
新規登録のログインIDでディレクトリを作成しその中に別に作成してありますschedule.phpファイルを自動でコピーしたいと思っております。

ログインID/.htaccess
    /.htpasswd
    /index.php
  /schedule.php

$indexhtmlを作成まではできていますのでこれを改良して
schedule.phpを書き出すことができないか試行錯誤しておりました。

//$indexhtmlを作成
$fp_i = fopen($indexhtml, "w");
flock($fp_i, 2);
fwrite($fp_i, "<html>\n<head>\n");
fwrite($fp_i, "<title>$getuserID</title>\n");
fwrite($fp_i, "<meta http-equiv=\"content-type\" content=\"text/html; charset=Shift_JIS\">\n");
fwrite($fp_i, "</head>\n");
fwrite($fp_i, "<body>\n");
fwrite($fp_i, "$getuserID");
fwrite($fp_i, "<hr><br>\n");
fwrite($fp_i, "初期ページ。\n");
fwrite($fp_i, "</body>\n");
fwrite($fp_i, "</html>");
flock($fp_i, 3);
fclose($fp_i);

fwriteでPHPファイルを書き換えてみましたが文法が長くエラーが出て
しまうためschedule.phpをそっくりコピーしてパスワードだけ共有させて
ログインID下にコピーできる方法をご教授いただけないかといった事でした。

うまく表現できませんが以上宜しくお願い致します。

補足日時:2011/05/17 17:50
    • good
    • 0

書き出したファイル側でエラーが発生するという意味ですよね?



8行目 # $の前に\。'の後に;
fwrite($fp_i, "$txt = 'test'\n");
  ↓
fwrite($fp_i, "\$txt = 'test';\n");

9行目 # $の前に\
fwrite($fp_i, "print'($txt)';\n");
  ↓
fwrite($fp_i, "print '('.\$txt.')';\n");

""内で$を残して起きたい場合には、$の前に\を記載しなければいけません。
書き出したファイルの中味を見ればどういう状況かわかるはずです。
    • good
    • 0

挙げられたコードそのものは問題無く動作しますけど、


どういう「エラー」になるのでしょうか?

それが判らないので推測になりますが、ちょっと気になった点をいくつか。
PHPファイルを生成・保存するコードに見えますが、

---ここから---
fwrite($fp_i, "$txt = 'test'\n");
fwrite($fp_i, "print'($txt)';\n");
---ここまで---
この部分、$txt は、生成側のコードとして変数展開されますので、
出力するPHPファイル内では
---ここから---
= 'test'
print'(';
---ここまで---
という内容になってしまいます。

そうではなく、生成PHPファイル内で変数$txtを使いたいのでしたら、$もクオートして

---ここから---
fwrite($fp_i, "\$txt = 'test';\n");
fwrite($fp_i, "print\"(\${txt})\";\n");
---ここまで---
にする必要があります。

(それと、
・上述の1行目では、文が;で終わってないので、;を追加
・上述の2行目では、シングルクオートで記述されているので変数展開されずそのまま「$txt」という文字列出力になるので、ダブルクオートに変更
・上述の2行目では、元のままだと「変数名$txt)」と誤認されるので、変数名は「txt」だと明示するために「${txt}」に変更
しています。

以上のコードで、
---ここから---
$txt = 'test';
print"($txt)";
---ここまで---
というPHPコードが出力されるようになります。

この回答への補足

ありがとうございました。無事表示できるようになりました。

PHPファイルを書きだそうと思いPHPが動くかのテストでしたが
fwriteで1行ずつ書いて行くには長いので
例えば別に
s.phpをアップしておいてそれをコピーまたは代入するようにはできないでしょうか?

補足日時:2011/05/17 16:15
    • good
    • 0
この回答へのお礼

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

今回は即座に的確なご回答いただき大変助かりました。

お礼日時:2011/05/17 16:16

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