2015年05月09日

PHP に URL から値を渡して、その値を元にしてコンボボックスの OPTION 要素を選択する3つの方法

こんな感じのコンボボックスでは、PHP や JavaScript で何もしないと、表示された時に選択されるのは、一行目のオプション内容です。これを $_GET["php_file"] の内容によって、表示した時の対象オプションを変更する事ができます
<select id="action_file"
	name="php_file">
	<option value="log_02a.php">連結演算子で文字列の連結</option>
	<option value="log_02b.php">文字列内に変数を埋め込んで連結</option>
</select>

方法その1

以下のようなリンクから表示すると、コンボボックスは2行目のオプションを選択して表示されます

http://winofsql.jp/php/basic/log_03.php?php_file=log_02b.php

▼ 三項演算子を使ったとても解りやすいコード
<select id="action_file"
	name="php_file">
	<option value="log_02b.php"
		<?= $_GET["php_file"] == "log_02a.php" ? "selected" : "" ?> >連結演算子で文字列の連結
	</option>
	<option value="log_02b.php"
		<?= $_GET["php_file"] == "log_02b.php" ? "selected" : "" ?> >文字列内に変数を埋め込んで連結
	</option>
</select>

これは、HTML の中に直に埋め込む上に、条件の判断を OPTION 要素の中の一行一行で完結してしまう方法です。具体的には、php_file=log_02b.php で渡された内容に基づいて、log_02b.php の OPTION 要素のみ selected を記述してブラウザに選択させます

方法その2

jQuery に選択させる方法です。選択の条件の元となる文字列のみ PHP で埋め込んでおいて、その文字列を使って jQuery で処理します。これは、PHP と JavaScript の連携プレイなので、それぞれの扱いを良く知った上で利用する必要があります。

http://winofsql.jp/php/basic/log_04.php?php_file=log_02b.php
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=600,initial-scale=1.0">

<script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script>
$(function(){

	// 初期処理
	if ( "<?= $_GET["php_file"] ?>" != "" ) {
		$("#action_file").val("<?= $_GET["php_file"] ?>");
	}

	// コンボボックスの選択されたテキストをテキストエリアにセットする
	$("#set_text").click(function(){
		$("#text").val( $("#action_file option:selected").text() );

	});

});
</script>
</head>

<body>
<!-- ここにコンテンツを作成する -->
<select id="action_file"
	name="php_file">
	<option value="log_02a.php">連結演算子で文字列の連結</option>
	<option value="log_02b.php">文字列内に変数を埋め込んで連結</option>
</select>

<form method="POST"
	id="my_form"
	action="log_02a.php?param=init">件名 
	<input type="text"
		name="subject"
		id="subject">
	<input type="button"
		id="set_text"
		value="コンボボックスのテキストをセット">
	<br>
	<span style='vertical-align:top'>内容</span>
	<textarea name="text"
		id="text"
		style="width:400px;height:100px;"></textarea>
	<br>
	<input type="submit"
		name="send"
		value="送信">
</form>

</body>
</html>


方法その3

PHP コードを埋め込んで、配列を作ってループ処理で行う方法ですが、HTMLの中を虫食いのように PHP の実行処理を埋め込むのは、いろいろな意味でおすすめできません。見ただけでも見にくいし解り難くなっているのが解ります。

http://winofsql.jp/php/basic/log_05.php?php_file=log_02b.php

この方法の延長上である開発として納得の行く方法はありますが、PHP に慣れていないうちはまだまだ考える必要はありません。
<?php
	// 配列変数に、OPTION 要素用の値の一覧を作成しておく
	$options = array(
		"log_02a.php" => "連結演算子で文字列の連結",
		"log_02b.php" => "文字列内に変数を埋め込んで連結"
	);
?>
<select id="action_file"
	name="php_file">
<?php
	foreach( $options as $k => $v ) {
		print "<option value=\"";
		print $k;
		print "\"";
		if ( $_GET["php_file"] == $k ) {
			print " selected";
		}
		print ">";
		print $v;
		print "</option>\n";
	}
?>
</select>


最も容易なのは『方法その1』です

