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

動的ページの作成について

created: 2007-02-18 22:41 | modified: 2007-03-05 19:23 | reply: 9

[3597] 動的ページの作成について

user: PHP勉強野郎! | created: 2007-02-18 22:41
初めて投稿・質問させて頂きます。PHP勉強野郎!といいます。

※実行しようとしている事
HTMLのフォームを使ってメッセージを入力させ、その内容を1文字ごとに色をランダムで変えて表示させてみたいのですが…
色々と試行錯誤しているのですが上手く(というか全く)出来ません。
このような事は可能でしょうか?
ぜひご教授お願いしたく質問させて頂きました。
よろしくお願いします。
reply: 3600 返信 編集 削除

[3600] Re. 動的ページの作成について

user: ゆうじ | created: 2007-02-19 01:55
こんばんわ。

やろうとなさってることはわかりました。また可能なことです。
が、何が出来て何が出来ないのか、または
何をやってどういう結果になったのかわからないので
ヒントの出しようが無くて困っています。

エラーメッセージが出るのか出ないのか?
フォームの値をスクリプトに送信出来ないのか?
フォームから値を得ることが出来ないのか?
受け取った文字を表示させることが出来ないのか?
ランダムに色のコードを作る方法がわからないのか?
文字列を1文字ごとに分解する方法はわからないのか?
プログラムの設計方法がわからないのか?
もっと他のことかな・・・なんてことで悩みます。

はじめから全部教えてとなると荷が重いですが、
いくらかでもはっきりさせてもらえれば
何かしらのアドバイスができます。
Parent: 3597  reply: 3608 返信 編集 削除

[3608] Re. 動的ページの作成について

user: PHP勉強野郎! | created: 2007-02-19 23:44
こんばんは、ゆうじ様。
お忙しい中ご返答いただきありがとうございます。

何をどのように質問すればよいか整理が出来ていない状態で質問してしまいました。 申し訳ありませんでした。

※現在の状況です
入力フォームに好きな文字を入れて送信ボタンを押す事で
受け取った文字を表示させるところまでは出来ています。

が、その後のランダムに色のコードを作る方法と
文字列を1文字ごとに分解するプログラム設計の検討が全く
つきません。
上記の質問に対して再度ご教授頂きたいです。
よろしくお願いいたします。
Parent: 3600  reply: 3609 返信 編集 削除

[3609] プログラムの設計案

user: ゆうじ | created: 2007-02-20 02:47
まずHTMLの色コードをランダムに作り出す方法です。

【1】はじめに何が求められるのか要求を洗い出してみます。
HTMLで色指定する時は、R・G・B それぞれが持つ
0~255 の値を16進数の文字列で指定してますね。
なのでこれ↓が求められるものになるでしょう。

(1)0~255のランダムな数値を3つ選び出す。
(2)それぞれを16進数の文字列に変換する。


【2】次は(1)と(2)をどのように具体化するか決めます。

(1)ランダムな数値を選び出すにはrand関数が適役でしょう。
rand(0,255) とすれば、0~255 のどれかが得られます。
http://jp.php.net/manual/ja/function.rand.php

(2)16進数文字列に変換するにはdechex関数がありますが、
16未満の数値のだと一桁しか返してくれないので
必ず2桁ゼロ詰めで得るためにsprintf関数を使うことにします。
http://jp.php.net/manual/ja/function.sprintf.php

これらを3回繰り返し連結すればランダムな色コードが出来ますね。
尚、この処理はプログラム中で何度も使われることが
予想されるので関数にまとめることにします。

以上が『ランダムな色コードを生成する関数』の仕様になります。


【3】これをコードに直します。
function randColor ()
{
$colorCode = '';
for($c = 0; $c < 3; $c++) {
$colorCode .= sprintf('%02X', rand(0,255));
}
return $colorCode;
}


設計も含めたのでかなりくどくなってしましましたが
どんなプログラムを書くにしても
上記のようなステップは大なり小なり必要です。
長くなるので一文字毎に分解する関数splitCharと
残りの処理はコードを書いてしまいますが、
ステップの方はゆっくり考えてみてください。

