質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

366閲覧

【PHP】配列についての処理がうまくいきません

taishi_idea

総合スコア27

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2017/10/12 11:08

編集2017/10/12 12:17

お手上げなので質問させていただきました。boketeという画像で大喜利をするサイトをphpの勉強がてらマネして作っています。
それで、下のようなコード3個を書きました。theme.phpで画像ファイルをアップロードさせて、画像をクリックするとclicktheme.phpにとんで、大喜利を入力して送信すると画像と入力した文字がセットでwarawara.phpに表示(新着一覧)されるようにしたいです。
上二つのコードは正常に動きましたが、三個目のコードの配列の処理がうまくいきません。for文で繰り返しているはずが、繰り返されません。おそらく配列に追加されてないのではないかと思いますが、理由もわかりません。
どなたか解決方法をご教授いただけましたら幸いです。

php

1//theme.php 2//-----------------------ここから下の点線までファイルアップロードの処理です-------------------------------- 3 <?php 4 $msg=null; 5 6 if(isset($_FILES["image"])&& is_uploaded_file 7 ($_FILES["image"]["tmp_name"])){ 8 $old_name=$_FILES["image"]["tmp_name"]; 9 $new_name=date("YmdHis"); 10 $new_name .=mt_rand(); 11 switch (exif_imagetype($_FILES["image"]["tmp_name"])) { 12 case IMAGETYPE_JPEG: 13 $new_name .='.jpg'; 14 break; 15 case IMAGETYPE_GIF: 16 $new_name .='.gif'; 17 break; 18 case IMAGETYPE_PNG: 19 $new_name .='.png'; 20 break; 21 default: 22 header('Location: theme.php'); 23 exit(); 24 } 25 if(move_uploaded_file($old_name,'album/' . "$new_name")){ 26 $msg="アップロードしました"; 27 } 28 else{ 29 $msg="アップロードできませんでした"; 30 } 31 } 32 ?> 33 <?php 34 static $images = array(); 35 36 if($handle=opendir('./album')){ 37 while ($entry=readdir($handle)){ 38 if($entry != "." && $entry != ".."){ 39 $images[]=$entry; 40 } 41 } 42 closedir($handle); 43 } 44 ?> 45//------------------------------------------------------------------------------ 46 <form action="theme.php" method="post" enctype="multipart/form-data"> 47 <input type="file" name="image" accept="image/*"> 48 <input type="submit" value="アップロード"> 49 </form> 50 51 <?php 52 if($msg){ 53 echo "<p>" . $msg . "</p>"; 54 } 55 //アップされたファイルをrsortで新しい順にします。 56 rsort($images); 57 if(count($images)>0){ 58 foreach($images as $id=>$img ){ 59 echo '<a href="/clicktheme.php?id=' . $id . '"><img class="themeimg" src="./album/' . $img .'"></a>'; 60 } 61 }else{ 62 echo "<p>画像はまだありません</p>"; 63 } 64 ?>

php

1//clicktheme.php 2 <?php 3//theme.phpの関数を使えるようにします。 4 ob_start(); 5include "theme.php"; 6ob_end_clean(); 7//クリックした画像のキーを取得して配列の番号として[]に入れて、画像のurlを取得して、画像を表示させます。 8 $array_number = $_GET['id']; 9$img_url = $images[$array_number]; 10echo '<img width="650px" src="./album/' . $img_url .'"><br>'; 11 ?> 12 13 <form action="/warawara.php" method="get" enctype="multipart/form-data"> 14<!--$img_urlをwarawara.phpへ送ります--> 15 <input type="hidden" name="id" value="<?= $array_number ?>"> 16<textarea name="boke" maxlength="80" placeholder="ボケを入力してください。" rows="10" cols="80" style="border-top:1px solid red"></textarea><br> 17<input type="submit" value="ボケる" class="submit"> 18 </form>

php

1//warawara.php 2<?php 3//clicktheme.phpとtheme.phpの関数を使えるようにします 4ob_start(); 5 include "clicktheme.php"; 6 include "theme.php"; 7ob_end_clean(); 8//配列を用意し、画像のurlをその配列に追加していきます 9 $img_url=$images[$array_number]; 10 $img_urlandboke=array(); 11 $img_urlandboke[]=$img_url; 12//配列を用意し、ユーザーが打ち込んだ文字をゲットで取得し、その配列に追加していきます。 13 $bokearray=array(); 14 $boke=$_GET["boke"]; 15 $bokearray[]=$boke; 16 17echo '<div class="themeandboke">'; 18//問題の部分です。 19//配列を新しい順で表示したいので、配列の中の値の個数→0になるようにfor文で画像と文字を繰り返し表示させます。 20for($i=count($img_urlandboke)-1;$i>=0;$i--){ 21 $afterboke=$img_urlandboke[$i]; 22 echo '<img width="250px" src="./album/' . $afterboke .'"><br>'; 23 echo $bokearray[$i]; 24 echo '<a href="#.php?id='.$i.'"></a>'; 25}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

  • "theme.phpで画像ファイルをアップロードさせて" → できてますよね?
  • "画像をクリックするとclicktheme.phpにとんで" → できてますよね?
  • "大喜利を入力して送信すると画像と入力した文字がセットでwarawara.phpに表示される" → できてますよね?

なにがうまくいっていないのでしょう…??


$img_url=$images[$array_number]; で配列の中からキーが $array_number である要素1つを取り出して、それを for で回しているのですから1回しかループしないのは当たり前だと思うのですが?

そもそもアプリとして、ユーザーが1つの画像に対し入力した1つのコメントを表示するページで、他の画像?コメント?を表示する意味・方法がわかりません。


あと、このアプリはユーザーが入力したコメントをそのまま表示しています。これはXSSという攻撃が可能な脆弱性(セキュリティ上の問題)を含んでいます。

入力値は htmlspecialchars 等を使って正しく表示されるように心がけて下さい。

投稿2017/10/12 11:47

miyahan

総合スコア3095

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

taishi_idea

2017/10/12 12:13

回答ありがとうございますm(_ _)m説明不足でした。warawara.phpは新着のような役割にしたくて、新着一覧を表示させるためにfor文をつかいました。 配列にどんどん追加されていくと思ったのですが、そのような処理はしないんですね。clicktheme.phpに追加の処理を記述するということですかね?
taishi_idea

2017/10/12 12:15

あと、セキュリティについても記述してくださりありがとうございますm(_ _)m htmlspeacialcharsの使い方を調べてみようと思います。
miyahan

2017/10/12 12:25

>配列にどんどん追加されていく あー、ユーザーが投稿したコメントを並べたいということですか? 配列を含め「変数」はあくまでPHPプログラム内で使われる一時的な情報です。ユーザーに応答を返してプログラムを終了したのと同時に消滅します。それを保存したいのであれば、画像ファイルと同じようにテキストファイルとして保存したり、より高度な方法としてデータベースに保存したりする必要があります。
taishi_idea

2017/10/12 13:45

データベースですか!忘れてました。 データベースは後回しにしていましたが、今こそ勉強するべきときですね。 ありがとうございましたm(_ _)m解決しそうです!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問