もちろん、この方法がベストというわけではありませんが、WEB アプリケーションを知る為にはできる限り簡潔にソースコードが記述されるほうが望ましいです。テクニックに走りすぎると、その時はいいかもしれませんがしばらく時間が空くと、自分で書いたのに良く解らない事がプロでもあります。知らない事が多い時点では、見える範囲はできるだけ狭くしましょう。




タグ:PHPの基本
posted by at 2015-05-09 17:52 | 処理 | このブログの読者になる | 更新情報をチェックする

2015年05月07日

ページで機能分解。最初は POST メソッドで、FORM から他のページを呼び出すべし

PHP を使う根本的な目的は、ブラウザで入力されたデータをサーバ側で処理する事です。まず、最初にそれを頭に置いて最初のページの役目は FORM に限定します。

WEBページ上のデモ

FORM の主な仕様

1) METHOD は POST
2) サーバへの送り先は log_02a.php?param=init

PHP がまだ書かれていない FORM ページ
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=600,initial-scale=1.0">

<script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script>
$(function(){

	// コンボボックスの選択されたテキストをテキストエリアにセットする
	$("#set_text").click(function(){
		$("#text").val( $("#action_file option:selected").text() );

	});

});
</script>
</head>

<body>
<!-- ここにコンテンツを作成する -->
<select id="action_file"
	name="php_file">
	<option value="log_02a.php">連結演算子で文字列の連結</option>
	<option value="log_02b.php">文字列内に変数を埋め込んで連結</option>
</select>

<form method="POST"
	id="my_form"
	action="log_02a.php?param=init">件名 
	<input type="text"
		name="subject"
		id="subject">
	<input type="button"
		id="set_text"
		value="コンボボックスのテキストをセット">
	<br>
	<span style='vertical-align:top'>内容</span>
	<textarea name="text"
		id="text"
		style="width:400px;height:100px;"></textarea>
	<br>
	<input type="submit"
		name="send"
		value="送信">
</form>

</body>
</html>

コンボボックスを使った jQuery の処理

jQuery の記述で、コンボボックスで選択している文字列を、テキストエリアにセットする処理を、送信前の画面の補助処理として実装しています。
$("#set_text").click(function(){
	$("#text").val( $("#action_file option:selected").text() );

});
name 属性と id属性 ここでは、このコンボボックスのデータはサーバへは送らないので、FORM の中には記述していません。 ですが、画面上のコンテンツの特性として、いつでも FORM の中で動作可能なように、name 属性で名前を指定しています。これとは別の名前で、id 属性を指定していますが、これは jQuery での指定を明確で簡潔にする為に指定しています。name 属性と id 属性は同じ内容にしても良いですが、ここでは検証の為にわざと違うものを使用しています。 jQuery は、name 属性の処理が得意では無いが超優秀 name 属性しか指定されていない場合、それからもコンテンツを特定する事は可能ですが、解りにくく面倒なので id 属性を指定したほうが見通しが良くなります。 また、jQuery では、『セレクタ』を使用していろいろなコンテンツの特定方法があり、ここでも使用している『選択されたコンボボックスのテキスト』は少し複雑で高度である事が解ります。
$("#action_file option:selected").text()
ですが、このような処理も必要になるので、jQuery への理解はかなり深めたほうが良いでしょう。 送り先の主な仕様 1) キャラクタセットは、UTF-8 2) GET メソッドと POST メソッドで送られたデータの一覧を表示する 3) 連結演算子による文字列連結のサンプル 4) 『戻る』 リンクで元のページへ戻る FORM から呼び出される最低限のPHP コード
<?php
header( "Content-Type: text/html; Charset=utf-8" );

print "<pre>";
print_r($_GET);
print_r($_POST);
print "</pre>";

print "【連結演算子で文字列の連結】<hr>";

print $_POST["subject"] . $_POST["text"];

print "<hr>";
?>
<a href="log_02.php?php_file=log_02a.php">戻る</a>

PHP 毎の処理を学ぶ為に後からページを増やす事を想定しています。その場合、コンボボックスのデータを増やす事になりますが、今はまだ先頭のこの処理のみが呼び出されるように固定になっています。

