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

更新時,確認ページにてプルタウンメニュー及びチェックボックスの受け渡

created: 2006-12-22 11:49 | modified: 2007-01-18 12:45 | reply: 12

[3503] 更新時,確認ページにてプルタウンメニュー及びチェックボックスの受け渡

user: しんのじ | created: 2006-12-22 11:49
以前プルタウンメニュー,チェックボックスの値渡しについて
投稿し大変勉強になったのですが・・・・
データベースの値から対象の項目を選び
入力フォームで一度データベース(MySQL)に登録したフィールドの値を更新する時, 確認ページを設けて更新させたいので。
確認ページに値を受け渡す場合,
フォームの「<input type="text">」 「<textarea>」については,
PHPの「mysql_fetch_array()」関数を使い受け渡す事ができましたが,
「<option>」 と 「<input type="checkbox"> 」の値の受け渡しのロジックがよく分かりません。
つまり, 登録している部分を「selected」で指定するやり方が
わかりません。ご存知の方宜しくお願いいたします。


私が考えたプログラムの流れ(テキスト,テキストエリア)
$host = "localhost";
$user = "root";
$pass = "root";

if(!$conn = mysql_connect($host,$user,$pass)){
echo "Can not Database !!!<br>\n";
exit;
}

mysql_select_db("test1", $conn);

$id = $_GET['id'];
$sql = "select * from test where id = $id";
$res = mysql_query($sql);
$col = mysql_fetch_array($res);

そして, $colを利用し,
「<input type="text">」 の場合 「value="{$col[”任意のカラム”]}"」
「<textarea>」の場合 「<textarea>$col[”任意のカラム”]</textarea>」を
指定する事で可能なのはわかりました。


また, 同じような感じで,プルタウンメニューに関してもやってみたのですが,上手くいきません。

私が組んでみたものです。

mysql_select_db("test1", $conn);

$id = $_GET['id'];
$sql = "select * from test where id = $id";
$res = mysql_query($sql);
$col = mysql_fetch_array($res);

$file = file("test.txt");

echo "<select>";

foreach($file as $val){

echo "<option value=\"" . $val . "\"";
if($col["test"] == $val){ echo "select"; }

echo ">" . $val . "</option>";

}

echo "</select>";

テキストの文字をfile関数を利用し,配列で$fileに代入し,
テキスト,テキストエリアと同じように行いました。
データベースのフィールド名を例では「test」とし,
ファイルに書き込まれている文字をtestフィールドに
入力している文字を一致している時「selected」させると
いう感じでくみました。
ネットや書籍でもよく載っていなかったので八方ふさがりな状態です。
宜しくお願いいたします。
reply: 3504 3535 返信 編集 削除

[3504] $fileの値を確かめてみてください

user: ゆうじ | created: 2006-12-22 20:15
こんばんわ。まいどどうも。

選択済みにさせるための処理の流れは
まったく問題ないように思います。

ただ、file関数では、
行末の改行コードがついたままのはずです。
http://jp.php.net/manual/ja/function.file.php
なので、比較のところがまったく一致せず
選択されないのだと思われます。


if($col["test"] == trim($val)){ echo " selected"; }

と、$val に trim関数を使うのもひとつの手ですが、
効率を考えると、ループの中に処理を増やしたくありませんので、
私なら、ループ部分には手を加えず、

$file = file("test.txt");

↑これの代わりに↓こうします。

$file = file_get_contents("test.txt");
$file = explode("\n", trim($file));

改行コード("\n")は、環境に合わせて変えてください。
Parent: 3503  reply: 3505 返信 編集 削除

[3505] 他に何か考えられる事というと何でしょうか?

user: しんのじ | created: 2006-12-25 15:52
ゆうじさん いつもいつもありがとうございます。

ご指摘のようにスプリクトを変えたのですが,
うまくいきませんでした。

私が書き込んだスクリプトは以下のとおりです。

<?php

$host = "localhost";
$user = "root";
$pass = "root";

