スレッド表示 | フラット表示〕 全トピック 920 件中 618 番目 次≫ ≪前

複数行表示と削除

created: 2004-05-07 10:16 | modified: 2004-05-09 17:50 | reply: 15

[1554] 複数行表示と削除

user: ダックス | created: 2004-05-07 10:16
申し訳ございませんが、どなたか教えて下さい。
このようなHTMLファイルからPHPファイルへ送信した時に、1行目を押せばまずPHPファイルには"123"と表示されるのですが、
次にもう一度、HTMLファイルから今度は2行目を送信すると最初の"123"が消えてしまって、"456"に書き換えられてしまいます。
これを、送信先のA.PHPファイルに複数行表示できるようにして、さらにどの行でも任意に削除できるようにするには、後何をつけ加えれば
良いのでしょうか。
大変に初歩的な質問なのかもしれませんが、当方今の所、お手上げ状態です。
どうかよろしくお願いいたします。

---INDEX.HTML---

<HTML>
<HEAD>
<TITLE>PHP</TITLE>
</HEAD>
<BODY>

<FORM ACTION="A.PHP" METHOD="POST">
123<INPUT TYPE="HIDDEN" NAME="ABC" VALUE="123"><INPUT TYPE="SUBMIT" VALUE="送信">
</FORM>

<FORM ACTION="A.PHP" METHOD="POST">
456<INPUT TYPE="HIDDEN" NAME="ABC" VALUE="456"><INPUT TYPE="SUBMIT" VALUE="送信">
</FORM>

</BODY>
</HTML>


---A.PHP---

<?PHP
<?=ABC?>
?>
reply: 1555 返信 編集 削除

[1555] 保存しとかないと

user: ゆうじ | created: 2004-05-07 11:17
こんにちは。

A.PHP の実行を終えた時点で、
変数 $ABC の値はメモリ上から消えてしまってます。

$ABC の値を次のアクションまで保持したいのでしたら、
ファイルやデータベースに書き残すなり、
セッションやクッキーに保存することが必要です。



# A.PHP ですが、PHPタグの中にショートタグが入れ子になってます。
# 正しくはいずれか。
<?php
echo $ABC;
?>
<?=$ABC ?>
Parent: 1554  reply: 1556 返信 編集 削除

[1556] 具体的には、、、

user: ダックス | created: 2004-05-07 11:57
恐れ入ります。
早速にお返事いただきまして、大変ありがとうございます。
私も一応参考書は持ってはいるのですが、その解説の一体どの部分が、セッションやクッキーなのやら分からないのです。
またよろしければ、それらのデータを残す方法を教えていただけませんでしょうか。そして、表示上のデータを消去したりもできるのでしょうか。
Parent: 1555  reply: 1557 返信 編集 削除

[1557] 具体的には、

user: ゆうじ | created: 2004-05-07 15:35
ここはPHP教室ではありませんので、
PHPマニュアルくらいは自分で確かめましょう。
http://jp2.php.net/manual/ja/ref.session.php

やろうとなさっていることは、
いろんな要素がありすぎてここで説明できる情報量でありません。

なので、先に私なりの答えを書きました。
ここまでたどり着いてみてください。

# 動作確認してませんのでタイポがあるかもしれません。
# 動かないときはまたご報告下さい。

■index.html
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=Shift-JIS" />
</head>
<body>

<form method="post" action="a.php">
Mac<input type="hidden" name="pc" value="Mac" />
<input type="submit" value="送信" />
</form>

<form method="post" action="a.php">
Windows<input type="hidden" name="pc" value="Windows" />
<input type="submit" value="送信" />
</form>

<form method="post" action="a.php">
Linux<input type="hidden" name="pc" value="Linux" />
<input type="submit" value="送信" />
</form>

</body>
</html>

■a.php
<?php
// セッションを利用する場合のお約束
session_start();

// セッション変数'pc'が、存在する場合、
if(isset($_SESSION['pc'])) {

// 配列$session_pcを、セッション変数'pc'で、初期化する。
$session_pc = $_SESSION['pc'];
}
else {
// そうでなければ、
// 配列$session_pcを、空の配列で、初期化する。
$session_pc = array();
}


// POSTメゾット'pc'が、存在する場合、
if(isset($_POST['pc'])) {

// 配列$session_pcに、POSTメゾット'pc'の値と、同じ名前の添え字が存在する場合、
if(isset($session_pc[ $_POST['pc'] ])) {
// その変数を破棄する
unset($session_pc[ $_POST['pc'] ]);
}
else {
// そうでなければ
// その変数を、1で初期化する
$session_pc[ $_POST['pc'] ] = 1;
}

// 配列$session_pcを、セッション変数'pc'に保存
$_SESSION['pc'] = $session_pc;
}

// セッション変数'pc'の値を全てブラウザに表示
foreach( $_SESSION['pc'] as $pc ) {
echo $pc, '<br />';
}

// フォームに戻る為のナビゲーションも表示
echo '<br /><a href="index.html">戻る</a>';

?>

付録
http://www.hyuki.com/writing/techask.html
Parent: 1556  reply: 1558 返信 編集 削除