FORM が POST メソッドの場合は、GET メソッドも追加できます
log_02a.php?param=init
この記述は、GET メソッドにデータを追加して、$_GET["param"] = "init" を発生させる記述方法です。FORM 内のコンテンツは $_POST スーパーグローバル変数にセットされます。 アンカーによるリンクは、GET メソッドでサーバに送られます
log_02.php?php_file=log_02a.php
このリンクは、単純に log_02.php に戻るのでは無く、log_02.php の中で、$_GET["php_file"] が使えて、その中には "log_02a.php" がセットされている事を意味します。つまり、log_02.php は、どのページから戻って来たかを知る事ができると言う事です。 補足情報 FORM 要素はブロック要素です。改行が入るので注意して下さい( 画面作成時に結構重要です )
タグ:PHP
posted by at 2015-05-07 20:59 | 処理 | このブログの読者になる | 更新情報をチェックする

2010年11月09日

PHP : グローバル変数の一覧表示

厳密ではありませんが、変数名に _ (アンダーバー) が含まれない変数
の内容を変数名と共に表示します。
( $Key と $Value はワーク用なので省いています )
print "<pre>";
foreach( $GLOBALS as $Key => $Value  ) {
	if ( strstr( $Key, "_" ) === false ) {
		if ( $Key != 'Key' && $Key != 'Value' && $Key != 'GLOBALS' ) {
			if ( is_array( $Value ) ) {
				print "$Key =>\n";
				print_r($Value);
			}
			else {
				print "$Key => $Value\n";
			}
		}
	}
}
print "</pre>";

以下、MySQL アクセスでの使用例
<?
// 日本語設定
header( "Content-Type: text/html; Charset=utf-8" );
// キャッシュを使わない設定
header( "pragma: no-cache" );
header( "Expires: Wed, 31 May 2000 14:59:58 GMT" );
header( "Cache-control: no-cache" );

if ( substr(PHP_OS,0,3) == 'WIN' ) {
	if ( !extension_loaded( "mysql" ) ) {
		exit("php.ini で mysql のモジュールをロードして下さい");
	}
}

$Connect = null;
$Server = 'localhost';
$DbName = 'lightbox';
$User = 'root';
$Password = 'password';

$Connect = @mysql_connect( $Server, $User, $Password );
if ( !$Connect ) {
	print "接続エラーです";
	exit();
}
// DB選択
mysql_select_db( $DbName, $Connect );

// クエリ
$result = mysql_query("select * from 社員マスタ", $Connect);

// 行データ取得
$row[] = mysql_fetch_array($result);
$row[] = mysql_fetch_array($result);
$row[] = mysql_fetch_array($result);

// 接続解除
mysql_close($Connect);

print "<pre>";
foreach( $GLOBALS as $Key => $Value  ) {
	if ( strstr( $Key, "_" ) === false ) {
		if ( $Key != 'Key' && $Key != 'Value' && $Key != 'GLOBALS' ) {
			if ( is_array( $Value ) ) {
				print "$Key =>\n";
				print_r($Value);
			}
			else {
				print "$Key => $Value\n";
			}
		}
	}
}
print "</pre>";

?>
<!-- 日本語設定 -->
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />



posted by at 2010-11-09 10:58 | 処理 | このブログの読者になる | 更新情報をチェックする

2010年11月08日

アプリケーションとして、PHP を理解する為の簡易掲示板(サンプル)

3つの部品から成り立っていますが、sbd.php が処理の殆どです。

sbd.php :学習用 -- 簡易掲示板

model.php :学習用 -- 簡易掲示板

メインの sbd.php を可能な限りシンプルに効率良く表現する為に、2次的な処理
要素( 全体の大きな動きとは直接関係しない )のものを取り出しています。
<?
// *********************************************************
// 引数の文字列をカンマで分解して、<FONT color=blue>「名前」</FONT>で管理する為の
// データを追加する
// *********************************************************
function explode_by_name( $value ) {

	$ret = explode( ",", $value );

	$ret['タイトル'] = $ret[0];

	$ret['氏名'] = $ret[1];

	$ret['投稿日付'] = $ret[2];

	$ret['本文'] = $ret[3];

	return $ret;

}