<?php
function randColor ()
{
$colorCode = '';
for($c = 0; $c < 3; $c++) {
$colorCode .= sprintf('%02X', rand(0,255));
}
return $colorCode;
}

function splitChar ( $str )
{
if (!($len = mb_strlen($str))) {
return false;
}

$buff = array();
for ($c = 0; $c < $len; $c++) {
$buff[] = mb_substr($str, $c, 1);
}
return $buff;
}

$text = $_POST['text'];

if (!$text) {
exit();
}

$chars = splitChar($text);
foreach($chars as $ch) {
echo '<span style="color:#', randColor(), '">', $ch, '</span>';
}
?>
Parent: 3608  reply: 3612 3632 返信 編集 削除

[3612] Re. プログラムの設計案

user: PHP勉強野郎! | created: 2007-02-21 00:19
ゆうじ様、たびたびの質問に答えていただき本当にありがとうございます。

率直に言うと…難しいですね(>_<)
※ソースまで書いてくださり申し訳ありません…
まだ関数の事などを理解していないため、自力で出来るようになるにはもう少し時間が必要だと判断致しました。
あとは自分で各関数の働きなどを調べて理解出来るように努力します。

※最後にお聞きしたいのですが、私はPHPの勉強を始めたばかりなのですがPHPを独習するにあたり良い方法などをご存知でしたら、教えて頂けますか?
Parent: 3609  reply: 3615 返信 編集 削除

[3615] PHP独習法

user: ゆうじ | created: 2007-02-21 22:27
これといってオススメの独習法は思いつきませんが
しいて言えば沢山コードを書くことでしょうかね。
書いて、試して(動かして)、身に着く物だと思います。
漠然としててすみません。

でも「情報を得る手段」と「開発環境」を整えることで
学習効率を格段に上げられるとは思います。


情報を得る手段としてはこんなところです。

・リファレンス本などの辞書的な書籍を1冊手元に置く。
・PHPマニュアルをはじめ有用なサイトをお気に入りに整理。
・検索エンジン活用(わからないキーワードやエラーメッセージは取り合えず引いてみる)
・PHPメーリングリスト購読(最新情報・ニュースの入手)
・PHPに関するサイトを持つ(間違いや勘違いを突っ込んでもらえるかも)


開発環境で先ず必要なのは、自由に使えるテスト環境を持つことで、
ウェブサーバとPHPを自分のパソコンにインストールします。
どんな設定にしようがどんなコードを書こうが
他の方に迷惑をかけることはありませんので
やりたいことを思う存分試せます。

2番目はコードを書くための「エディタ」ですね。
予約語の色分けや補完などは必須機能として、
プロジェクトの管理やデバッグが出来るものをおすすめします。
無償で得られるものとしては Eclipse + TruStudioプラグイン や
phpspotさんの PHPエディタ などがあります。
有償ですが、私は Peggy を使ってます。予算があればオススメです。


沢山コードを書こうと思っても、
実際のところ自分の知識や知恵だけではすぐに限界が来ますので、
フリーで配布しているスクリプトの中から簡単に書けそうなものを選んで
そのままコードを真似て書いてみると良いと思います。
その中でわからないことが出てきたらネットや書籍で調べるわけです。
製作者が何を考えて設計しどんな工夫を凝らしたのか知ることが出来ますし、
なにより自分に足りないスキルが見えてくると思いますよ。


私でわかることは知恵をお貸ししますので
また書き込んでください。
お互いがんばりましょう。
Parent: 3612  reply: 3621 返信 編集 削除

[3621] PHP独習法

user: PHP勉強野郎! | created: 2007-02-23 00:17
あたたかいお返事ありがとうございます。

ゆうじ様のお言葉を胸にこれからも一歩一歩前進出来るように努力いたします。
Parent: 3615  返信 編集 削除

[3632] 動的ページの作成の設計について

user: PHP勉強野郎! | created: 2007-03-04 15:46
いつもお世話になっております。PHP勉強野郎!です。

以前、動的ページ作成の件で質問させて頂き、大変お世話になりました。
コードも設計案も教えて頂いたのですが、どうしても自分で理解出来ないところ
があるので、再度のご質問宜しいでしょうか?