if(!$conn = mysql_connect($host,$user,$pass)){
echo "Can not connect Database !!!<br>\n";
exit;
}

mysql_select_db("test", $conn);

$id = mysql_real_escape_string($_GET['id']);

$sql=<<<EOD
select * from test where id='$id';
EOD;

$res = mysql_query($sql);
$col = mysql_fetch_array($res);

$file = file_get_contents("test.txt");
$file = explode("\n", trim($file));

$body = "<select>\n";

foreach($file as $key=>$val){
if($col["test"] == $val){
$body .= "<option selected>$val";
}else{
$body .= "<option>$val";
}

$body .= "</option>\n";

}

$body .= "</select>\n";

echo $body;

?>

値を渡す側のスクリプトに問題があるのでしょうか?
値を渡す側では「test.php?id = $col["id"]」という感じで
mysql_fetch_array()関数を利用して$colに代入して
リンク先(test.php)以降を「?id = $col["id"]」 で渡しています。
自分でも,もう少し調べてみます。
Parent: 3504  reply: 3507 返信 編集 削除

[3507] mysql_queryでエラーはありませんか

user: ゆうじ | created: 2006-12-25 23:42
こんばんわ。

「うまくいきません」は、
状況がさっぱりわかりませんね。
コレを具体的に書いてもらえると
何か気づくかもしれません。

var_dump() とかで、各変数の値をチェックして、
想定内の値かどうかは確認されてるとは思いますので、
他に気づくところといえば・・・

$sql のところが、初めの文と違いますが、
myql_quey関数は、複数のSQL文に対応してないので
文末の ; が原因で問い合わせ失敗してはいませんか。
Parent: 3505  reply: 3508 返信 編集 削除

[3508] 別のページに読み込ませているのですが・・・

user: しんのじ | created: 2006-12-26 17:26
たびたび申し訳ありません。
mysql_queryでは特にエラーが出ていないですね。
また,ご指摘の$sqlの部分も修正しました。

また,私のほうできずいた点ですが・・・

プルタウンメニューの項目だけスクリプトが醜くなるので
処理を別にして,require関数で確認ページのファイルに読み込ましています。

読み込ませ先のファイルでも同じように
データベース接続,データベース名の選択,
mysql_queryでクエリーの発行をして
$col = mysql_fetch_array でテキストやテキストボックス
に各フィールドに書き込まれている文字列を表示させているのですが・・・
両方のファイルで以下のスクリプトを書き込んでいるのが
問題なのでしょうか?

自分でも修正して試してみます。

if(!$conn = mysql_connect( $host, $user, $password )){
die("データベースの接続に失敗しました。");
}
mysql_select_db( "zero2", $conn);
$id = $_GET['id'];
$sql = "select * from new_t where id=$id;";
$res = mysql_query($sql, $conn);
$col = mysql_fetch_array($res);
Parent: 3507  reply: 3509 返信 編集 削除

[3509] selectedは出力されてますか?

user: ach | created: 2006-12-26 21:37
乱入してすみません,achです
デバッグの流れとしては

1. HTML上にselectedが正しく出力されているのか?
 想定どうりの出力ならばHTMLを調べなおす

2. 判定に利用している変数は正しく取得できているか?
 取得できていなければSQLの生データと出力を確かめる

3. 判定は成功しているか?
 判定式とブール値を出力する
 (echo "{$col['test']} == $val is ".(int)($col['test'] == $val)), "\n";

こういう流れになると思うのですが全部確かめてみましたか?
(2と3はどちらが先かは好みの範囲)
Parent: 3508  reply: 3510 返信 編集 削除

[3510] 判定式を試してみました。

user: しんのじ | created: 2006-12-27 10:46
achさん はじめまして

早速 判定式を確認ページ先のファイルに確認したところ
判定式の前半部分
"{$new_t['meker']} == $val is "の
$valの部分でファイルに書き込んでいる
最後の文字が必ず表示されてしまいます。

