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

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

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

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

Q&A

解決済

2回答

2858閲覧

SESSIONで掲示板みたいにしたいのです。

akobayashi

総合スコア15

PHP

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

0グッド

0クリップ

投稿2017/11/16 11:16

編集2017/11/16 11:24

セッションで掲示板みたいにしたいのですが、
(現在セッションの配列について勉強中でして、自分だけが見られればOKです。以下は勉強のためのコードです)
フォームを送信したら配列の中身が上書きしてしまいます。
フォームに登録したら、次の配列を作り、下の掲示板では追加されるようにしたいです。
これはどうしたらよいでしょうか?

<?php session_start(); $name = htmlspecialchars($_POST['username']); $title = htmlspecialchars($_POST['title']); $email = htmlspecialchars($_POST['email']); $rororo = array($name,$title,$email); $_SESSION = $rororo; ?> <!DOCTYPE html> <html> <head> <title>FORM form</title> </head> <body> <form action="" method="post"> 名前:<input type="text" name="username"><br> タイトル:<input type="text" name="title"><br> メールアドレス:<input type="text" name="email"><br> <input type="submit" name="exe" value="送信じゃい!"> </form> /* 確認用 var_dump */ <?php echo '<pre>'; var_dump($_SESSION); echo '</pre>'; ?> <table> <tr> <?php $i = 0; if(isset($_SESSION)){ foreach($_SESSION as $koma){ echo '<td>'.$koma[$i].'</td>'; $i++; } } ?> </tr> </table> </body> </html>

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

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

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

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

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

yambejp

2017/11/16 11:19

セッションは書いた本人のそのブラウザでしか見えないですが大丈夫ですか?
akobayashi

2017/11/16 11:22

ああ、失礼しました追記します。掲示板はfile_get_contentsで基本しているのですが、今回はsessionの配列について勉強してまして、その一環で自分のプラウザで見れればOKです。すいません言葉足らずで。
akobayashi

2017/11/16 11:26

つまり掲示板云々というよりも、フォームからsession にどうすれば配列を追加できるかが知りたくて、うまく作動しないのでご質問させていたしました。
yambejp

2017/11/16 11:42

回答つけておきました。postのデータがこなければセッションを引き継ぎます
akobayashi

2017/11/16 11:43

ありがとうございます!とても詳しく書いて頂き嬉しいです。
yambejp

2017/11/16 11:45

挙動を確認して問題があれば指摘下さい。空欄のまま送信すれば空欄というデータがセッションに書き込まれるのでデータを削除したようにみえます
akobayashi

2017/11/16 12:17

挙動確認しました。上書きされてしまいました。sessionに配列を追加していきたかったんですが、一回入力すると前回のが消えて新しいのが上書きしてしまいます。どんどん配列を追加したくて……。間違っていたらごめんなさい。
guest

回答2

0

まず基本$_SESSIONをガバッと上書きするのはなしです
$_SESSIONは変数ではなく変数を置く場所です
どこでどんなモジュールなりプラグインなりが
ログイン情報なり認証キー置いたりするかわかりません
なので他の被りにくい変数名で格納するようにしましょう

php

1<?php 2session_start(); 3session_regenerate_id(); 4 5$name = htmlspecialchars($_POST['username']); 6$title = htmlspecialchars($_POST['title']); 7$email = htmlspecialchars($_POST['email']); 8$_SESSION['my_test_inputs'][]=compact('name','title','email'); 9?> 10 11/*略*/ 12 13<?php 14if(isset($_SESSION['my_test_inputs'])): 15foreach($_SESSION['my_test_inputs'] as $i=>$koma): 16extract($koma); 17?> 18<td> 19<h3><i><?=$i?></i><?=$title?><small><?=$name?></small></h3> 20<p><?=$email?></p> 21<? endforeach;endif; ?>

なんか自分好みの書き方にしちゃいましたが
phpは配列の扱いについていい加減な書き方しても
意図を汲んで動かしてくれるタイプのやつです

定義されてない変数を配列みたいにあつかったら
勝手に配列にしてくれるのでその辺は楽です

投稿2017/11/16 11:59

KazuhiroHatano

総合スコア7804

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

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

akobayashi

2017/11/16 12:02

なるほど……。なんか格好いいコードですね。ありがとうございます。
akobayashi

2017/11/16 12:12

$_SESSION = array(~,~,~);にせず $_SESSION['orignal_name'][] = の[]に入れなくちゃ駄目だったんですね。ありがとうございます!
guest

0

ベストアンサー

PHP