これが以前教えて頂いたプログラムのコードです。
<form action="test.php" method="post">
<input type="text" name="text" size="30">
<input type="submit" value="表示!">
</form>
<?php
function randColor()
{
   $colorCode = '';
   for($c = 0; $c < 3; $c++)
   {
   $colorCode .= sprintf('%02X', rand(0,255));
   }
   return $colorCode;
}
function splitChar($str)
{
   if (!($len = mb_strlen($str)))
   {
   return false;
   }
   $len = mb_strlen($str);
   $buff = array();
   for ($c = 0; $c < $len; $c++)
   {
   $buff[] = mb_substr($str, $c, 1);
   }
   return $buff;
}
$text = $_POST['text'];
if (!$text)
{
   exit();
}
$chars = splitChar($text);
foreach($chars as $ch)
   {
   echo '<span style="color:#', randColor(), '">', $ch, '</span>';
   }
?>

質問内容:
----------------------------------------------
$text = $_POST['text'];
if (!$text)
{
   exit();
}
この部分はPOSTで受け取ったデータのエラー処理部分だと思いますが
この部分はいるのでしょうか? 具体的にはどのような処理なのでしょうか?
----------------------------------------------

----------------------------------------------
function splitChar($str)
{
   if (!($len = mb_strlen($str)))
   {
     return false;
   }
   mb_strlen($str);で入力された文字列の長さを得る。
   しかし(!(~)) return false;の意味が解りません

   $buff = array();
   これはどういう意味でしょうか?
   $buff[ ]; では駄目なのでしょうか?

   for ($c = 0; $c < $len; $c++)
   {
   $buff[ ] = mb_substr($str, $c, 1, "EUC-JP");
   }
   変数$cの値がフォームに入力された文字列の長さ以下の時
   入力された文字列の0番目から一文字づつ取り出し
   配列$buffに格納する

   return $buff;
   どうして$buff[ ]; ではないのでしょうか?
}
----------------------------------------------

----------------------------------------------
foreach($chars as $ch)
   {
   echo '<span style="color:#', randColor(), '">', $ch, '</span>';
   }
   spanの使用方法が解らないので、
   echo "<font color = randColor()>".$ch."</font>"; としてみました。
   そうすると、文字色が一色のみの変更になってしまいました。
   <font color>~</font>では実現出来ないのでしょうか?
----------------------------------------------

----------------------------------------------
function randColor()
{
   $colorCode = '';
   $colorCodeにNullを代入しているのでしょうか?

   for($c = 0; $c < 3; $c++)
   {
   $colorCode .= sprintf('%02X', rand(0,255));
   ここでどうして結合演算子を使用しているのか解りません。
   試しに『.=』を『=』に変更したら動きませんでした。

   }
   return $colorCode;
}
----------------------------------------------
質問・解らない事ばかりで本当に申し訳ございません。
初心者相手に本当に疲れるとは思いますが、どうかご教授宜しくお願いします。
Parent: 3609  reply: 3634 返信 編集 削除

[3634] 動的ページの作成の設計について

user: ゆうじ | created: 2007-03-04 17:50
$text = $_POST['text'];
if (!$text)
{
   exit();
}
【Q1】
この部分はPOSTで受け取ったデータのエラー処理部分だと思いますが
この部分はいるのでしょうか? 具体的にはどのような処理なのでしょうか?

【A1】
$_POST['text'] はユーザが入力した値ですので
なにが入ってるのかわかりません。
そこで $_POST['text'] の値を検証しています。

ここでは単に$_POST['text']が空なら強制終了しているだけですが
プログラムミング全体の流れをつかんでいただく為に簡単に済ませました。
実用に耐えるアプリケーションにするためには
もっと厳密なチェックと対処が必要です。
・何も無いとき
・空白の文字列のとき
・制御コードが含まれてるとき
値の妥当性をどう確認するかは設計者の考え次第です。


   if (!($len = mb_strlen($str)))
   {
     return false;
   }
【Q2】
mb_strlen($str);で入力された文字列の長さを得る。
しかし(!(~)) return false;の意味が解りません