例:
ファイルの中身







必ず「お」が$valの出力されてしまいます。

配列で取り出す部分とforeach文で$valの取り出す部分

file関数もしくは, file_get_contents関数で
配列で取り出す辺りがおかしいのか、
foreach文の部分でおかしくなっているのでしょうか?
Parent: 3509  reply: 3511 3515 返信 編集 削除

[3511] 追加です。

user: しんのじ | created: 2006-12-27 19:22
file関数またはfile_get_contents関数を利用し,
文字列を配列で取り出していましたが・・

試しにarray関数にファイル内の文字列を入れて,
以下同じようにスクリプトを書き込んだ結果,
正常に機能しました。

システム的にファイルを利用して
取り出したいのですが,

とりあえず, fileで取り出す部分に問題があるようです。

何かアドバイスありましたら
教えてください。
宜しくお願いいたします。
Parent: 3510  reply: 3512 返信 編集 削除

[3512] Re. 追加です。

user: ゆうじ | created: 2006-12-27 20:13
そのファイルの文字コードと
内部エンコードが違うのではありませんか。

ファイルの文字コードを
内部エンコードと同じにしましょう。
Parent: 3511  reply: 3513 返信 編集 削除

[3513] 文字コードについて

user: しんのじ | created: 2006-12-27 20:38
たびたびすいません。
PHPの文字エンコードはEUC-jPにしていると思われるのですが
単純にファイルの文字をEUC-jPで書き込めばいいのでしょうか?
Parent: 3512  reply: 3514 返信 編集 削除

[3514] まあその通りです

user: ゆうじ | created: 2006-12-27 21:39
が、あらたに打ち直さなくても、該当ファイルをエディタで開いて、
文字コードを選んで保存すれば良いのではないかと思いますが。
中には出来ないエディタもあるかもしれません。
Parent: 3513  返信 編集 削除

[3515] DEBUG WRITE

user: ach | created: 2006-12-28 05:23
> file関数もしくは, file_get_contents関数で
> 配列で取り出す辺りがおかしいのか、
> foreach文の部分でおかしくなっているのでしょうか?

確かにそこが怪しいですから,次のようにでもしてテストしてみるほうがいいと思います.
echo "<pre>1\n";var_dump(file('test.txt'));echo "</pre>";//デバッグライト
$file = file('test.txt');
echo "<pre>2\n";var_dump($file); echo "</pre>";//デバッグライト
...
いろいろな処理
...
echo "<pre>3\n";var_dump($file); echo "</pre>";//デバッグライト
foreach ($file as $val)
{
echo "<div>";var_dump($val); echo "</div>";//デバッグライト
}

「うごかね~」ってタイプのバグにはデバッグライトを大量にいれて変数の遷移を追跡すると結構解決したりします.
(デバッグライトを入れるとバグが消えるなんて事もあるらしいですが……)
Parent: 3510  返信 編集 削除

[3535] 行末の改行コード

user: しんのじ | created: 2007-01-18 12:45
achさんのアドバイス通りデバッグをおこなった結果
原因は当初のゆうじさんのご指摘の通り行末の改行コードが
原因だったので,以下の通りにした結果
おもうように動作いたしました。
ありがとうございます。

$file = file("test.txt");

foreach($file as $val){
str_replace("\n","",$val);
str_replace("\t","",$val);

$option="<select>";

if($col["test"] == $val){
$option .= "<option selected>$val";
}else{
$option .= "<option>$val";
   }
$option .= "</option>";
}
$option .= "</select>";
Parent: 3503  返信 編集 削除
スレッド表示 | フラット表示〕 全トピック 920 件中 149 番目 次≫ ≪前
ページの一番上へ
Googleグックマークに登録 Yahooグックマークに登録 livedoorクリップに登録 @niftyクリップに登録 はてなブックマークに登録 deliciousに登録 Buzzurlに登録 FC2ブックマークに登録
最近更新された掲示板トピックス
管理人Blog
Yahoo Search

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