【再質問22:00/AU不具合】ファイルの再編集方法と分割表示 - PHPプロ!Q&A掲示板

2615

  • 0P

【再質問22:00/AU不具合】ファイルの再編集方法と分割表示

質問日時 / 2010年3月10日 22:33 (最終編集:3月11日 22:03)    回答数 / 17件

Questioner:  chiebukurophp4  このエントリーをはてなブックマークに追加 

キーワード / キーワードが設定されていません

  1. 進行状況は最下部参照願いますm(__)m
  2. 宜しくお願い申し上げます。
  3.  
  4.  
  5. ■ファイルを自由に再編集
  6. ■テキストを分割表示
  7.  
  8.  
  9. <?php
  10. $file=file_get_contents("test.dat");
  11. $array=str_split($file2);
  12. $count=count($file);
  13. $text=$_POST["text"];
  14.  
  15. if($text){
  16. $fp = fopen ("$file","w+");
  17. fputs ($fp,"ここがわかりません");
  18. fclose ($fp);
  19. }
  20. echo<<<EOM
  21. <form action="./test.php">
  22. EOM;
  23. for($i = 0$i < $count$i++)){
  24. echo"<textarea name=\"ここがわかりません($text??)\">ここがわかりません($array??)</textarea>";
  25. }
  26. echo<<<EOM
  27. <input type="submit" value="変更">
  28. </form>
  29. EOM;
  30. ?>

test.datの内容を2文字ずつ分割にしてtextareaで表示させたいのですが、繰り返しの部分と、その内容を新しく保存する際の方法がわかりません。

例えばtext.datの内容が『あいうえおかきくけこ』だとします。
1文字ずつ分割して
forで繰り返しにします。
forの部分は、多分間違っています。
<textarea name="text">あい</textarea>
<textarea name="text">うえ</textarea>
<textarea name="text">おか</textarea>
<textarea name="text">きく</textarea>
<textarea name="text">けこ</textarea>

と分割して表示させて、内容を変更します。
仮に、『あ』→『か』に変更します。

<textarea name="text">かい</textarea>
<textarea name="text">うえ</textarea>
<textarea name="text">おか</textarea>
<textarea name="text">きく</textarea>
<textarea name="text">けこ</textarea>

になります。
これで保存すると、最後の$textだけが反映され、内容が『こ』だけになります。
多分配列を使うだろうとは、わかるのですが、分割した時に統一して保存するには、どうすればよいでしょうか??


凄く困っているので具体的にコードを埋めて下さると助かりますm(__)m
初歩的な質問ですみませんが、どうぞ宜しくお願い申し上げます。

なんとなく$text[]みたいにしてみたのですが、使い方がいまいちわからず、出来ませんでしたm(__)m

この質問への意見の募集は締め切られ、ポイントは既に配分されました。
意見を投稿することはできますが、ポイントを受け取ることはできません。



ツリー一覧