// *********************************************************
// 入力チェック
// ※ 問題がある場合は、エラーメッセージを$_GET['error']
// ※ に追加セットして、false を返す
// *********************************************************
function check_input( ) {

	if( trim( $_GET['subject'], "\t  " ) == "" ) {
		$_GET['error'] .= "タイトルを入力して下さい<br>";
	}
	if( trim( $_GET['name'], "\t  " ) == "" ) {
		$_GET['error'] .= "氏名を入力して下さい<br>";
	}
	if( trim( $_GET['main'], "\t  " ) == "" ) {
		$_GET['error'] .= "本文を入力して下さい<br>";
	}

	// $_GET['error'] に何かが入っているのでエラー
	if ( $_GET['error'] != "" ) {
		return false;
	}

	// $_GET['error'] が空なのでエラー無し
	return true;

}
?>

css.php :学習用 -- 簡易掲示板

css.php は、php にする必要はありませんが、学習中はブラウザのソースを見た時に同時に
css も読めるほうがいいのと、css も動的に変更できると言う前提での実装方法です。


posted by at 2010-11-08 16:28 | 処理 | このブログの読者になる | 更新情報をチェックする

2010年10月29日

PHP : XML の内容を DOMXPath クラスで簡単に取得する

一番注意するのは、「名前空間の登録」です。あとは、ルートから順に指定して行くのですが
途中で同じ要素が繰り返されている場合は[n] で指定します。( n は、1 から始まります )

<?xml version="1.0" encoding="utf-8"?>
<ItemLookupResponse xmlns="http://webservices.amazon.com/AWSECommerceService/2005-10-05">
  <OperationRequest>
    <RequestId>48862558-e642-43b7-96dc-dbb2b5ddcc1f</RequestId>
    <Arguments>
      <Argument Name="Operation" Value="ItemLookup"/>
      <Argument Name="Service" Value="AWSECommerceService"/>
      <Argument Name="Signature" Value="5dkEOxK2XReEF7Tf7EGOo5XTyBwZwayfww4w0+m7jI0="/>
      <Argument Name="ItemId" Value="B000062X90"/>
      <Argument Name="AWSAccessKeyId" Value="MySubscriptionId"/>
      <Argument Name="Timestamp" Value="2010-10-25T10:20:51Z"/>
      <Argument Name="ResponseGroup" Value="Large"/>
    </Arguments>

<?
header( "Content-Type: text/html; Charset=utf-8" );
header( "pragma: no-cache" );
header( "Expires: Wed, 31 May 2000 14:59:58 GMT" );
header( "Cache-control: no-cache" );

// XML の内部は utf-8 です。
$xml = file_get_contents( "http://localhost/am.xml" );

// 新規のドキュメントを作成します
$doc = new DOMDocument();

// 文字列内の XML をセットします
$doc->loadXML($xml);

// DOMXPath オブジェクトを作成します
$xpath = new DOMXPath($doc);

// ネームスペースを登録します
$xpath->registerNamespace( 'n', "http://webservices.amazon.com/AWSECommerceService/2005-10-05");

// n: で表現した xpath を作成します
$query = '/n:ItemLookupResponse/n:Items/n:Item/n:SmallImage/n:URL';

$entries = $xpath->query($query);
print $entries->item(0)->textContent;

print "<hr>";

// n: で表現した xpath を作成します
// ( 複数ある場合は、[1] が先頭
$query = '/n:ItemLookupResponse/n:Items/n:Item/n:CustomerReviews/n:Review[1]/n:Content';

$entries = $xpath->query($query);
print $entries->item(0)->textContent;

print "<hr>";

$query = '/n:ItemLookupResponse/n:Items/n:Item/n:CustomerReviews/n:Review[3]/n:Content';

$entries = $xpath->query($query);
print $entries->item(0)->textContent;

?>

xpath の記法は XPath の例 を参考にします。

関連する記事

XML の内容を new DOMDocument(); と getElementsByTagName で簡単に取得する


posted by at 2010-10-29 14:41 | 処理 | このブログの読者になる | 更新情報をチェックする