1 2<?php 3session_start(); 4$name = filter_input(INPUT_POST,'username'); 5$title = filter_input(INPUT_POST,'title'); 6$email = filter_input(INPUT_POST,'email'); 7if(!is_null($name)) $_SESSION['name']= $name; 8if(!is_null($title)) $_SESSION['title']= $title; 9if(!is_null($email)) $_SESSION['email']= $email; 10?> 11[ <a href="<?php echo $_SERVER["SCRIPT_NAME"];?>">リロード</a> ] 12<hr> 13<form action="" method="post"> 14名前:<input type="text" name="username" value="<?php echo htmlspecialchars($name);?>"><br> 15タイトル:<input type="text" name="title" value="<?php echo htmlspecialchars($title);?>"><br> 16メールアドレス:<input type="text" name="email" value="<?php echo htmlspecialchars($email);?>"><br> 17<input type="submit" name="exe" value="送信じゃい!"> 18</form> 19<?php 20echo '<pre>'; 21ob_start(); 22var_dump($_SESSION); 23$content=ob_get_contents(); 24ob_end_clean(); 25print htmlspecialchars($content); 26echo '</pre>'; 27?> 28<table border> 29<tr> 30<?php 31foreach($_SESSION as $val){ 32 echo '<td>'.htmlspecialchars($val).'</td>'; 33} 34?> 35</tr> 36</table>

完全修正版

PHP

1<?php 2session_start(); 3$del = filter_input(INPUT_GET,'del'); 4if(!is_null($del) and isset($_SESSION["data"]) and isset($_SESSION["data"][$del])){ 5 unset($_SESSION["data"][$del]); 6} 7if($del==="all" and isset($_SESSION["data"])){ 8 unset($_SESSION["data"]); 9} 10$name = filter_input(INPUT_POST,'username'); 11$title = filter_input(INPUT_POST,'title'); 12$email = filter_input(INPUT_POST,'email'); 13if(!isset($_SESSION["data"])){ 14 $_SESSION["data"]=[]; 15} 16if(!is_null($name)){ 17 $_SESSION["data"][]=["name"=>$name,"title"=>$title,"email"=>$email]; 18} 19?> 20[ <a href="<?php echo $_SERVER["SCRIPT_NAME"];?>">リロード</a> 21 | <a href="<?php echo $_SERVER["SCRIPT_NAME"];?>?del=all">全削除</a> ] 22<hr> 23<form action="<?php echo $_SERVER["SCRIPT_NAME"];?>" method="post"> 24名前:<input type="text" name="username"><br> 25タイトル:<input type="text" name="title"><br> 26メールアドレス:<input type="text" name="email"><br> 27<input type="submit" name="exe" value="送信じゃい!"> 28</form> 29<table border> 30<thead> 31<tr> 32<th>名前</th> 33<th>タイトル</th> 34<th>email</th> 35<th>-</th> 36</tr> 37</thead> 38<tbody> 39<?php 40foreach($_SESSION["data"] as $key=>$row){ 41 echo '<tr>'; 42 echo '<td>'.htmlspecialchars($row["name"]).'</td>'; 43 echo '<td>'.htmlspecialchars($row["title"]).'</td>'; 44 echo '<td>'.htmlspecialchars($row["email"]).'</td>'; 45 echo '<td><a href="?del='.$key.'">del</a></td>'; 46 echo '</tr>'; 47} 48?> 49</tr> 50</tbody> 51</table> 52<hr> 53<?php 54echo '<pre>'; 55ob_start(); 56var_dump($_SESSION); 57$content=ob_get_contents(); 58ob_end_clean(); 59print htmlspecialchars($content); 60echo '</pre>'; 61?> 62

投稿2017/11/16 11:36

編集2017/11/16 13:08
yambejp

総合スコア114747

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

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

yambejp

2017/11/16 12:50

仕様がなんとなくわかったので完全修正版をついきしておきました
akobayashi

2017/11/17 03:46

ありがとうございます!お手数をおかけして申し訳ありません!
akobayashi

2017/11/17 03:53

完璧でした!このコードを見て勉強させていただきます、ありがとうございます。
akobayashi

2017/11/17 04:09

filter_input調べました、安全に値を受け取るために重要なんですね。
yambejp

2017/11/17 04:14

> filter_input ・未入力のチェック ・型の指定 ・範囲の指定 ・その他バリデート ・エラー時のデフォルト指定 など、まじめにやると数行かけてやることを1関数でまとめてやることができます
akobayashi

2017/11/17 04:19

すごい便利ですね!使わせていただきます。
akobayashi

2017/11/17 04:52

削除ボタンも便利で凄いですね。自分GETの使い方もあやふやだったので勉強になります!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問