┣A01signal>>CODE <?php $file=file_get_contents("test.dat")
┃┗A01-1chiebukurophp4ご回答頂きありがとうございます。 お陰様でtextarea
┃ ┗A01-1-1signal$fp = fopen ("$file","w+"); これはおかしいと思
┃  ┗A01-1-1-1chiebukurophp4ご回答ありがとうございます。 初歩的な事だと思いな
┃   ┗A01-1-1-1-1signalprint $file;
┗A02magicflute2textareaに表示した事により、なんの強制力も働かなく
 ┗A02-1chiebukurophp4ご回答ありがとうございます。 具体的にどういう意味
  ┣A02-1-1magicflute2文字数制限の出来ないtextareaの値を編集し、保存し直
  ┃┗A02-1-1-1chiebukurophp4ご回答ありがとうございます。 基本の部分を知りた
  ┗A02-1-2shimixエスパーすると、 >>CODE $array=str_split($file
   ┗A02-1-2-1chiebukurophp4ご回答ありがとうございます。 まさにその通りです
    ┗A02-1-2-1-1chiebukurophp4結局本当にやりたい事が出来なくなりましたので、また
     ┗A02-1-2-1-1-1shimix最初のソースように >>CODE foreach($_POST['text']
      ┗A02-1-2-1-1-1-1chiebukurophp4ご回答頂きありがとうございます。 そうだったので
       ┗A02-1-2-1-1-1-1-1shimix>という事でファイルに保存する際にhtmlspecialcharts
        ┗A02-1-2-1-1-1-1-1-1chiebukurophp4ご回答ありがとうございます。 なんとなく意味は理解
         ┗A02-1-2-1-1-1-1-1-1-1slyman>>CODE $idx = 1; foreach($array as $t){ echo"<t

回答一覧

並び替え:

A01
answerersignal [3月10日 23:00]

  1. <?php
  2. $file=file_get_contents("test.dat");
  3. $array=str_split($file2);
  4. $count=count($file);
  5. $text=$_POST["text"];
  6.  
  7. if($text){
  8. $fp = fopen ("$file","w+");
  9. fputs ($fp,implode(''$text));
  10. fclose ($fp);
  11. }
  12. echo<<<EOM
  13. <form action="./test.php">
  14. EOM;
  15. foreach($array as $t){
  16. echo"<textarea name=\"text[]\">$t</textarea>";
  17. }
  18. echo<<<EOM
  19. <input type="submit" value="変更">
  20. </form>
  21. EOM;
  22. ?>
確認してないですが

この意見に回答する

ツリーへ TOPへ

A01-1
replyerchiebukurophp4 [3月10日 23:26] (最終編集:3月10日 23:27)

ご回答頂きありがとうございます。
お陰様でtextareaで分割までは出来たのですが、新しい内容にして保存しようとしても、更新されるだけで内容が変更されないのですが、これはどこを修正すればいいのでしょうか??
method="post"
を書き忘れていたので、書き足したのですが無理でした。
そもそもcountは使わないのですね。
勉強になります。
今一度宜しくお願い申し上げます。

  1. <?php
  2. $file=file_get_contents("test.dat");
  3. $array=str_split($file4);
  4. $text=$_POST["text"];
  5. if($text){
  6. $fp = fopen ("$file","w+");
  7. fputs ($fp,implode(''$text));
  8. fclose ($fp);
  9. }
  10. echo<<<EOM
  11. <form action="./test.php" method="post">
  12. EOM;
  13. foreach($array as $t){
  14. echo"<textarea name=\"text[]\">$t</textarea>";
  15. }
  16. echo<<<EOM
  17. <input type="submit" value="変更">
  18. </form>
  19. EOM;
  20. ?>

この意見に回答する

ツリーへ TOPへ

A01-1-1
replyersignal [3月10日 23:30]

$fp = fopen ("$file","w+");

これはおかしいと思わないのかしら?

この意見に回答する

ツリーへ TOPへ

A01-1-1-1
replyerchiebukurophp4 [3月10日 23:36] (最終編集:3月10日 23:42)

ご回答ありがとうございます。
初歩的な事だと思いながら何度見ても本気で、わかりませんm(__)m
その部分の何がおかしいのでしょうか??泣

→わかりました。。
$file1="test.dat";
$fp = fopen("$file1", "w+");

ですね。
凡ミスで本当にすみません。

ありがとうございましたm(__)m
凄く助かりました。
また宜しくお願い申し上げます。

この意見に回答する

ツリーへ TOPへ

A01-1-1-1-1
replyersignal [3月10日 23:42]

print $file;

この意見に回答する

ツリーへ TOPへ

A02
answerermagicflute2 [3月11日 00:34]

textareaに表示した事により、なんの強制力も働かなくなる。
余計な文字を追加されて、データは壊れるね。
仕様の再考をお勧めします。

この意見に回答する

ツリーへ TOPへ

A02-1
replyerchiebukurophp4 [3月11日 01:06]

ご回答ありがとうございます。
具体的にどういう意味でしょうか??
stripslashesを付ければよいでしょうか??

実際には、htmlがデータファイルに入っております。
どうかご教授願います。

この意見に回答する

ツリーへ TOPへ

A02-1-1
replyermagicflute2 [3月11日 01:54]

文字数制限の出来ないtextareaの値を編集し、保存し直す。
わざわざ2文字ずつ抜き出した意味がない。

> 実際には、htmlがデータファイルに入っております。
「2文字ずつ」というルールもどこかへ行ってしまった。

恐らく、データファイル(HTML)を、XMLとして扱う事が、
ベターな選択だと推測します。

以下が、正常に表示されない(XHTMLやXMLでない)なら、
データファイルを見直すか、泥臭くやるしかない。
  1. <?php
  2. $file = 'test.dat';
  3. libxml_use_internal_errors(true);
  4. if ( ($xml = simplexml_load_file( $file ) ) === FALSE ) {
  5.   libxml_clear_errors();
  6.   die( 'XHTML(XML)以外のデータは扱えません' );
  7. } else {
  8.   var_dump( $xml );
  9. }

この意見に回答する

ツリーへ TOPへ

A02-1-1-1
replyerchiebukurophp4 [3月11日 10:57]

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

基本の部分を知りたくて、簡単に説明したのが、逆にわかりずらくしてしまったようですね。

そういうやり方もあるのですね。
非常に参考になりました。

しかし、それでは、編集するには、どうすればいいのでしょうか??

この意見に回答する

ツリーへ TOPへ

A02-1-2
replyershimix [3月11日 09:26] (最終編集:3月11日 09:29)

エスパーすると、

  1. $array=str_split($file, 2);

というのは今現在のテスト用の記述であって、実際には(最終形としては)HTMLソースを適当なセパレータで区切るのではありませんか?

そういうことを書いておかないと(元のソースだけ読むと)「何これ?」ってなってしまうと思います。

2文字というのにinputじゃなくてtextareaを使うこと自体おかしいわけですし、マルチバイト文字のみのhtmlソースなんてあり得ないわけで(しかも全部2バイト限定)。asciiと日本語が入っているデータならstr_splitで分割しちゃマズイですしね。

この意見に回答する

ツリーへ TOPへ

A02-1-2-1
replyerchiebukurophp4 [3月11日 11:00]

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

まさにその通りです。

HTML文書がありまして、それを1000程度で区切ってtextareaで分割表示しています。
これを再編集して新しいデータだけを保存したいというのが今回の本当の質問でした。

携帯用サイトなので、分割表示にしなければ、再編集出来ないので、こういうやり方をご質問させて頂きました。

この意見に回答する

ツリーへ TOPへ

A02-1-2-1-1
replyerchiebukurophp4 [3月11日 12:00] (最終編集:3月11日 16:37)

結局本当にやりたい事が出来なくなりましたので、また質問させて下さい。
最終的に試行錯誤してみた結果、以下コードで再編集まで出来るようになりました。
しかし、文字化けがおきます。
  1. foreach($_POST['text'] as $value){
  2. $text=stripslashes($value);
  3. fputs($fp, $text);
  4. }
の部分を
  1. $text=stripslashes($_POST["text"];
  2. foreach($text as $value){
  3. $text=$value;
  4. fputs($fp, $text);
  5. }
とすると何故かエラーが出ます。

更にHTMLにtextareaが含まれていると勝手に閉じられてしまいファイルが壊れます。
これの対処法も教えて頂けると助かります。
\/等でエスケープしてみましたが、無理でした。


  1. <?php
  2. $step1=$_POST["step1"];
  3. $file="test.html";
  4. $file1=file_get_contents("$file");
  5. $array=str_split($file1500);
  6.  
  7. if($step1==1){
  8. $fp = fopen ("$file","w+");
  9. foreach($_POST['text'] as $value){
  10. $text=stripslashes($value);
  11. fputs($fp$text);
  12. }
  13. fclose ($fp);
  14. }
  15. echo<<<EOM
  16. <form action="./test.php" method="post">
  17. <input type="hidden" name="step1" value="1">
  18. EOM;
  19. foreach($array as $t){
  20. echo"<textarea name=\"text[]\" cols=\"20\" rows=\"5\">$t</textarea><br>";
  21. }
  22. echo<<<EOM
  23. <input type="submit" value="再編集">
  24. </form>
  25. EOM;
  26. ?>

この意見に回答する

ツリーへ TOPへ

A02-1-2-1-1-1
replyershimix [3月11日 17:20]

最初のソースように
  1. foreach($_POST['text'] as $value) {
  2.     fputs($fp, stripslashes($value));
  3. }
でいいと思います。stripslashesの引数は「文字列」ですから、配列を渡すとWarningになります(戻り値がありません)。

  http://php.net/manual/ja/function.stripslashes.php

>HTMLにtextareaが含まれていると勝手に閉じられてしまいファイルが壊れます。

  http://www.php.net/manual/ja/function.htmlspecialchars.php


(蛇足)
間違いなくmagic_quotes_gpcがonの環境なんですよね?普通はそれをチェックしてからstripslashesするので。

この意見に回答する

ツリーへ TOPへ

A02-1-2-1-1-1-1
replyerchiebukurophp4 [3月11日 17:43]

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

そうだったのですか、普段よくstripslashesを使うのですが、エラーになった事がなかったので焦りました。
配列は渡せないのですね。
そういった使い方をしていなかっただけのようです。
了解致しました。
一つ勉強になりました。

magic_quotes_gpcがonですm(__)m

やはりhtmlspecialchartsしかないですか。

という事でファイルに保存する際にhtmlspecialchartsにして保存して、読みだす時に、特殊文字を元の文字に変換し直して使おうと思います。

保存時に、エスケープ出来ないのであれば仕方ないですねm(__)m

なんとか、自由にファイルを編集出来るようになりました。
また問題が起きるような気がしますが、ひとまず皆さんありがとうございました。

凄くたすかりましたm(__)m
また宜しくお願い申し上げます。

この意見に回答する

ツリーへ TOPへ

A02-1-2-1-1-1-1-1
replyershimix [3月11日 17:57]

>という事でファイルに保存する際にhtmlspecialchartsにして保存して、読みだす時に、
>特殊文字を元の文字に変換し直して使おうと思います。

違う。何のためにhtmlspecialcharsを使うのか(自分が困ったんだよね)。保存するときはそのままでかまわない。textareaの中に展開する(編集用に表示する)ときだけhtmlspecialcharsを通して出力する。

編集フォームからPOSTされるときは(わざわざdecodeしなくても)元に戻っているので「そのまま」保存して「そのまま」使える。

この意見に回答する

ツリーへ TOPへ

A02-1-2-1-1-1-1-1-1
replyerchiebukurophp4 [3月11日 18:08] (最終編集:3月11日 22:34)

ご回答ありがとうございます。
なんとなく意味は理解致しました。

しかしながら、それとは、別に致命的な不具合を発見致しました。
name属性に[]を使うと一部の携帯では、正常に受け取れないという事を先程知りました。

http://pentan.info/mobile/au/form_array.html

$text[]はAU携帯では、使えないそうです。
試しに見てみたら、PCと違う値となりました。
全て最後のtextareaの値となっておりました。

  1. foreach($array as $t){
  2. echo"<textarea name=\"text[]\" cols=\"20\" rows=\"5\">$t</textarea><br>";
  3. }

ここをどのように修正すれば、良いのでしょうか??
[0][1][2]のようになればいいとの事でしたm(__)m
いまいち出来ないのですが、教えて頂けますと幸いです。
これさえ出来れば、多分機能すると思います。
宜しくお願い申し上げます。
  1. <?php
  2. $step1=$_POST["step1"];
  3. $file="test.html";
  4. $file1=file_get_contents("$file");
  5. $array=str_split($file1500);
  6.  
  7. if($step1==1){
  8. $fp = fopen ("$file","w+");
  9. foreach($_POST['text'] as $value){
  10. $text=stripslashes($value);
  11. fputs($fp$text);
  12. }
  13. fclose ($fp);
  14. }
  15. echo<<<EOM
  16. <form action="./test.php" method="post">
  17. <input type="hidden" name="step1" value="1">
  18. EOM;
  19. foreach($array as $t){
  20. echo"<textarea name=\"text[]\" cols=\"20\" rows=\"5\">$t</textarea><br>";
  21. }
  22. echo<<<EOM
  23. <input type="submit" value="再編集">
  24. </form>
  25. EOM;
  26. ?>

この意見に回答する

ツリーへ TOPへ

A02-1-2-1-1-1-1-1-1-1
replyerslyman [3月21日 02:17]

  1. $idx = 1;
  2. foreach($array as $t){
  3. echo"<textarea name=\"text".$idx."\" cols=\"20\" rows=\"5\">$t</textarea><br>";
  4. $idx++;
  5. }
とか

この意見に回答する

ツリーへ TOPへ

<<質問一覧へ



Pick Up Q&A

Q
動的なURLを静的に見せる方法
 このエントリーをはてなブックマークに追加 
A
普通に考えて、mod_rewrite でしょうね。 http://www.nishishi.com/blog/2006/01/mod_rewrite_url.html...

>>続きを読む

GETのままでは検索エンジンのロボットが拾ってくれなかったためにSEO対策として有効だと言われていますね。

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)