[1558] ありがとうございます。

user: ダックス | created: 2004-05-07 16:04
いただいたデータをそのまま、試してみましたら、以下のように表示されました。

Warning: Invalid argument supplied for foreach() in d:\users\theomak_com\a.php on line 30

私が使用しているサーバのPHP Versionは4.0.6です。
これは別に関係ないのでしょうか。
Parent: 1557  reply: 1560 返信 編集 削除

[1560] バージョンが原因

user: ゆうじ | created: 2004-05-07 17:17
関係大ありのようです。

PHPは発展途上のため、
1年も経つと言語仕様や関数の引数とか、ころっと変わります。
このエラーもその影響のようです。

スーパーグローバル変数の
$_SESSION や$_POST は、4.1.0以降で採用された書式なので、
$_SESSION['pc'] や $_POST['pc']がただの変数扱いとなってるようです。

$_SESSION を全て、

$HTTP_SESSION_VARS

$_POST を全て、

$HTTP_POST_VARS

それぞれ書き換えると直るかな?

おまけ:
http://jp2.php.net/manual/ja/language.variables.predefined.php
Parent: 1558  reply: 1561 返信 編集 削除

[1561] value値ではなく、

user: ダックス | created: 2004-05-07 18:08
数字の 1 が表示されます。
これで良いのでしょうか。
だだ、前画面で何度押しても、その数字は(増えずに)、一つ表示されるだけです。
Parent: 1560  reply: 1563 返信 編集 削除

[1563] 訂正

user: ゆうじ | created: 2004-05-07 18:30
まちがいました。
表示の際添え字を表示させる必要がありました。


// セッション変数'pc'の値を全てブラウザに表示
foreach( $_SESSION['pc'] as $pc) {
echo $pc, '<br />';
}

↑ここを、↓こう訂正

// セッション変数'pc'の添え字を全てブラウザに表示
foreach( $HTTP_SESSION_VARS['pc'] as $pc => $val) {
echo $pc, '<br />';
}
Parent: 1561  reply: 1569 返信 編集 削除

[1569] 再訂正

user: ゆうじ | created: 2004-05-08 03:16
うちのPCで動かしてみたら、
同じエラーが出ました。
実際に動かさないとダメですね。
失礼しました。

Windows2000 + PHP4.3.5 で、
以下のコードで動作確認が出来ました。

送信ボタンをクリックするたびに、
Mac、Windows、Linux、それぞれが、
表示されたり消えたりをくり返します。

■ test.php
<?php
// 環境に合わせセッション変数を保存するパスを設定
session_save_path('c:/tmp');
// セッションを利用する場合のお約束
session_start();
?>
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=Shift-JIS">
</head>
<body>

<form method="post" action="test.php">
Mac<input type="hidden" name="pc" value="Mac">
<input type="submit" value="送信" />
</form>

<form method="post" action="test.php">
Windows<input type="hidden" name="pc" value="Windows">
<input type="submit" value="送信" />
</form>

<form method="post" action="test.php">
Linux<input type="hidden" name="pc" value="Linux">
<input type="submit" value="送信" />
</form>
<hr>
<?
echo phpversion();

// セッション変数'pc'が、存在する場合、
if(isset($HTTP_SESSION_VARS['pc'])) {

// 配列$session_pcを、セッション変数'pc'で、初期化する。
$session_pc = $HTTP_SESSION_VARS['pc'];
}
else {
// そうでなければ、
// 配列$session_pcを、空の配列で、初期化する。
$session_pc = array();
}

// POSTメゾット'pc'が、存在する場合、
if(isset($HTTP_POST_VARS['pc'])) {

// 配列$session_pcに、POSTメゾット'pc'の値と、同じ名前の添え字が存在する場合、
if(isset($session_pc[ $HTTP_POST_VARS['pc'] ])) {
// その変数を破棄する
unset($session_pc[ $HTTP_POST_VARS['pc'] ]);
}
else {
// そうでなければ
// その変数を、1で初期化する
$session_pc[ $HTTP_POST_VARS['pc'] ] = 1;
}

// 配列$session_pcを、セッション変数'pc'に保存
$HTTP_SESSION_VARS['pc'] = $session_pc;
}

// 配列$session_pcをの値を全てブラウザに出力
foreach( $session_pc as $pc => $val ) {
echo $pc, '<br />';
}
?>
</body>
</html>
Parent: 1563  reply: 1571 返信 編集 削除

[1571] 4.0.6

user: ダックス | created: 2004-05-08 09:24
以下のような、エラーが出てしまいます。
4.0.6では、技術的に不可能なのでしょうか。

4.0.6
Warning: open(c:/tmp\sess_2cdadc9804a6f66eba236fceb9ffd73a, O_RDWR) failed: m (2) in Unknown on line 0

Warning: Failed to write session data (files). Please verify that the current setting of session.save_path is correct (c:/tmp) in Unknown on line 0
Parent: 1569  reply: 1572 1574 返信 編集 削除

[1572] c:\tmp をつくれば良い

user: ゆうじ | created: 2004-05-08 12:48
> 以下のような、エラーが出てしまいます。
> 4.0.6では、技術的に不可能なのでしょうか。