【A2】
$strの長さが0のとき、
またはmb_strlenで文字列長を得られなかったときは、
以降の処理は無意味となりますので
ここで処理を終え戻り値としてfalseを返しています。
こう書くのと同じことです。
   $len = mb_strlen($str);
   if (!$len)
   {
     return false;
   }


   $buff = array();
【Q3】
これはどういう意味でしょうか?
$buff[ ]; では駄目なのでしょうか?

【A3】
この後で $str を文字単位に分解した値を保持するため
明示的に変数 $buff を 空の配列で初期化しています。

これに対し「$buff[]」という記述は、"=" との組み合わせで、
配列に新たな値を「追加」するときにのみ使う書き方で
まったく違った意味になります
$buff = array(); // 空の配列で $buff を初期化する。
$buff[] = "ABC";  // 文字列 "ABC" を、配列$buffに追加する。
$buff[] = array(); // 空の配列を、配列$buffに追加する。


   return $buff;
【Q4】
どうして$buff[]; ではないのでしょうか?

【A4】
上記の説明でおわかりかと思いますが、この関数が返すのは
分解した文字全てが格納されている$buffでなければなりません。
$buff の中身を確認したければ return の前に
var_dump($buff); としてみてください。


foreach($chars as $ch)
   {
   echo '<span style="color:#', randColor(), '">', $ch, '</span>';
   }
【Q5】
spanの使用方法が解らないので、
echo "<font color = randColor()>".$ch."</font>"; としてみました。
そうすると、文字色が一色のみの変更になってしまいました。
<font color>~</font>では実現出来ないのでしょうか?

【A5】
span はHTMLのインライン要素を指定するタグです。
テキストの一部分にスタイルを適用するときに重宝します。

font でも span でも、値を囲む " が無かったり
不要な空白が入ってるので表示されて無いだけだと思います。
PHPの実行結果は、ブラウザの表示を見るだけでなく
ページのHTMLソースも確認しましょう。
font版
   echo '<font color="#', randColor(), '">', $ch, '</font>';


   $colorCode = '';
【Q6】
$colorCodeにNullを代入しているのでしょうか?

【A6】
代入してるのは "Null" ではなくて "空の文字列" です。
このあとの処理で ".=" で文字列を連結しますので、
$colorCode を明示的に"空の文字列"で初期化しています。


   $colorCode .= sprintf('%02X', rand(0,255));
【Q7】
ここでどうして結合演算子を使用しているのか解りません。
試しに『.=』を『=』に変更したら動きませんでした。

【A7】
『.=』は、左辺に右辺を結合するわけですから。
繰り返しのたびに sprintf('%02X', rand(0,255)) の戻り値が
$colorCode に追記されます。

これに対し『=』は、左辺に右辺を代入(コピー)するわけですから、
繰り返しのたびに sprintf('%02X', rand(0,255)) の戻り値で
$colorCode の値が上書きされます。
これでは何回繰り返そうと2桁の16進数文字列しか得られません。
Parent: 3632  reply: 3635 返信 編集 削除

[3635] 動的ページの作成の設計について

user: PHP勉強野郎! | created: 2007-03-05 19:23
こんばんは、PHP勉強野郎!です。

昨日も丁寧に教えて頂き、本当にありがとうございます。
おかげでようやく理解する事が出来ました。
結合演算子の使用方法も理解する事が出来ました。(^^)

まず何が要求されていて、どのようにそれを実現するのか?
これを考える事の大切がよく解りました。

いまの自分には
プログラムを処理毎に分解して、設計する能力と
PHPの中にHTMLを書く際の構文の知識が
不足していると思いますで、今後はこれらを中心に
勉強を進めたいと思います。

では、失礼します。
Parent: 3634  返信 編集 削除
スレッド表示 | フラット表示〕 全トピック 920 件中 132 番目 次≫ ≪前
ページの一番上へ
Googleグックマークに登録 Yahooグックマークに登録 livedoorクリップに登録 @niftyクリップに登録 はてなブックマークに登録 deliciousに登録 Buzzurlに登録 FC2ブックマークに登録
最近更新された掲示板トピックス
管理人Blog
Yahoo Search

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