不可能ではありません。

サンプルコードは、
PHP4.0.6で使えない関数や書式は直し
コードを書いたつもりです。

不可能かな?と思う前にマニュアルを見れば、
サンプルコードが4.0.6に対応するコードであるかどうか判断できるはずです。
PHP教室ではないので、
最低限自分でできることは自分でしましょう。



本題:
セッションでは、
サーバコンピュータにファイルを作成し、
その中に値を保存してあります。

session.save_path は、
このファイルを作成する場所を示してるのですが、
これが無いようです。

c:/tmp

このフォルダを作れば、
エラーは回避されるはずです。
Parent: 1571  返信 編集 削除

[1574] 追記

user: ゆうじ | created: 2004-05-08 16:27
もしかするとご使用中のサーバはLinuxでしょうか?

[1569]最訂正 の↓この行、

session_save_path('c:/tmp');

うちのローカルPCが、
Windowsで、且つphp.iniを訂正してないため
必要あって書いてますが、

すでにセッションが利用可能な環境ならば
記述する必要は無いかもしれませんし、

また、Linux系ならば、
Linux系のパスの書き方に直さないと。

/tmp とか。
Parent: 1571  reply: 1576 返信 編集 削除

[1576] session_save_path('c:/tmp');

user: ダックス | created: 2004-05-08 21:40
ありがとうございます。

上の記述を消去すれば、エラーが表示されずにvalue値を送る事ができました。
ただ、私の最初の希望であった複数行表示にはなりませんでした。
例えば、Windowsを3回押せば、表示も3行にくり返して表示され、また選択された項目を消去するとかです。
Parent: 1574  reply: 1578 返信 編集 削除

[1578] 見本はありますか?

user: ゆうじ | created: 2004-05-09 01:32
> Windowsを3回押せば、表示も3行にくり返して表示され、また選択された項目を消去するとかです。

思ってた物とずれがあったようですね。
失礼しました。

どのような機能が必要なのか残念ながら想像つきませんので
どこかに似た機能を持つサイトがあるようでしたら、
URLおしらせください。
Parent: 1576  reply: 1581 返信 編集 削除

[1581] これなんてどうですか(改)?

user: シロウ ホームページ | created: 2004-05-09 09:07
PHP.ringでお世話になっております。
ゆうじさんの親切さには心を打たれます。

これなんてどうですか?

select.html
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=Shift-JIS" />
</head>
<body>
<form method="post" action="stack.php" target="stack">
<select name="push">
<option value="123">123</option>
<option value="456">456</option>
<option value="789">789</option>
<option value="ABC">ABC</option>
</select>
<input type="submit" value="送信">
</form>
</body>
</html>

stack.php
<?php
/* セッションの開始を宣言 */
session_start();

function print_stack($push){
/* グローバル宣言 */
global $HTTP_SESSION_VARS;

/* 保存用の配列を初期化
セッションデータが空の場合にはarray()により
初期化を行います。*/
$stack = empty($HTTP_SESSION_VARS['stack']) ? array(): $HTTP_SESSION_VARS['stack'];

/* $pushの中身を配列の最後に追加 */
if (!empty($push)){
array_push($stack,$push);
}

/* 配列の中身を表示する */
foreach ($stack as $value){
echo '<input type="checkbox" name="column[]" value="'.$value.'" checked>';
echo $value.'<br>';
}

/* 加工した配列をセッションに保存する */
$HTTP_SESSION_VARS['stack'] = $stack;
}
?>
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=Shift-JIS" />
</head>
<body>
<form method="post" action="<?php $PHP_SELF;?>">
<?php print_stack($HTTP_POST_VARS['push']); ?>
<input type="submit" value="送信">
</form>
<pre>
<?php print_r($HTTP_POST_VARS['column']); ?>
</pre>
</body>
</html>
Parent: 1578  reply: 1582 返信 編集 削除

[1582] ありがとうございます。

user: ダックス | created: 2004-05-09 17:50
試させていただきました。
項目が追加表示される事に感動します。
私の最初の希望がうまく伝わらずに、申し訳ございませんでした。
要は、複数のhtmlページにある選択したい各項目を、一つのphpページに追加しながら表示していき、そこから不必要な項目を "後で任意に" 削除でき、最終的に一括でメール送信したいという事です。
まず、教えていただいたプログラムをhtmlとphpファイルに分離したいのですが、<form action="<?php echo $PHP_SELF; ?>">を<form action="xxx.php">にしたら、また追加表示ができなくなってしまいました。
Parent: 1581  返信 編集 削除
スレッド表示 | フラット表示〕 全トピック 920 件中 618 番目 次≫ ≪前
ページの一番上へ
Googleグックマークに登録 Yahooグックマークに登録 livedoorクリップに登録 @niftyクリップに登録 はてなブックマークに登録 deliciousに登録 Buzzurlに登録 FC2ブックマークに登録
最近更新された掲示板トピックス
管理人Blog
Yahoo Search

最近更新したNote
PHPマニュアル
今日のブックマーク
PHPマニュアル関数検索
関数名を入力し検索ボタンをクリック↑