ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

Let's PHPコミュの[初心者] 質問-広場 その5

  • mixiチェック
  • このエントリーをはてなブックマークに追加
初心者のみなさんにはわからないことがたくさんあると思います。
そんな初心者を暖かくサポートするトピックです。

------------------------------------------------------------------

■質問時の注意

1.質問する際にはどのバージョンのPHPを使っているか、
  またOSやWEBサーバーの種類などを明記してください。

例)
  PHP:5.0.1
  OS:Windows XP
  Webサーバ:Apache

2.行った操作や望む結果などを詳しく明記してください。

例)
  fopenで別サイトのファイルを読み込む処理を組んでいるのですが、
  /// コード
  $handle = fopen('http://hoge/hoge.html', 'r');

3.エラーメッセージはそのまま表記してください。
  「エラーが出ます」だけではどのようなエラーか判りません。

○良い例)
  Warning: fopen(): URL file-access is disabled in the server configuration in test.php on line 2
  上記のエラーが発生して読み込めません。

×悪い例)
  エラーが出て読み込めません><

4.教えていただいたらきちんとお礼をいいましょう。

------------------------------------------------------------------

■参考リンク

○PHPマニュアル(※まずはココ)
http://www.php.net/manual/ja/
○日本PHPユーザ会
http://www.php.gr.jp/
○PEARマニュアル
http://pear.php.net/manual/ja/
○メーリングリスト
http://ns1.php.gr.jp/mailman/listinfo/

------------------------------------------------------------------

■過去のトピック

[初心者] 質問-広場 その3
http://mixi.jp/view_bbs.pl?id=22096538
[初心者] 質問-広場 その2
http://mixi.jp/view_bbs.pl?id=12807932
[初心者] 質問-広場(その1)
http://mixi.jp/view_bbs.pl?id=870219

コメント(1000)

> 959

低レベルな関数も何も、アドレスにクエリを渡してそのままfile_get_contents()でファイルを取得、XML解析ライブラリで取得ファイルを解析、の流れで良いのでは?


この辺とか
http://d.hatena.ne.jp/ryster/20070907/1189148449


cURLを使った方が、コードはすっきりして気持ち良いんだけど、使えない時もある。
<?php
for($a = 0; $a < 6; $a++ ) {
print($_SESSION['id_★'] ;
} ?>

★の部分に$aを入れたいんですけどエラーになってしまいます。
どのように書けばエラーにならないでしょうか??
がると申します。

To アスマ先生さん#962

$_SESSION['id_' . $a]

でいかがでしょうか?
>がるさん
出来ました。有難うございます!
すいません、もう一つ質問なんですが

<?php
for($a = 0; $a < $_SESSION['count']; $a++ ) {
$samp = ( $_SESSION['abc'.$a] ) * ( $_SESSION['cba'.$a] );
    print "$samp";
}?>

この
( $_SESSION['abc'.$a] ) * ( $_SESSION['cba'.$a] )を$a回分足すにはどうやってかけばいいのでしょうか??

( $_SESSION['abc0'] ) * ( $_SESSION['cba0'] )+
( $_SESSION['abc1'] ) * ( $_SESSION['cba1'] )+
( $_SESSION['abc2'] ) * ( $_SESSION['cba2'] )....
みたいな式にしたいんですが・・・
To アスマ先生さん#965

んでは、逆に質問を。
少し要素を省いて…

print "Trap\n";

この行を「$a回」繰り返すfor文は、書けますか?
うーん・・・

for($i = 0; $i <= $a; $i++ ) {
print "Trap\n";
}

ちょっとわからないです(ーー;)
Googleで
「1から10まで足すプログラム」
とか検索してみてはいかがでしょうか?

どの言語でもfor分とかは似てますし
To アスマ先生さん#967
概ね正解です。

正しくは、forのところは
for($i = 0; $i <= $a; $i++ ) {
ではなくて
for($i = 0; $i < $a; $i++ ) {
になりますが。
# この辺は、理由が分からなかったら、調べてみてください。

では、次の質問です。
for文を使って「1から10まで」の足し算をしてみてください。
$a=0;
for($i = 1; $i <= 10; $i++ ) {
$a=$a+$i;
}
であってますか?
To アスマ先生さん#970

はい、あってます ^^
では、本題の直前を一つ。

問題
( $_SESSION['abc'.$a] ) * ( $_SESSION['cba'.$a] )
の値を、$aが0から$aの値になるまで、for文で出力してみてください。
#967 のプログラムと、非常に似たものになると思います。
できれば、出力は

$abc_num = ( $_SESSION['abc'.$a] ) * ( $_SESSION['cba'.$a] );
print $abc_num . "\n";

としておくと、次の手を打ちやすいですね ^^

for($i = 0; $i <= $a; $i++ ) {
$abc_num = ( $_SESSION['abc'.$a] ) * ( $_SESSION['cba'.$a] );
}
print $abc_num . "\n";
ですかね?

ちょっと上の問題をもとに改めて考えてみたんですけど
$sum=0;
for($a = 0; $a < $_SESSION['count']; $a++ ) {
$samp = ( $_SESSION['abc_'.$a] ) * ( $_SESSION['cba_'.$a] );
$sum=$sum+$samp;
}
print '$sum';
でどうですかね?
To アスマ先生さん#972

はい、それが、#965 の回答になります ^^
こんな風に「分解しながら」追いかけていくと、ゆっくりではありますが、分かるようになるんじゃないかと思いまして。
ちと長い道のりでしたが、誘導させてもらいました。

何かの参考になれば幸いです ^^
>972
最後が惜しい。
> print '$sum';
だと $sum と言う文字列そのものが表示されてしまいます。
あ、しもたw

To MADさん#974
突っ込みありがとうございます。
ダブルクォーテーションである必要がありますね(苦笑
なるほど・・・。
大変勉強になりました。有難うございます(^^)
質問させて下さい。

PHPUnitを導入して、テストケースを書いているのですが、これって仕組み上、自分が実装したエラーは拾ってくれないのでしょうか?


環境は
XAMPP 1.7.3
Eclipse
MakeGood
PHP 5.3

症状としては、例外処理のテストの時、テストスクリプトは例外処理を投げかけているのは明らかなのに、Eclipseがコンソールに例外処理によって投げかけられるエラーメッセージを表示してプログラムが終了してしまいます。

コードはこんな感じです。

class StackTest extends PHPUnit_Framework_TestCase
{
public function testVariablesAssignFunction()
{

$this->setExpectedException('InvalidIntvalException');

$num = intval('xxxx');
VariableChecker::isIntval($num, 'E_THROWS');

$this->getExpectedException('InvalidIntvalException');
}
}

VariableChecker::isIntval($num, 'E_THROWS');
ここで$numが整数型でないと(内部処理は$numが0かどうかで判断してますが)、例外InvalidIntvalExceptionを投げかけます。第2引数で処理タイプを変えていて、'BOOL'で真偽を返して、'HEADER_404'で指定されたURLに転送処理、みたいな感じのクラスです。

上記のコードを実行すると、Eclispeのコンソールで例外処理が行われているのは確認できるのですが(文字化けしているがエラーメッセージが表示される)、MakeGoodのバーは反応しません。

PHPUnitのマニュアルをみても、なんだか分からなかったので、分かる方よろしくお願いします。



***************
***************
VariableCheckerの抜粋です



<?php

require_once 'InvalidIntvalException.php';

class VariableChecker
{
/**
* フラグ
*/
public static $flag = TRUE;

/**
* 変数が数字型かどうか調べる
*
* @param int $number
* @param string|null|E_THROWS|HEADER_404|BOOL $processType
* @return mixed
*/
public function isIntval($number, $processType = null)
{
self::$flag = TRUE;

if (0 == $number) {
self::$flag = FALSE;
}

switch (self::_getProccessType($processType))
{
// 例外を投げる
case 'E_THROWS':
try
{
if (false === self::$flag) {
throw new InvalidIntvalException();
}
} catch (InvalidIntvalException $e)
{
die($e->getErrorMessage($number));
}
break;

// 404ページに移動する
case 'HEADER_404':
//return header($string);
break;

// boolean型を返す
default:
return self::$flag;
}

return self::$flag;
}

/**
* 処理タイプを決める
*
* @param string|null|E_THROWS|HEADER_404|BOOL $processType
* @return string 処理タイプ
*/
private static function _getProccessType($processType)
{
if (preg_match('@E_THROWS@', $processType)) {
return 'E_THROWS';
}

if (preg_match('@HEADER_404@', $processType)) {
return 'HEADER_404';
}

if (null === $processType || preg_match('@BOOL@', $processType)) {
return 'BOOL';
}
}
}

?>
>979
mb_send_mailを使えば簡単にメール送信はできますので、勉強がてら自作されてもいいかも。
>981
http://masago.kir.jp/php20030617.php
ここなんかわかりやすいかな。
mailtoとmailfromとsubjectとcontentが決まればこれぐらいでメール送信は完了。
postされた値をはめ込んでいくだけになるでしょう。
初めてこちらで質問させて頂きます、至らない点も多々ありますが宜しくお願い致します。
今フォームを作っているのですが下記リンク先の様な動きをしたいのですがどの様にすればいいのか思いつかず困っております・・
どなたかご教示頂けませんでしょうか?

https://secinfo.citizen.co.jp/riqs/RIQSO00100.php

【希望の動き】
?同一ページ内でエラーログを表示させる
?入力した内容はそのままキープ
?エラーの表示箇所が例同様入力フォーム近くで表示される
?問題なければ確認ページへ移動、送信で完了の流れを想定

PHP Version 5.3.1
Apache/2.2.14 (Win32)
OS:XP

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>お問い合わせフォーム</title>
<link rel="stylesheet" type="text/css" href="css/layout.css">
</head>
<body>
<div id="page">
<div id="header">
<h1>お問い合わせフォーム</h1>
<p><hr></p>
</div>

<div id="main">
<div id="wrap">
<div id="title">
<form action="form_check.php" method="post" name="fname1">
<table class="sample">
<tr><td>お名前<img src="img/mfp_must.gif" width="30" height="16" alt="必須"></td><td><input type="text" name="namae" size="20" maxlength="35"> (全角入力:[例] 山本 太郎)</td></tr>
<tr><td>フリガナ<img src="img/mfp_must.gif" width="30" height="16" alt="必須"></td><td><input type="text" name="kana" size="20" maxlength="35"> (全角カタカナ:[例] ヤマモト タロウ)</td></tr>
<tr><td>性別</td><td>男性<input type="radio" name="sex" value="男性"> 女性<input type="radio" name="sex" value="女性"></td></tr>
<tr><td>年齢</td><td><select name="age">
<?php
for($i = 16; $i <= 80; $i++) {
print '<option value="' . $i . '">' . $i . '歳</option>';
}
?>
</select></td></tr>
<tr><td>メールアドレス<img src="img/mfp_must.gif" width="30" height="16" alt="必須"></td><td><input type="text" name="mail_add" size="40" maxlength="100"><br> (半角英数字:[例] test123@test.com)</td></tr>
<tr><td>電話番号<img src="img/mfp_must.gif" width="30" height="16" alt="必須"></td><td><input type="text" name="tel" size="20" maxlength="20"><br> (半角数字:[例] 03-1234-5678、090-1234-5678)</td></tr>
<tr><td>ご住所 (郵便番号)<img src="img/mfp_must.gif" width="30" height="16" alt="必須"></td><td><input type="text" name="zip21" size="4" maxlength="3"> - <input type="text" name="zip22" size="5" maxlength="4" onKeyUp="AjaxZip3.zip2addr('zip21','zip22','pref21','addr21','strt21');"> (自動でご住所が入力されます)</td></tr>
<tr><td>ご住所 (県名)<img src="img/mfp_must.gif" width="30" height="16" alt="必須"></td><td><input type="text" name="pref21" size="10"></td></tr>
<tr><td>ご住所<br> (市区郡町村・番地)<img src="img/mfp_must.gif" width="30" height="16" alt="必須"></td><td><input type="text" name="addr21" size="30"> [例] 港区芝2-3-31</td></tr>
<tr><td>ご住所 (建物名)<img src="img/mfp_must.gif" width="30" height="16" alt="必須"></td><td><input type="text" name="strt21" size="30"> [例] 芝パークタワー201</td></tr>
<tr><td>お問い合わせ内容<br>(複数選択可)</td>
<td><input type="checkbox" name="q1" value="商品に関して">商品について
<input type="checkbox" name="q1" value="ご使用方法">ご使用方法
<input type="checkbox" name="q1" value="お支払いについて">お支払いについて<br>
<input type="checkbox" name="q1" value="キャンペーンについて"> キャンペーンについて
<input type="checkbox" name="q1" value="その他">その他
</td></tr>
<tr><td>お問い合わせの内容の詳細をご記入下さい。</td><td id="kotei"><textarea rows="10" cols="50" name="data" value="お問い合わせ内容をご記入下さい。"></textarea></td></tr>
</table>
<p id="bottan"><input type="submit" value="確認"><input type="reset" value="リセット"></p>
</form>
</div>
</div>
</div>

<div id="footer">
<p><hr></p>
<p></p>
</div>
</div>
</body>
</html>
> 984

サンプルとして提示されたURLの処理系は、1から3まではjQuery、4以降はPHPだと思われる。

『jQeruy フォーム』とかの検索でサンプルならいくらでもヒットすると思うが、確実に実装したいなら、『jQueryデザイン入門』あたりの書籍がオススメ。
ニックザレコードさん



的確かつ身になるご回答ありがとうございます^^
早速調べてみて確認してみます!

また不明点あればご質問させて頂くことあるかも知れませんが何卒よろしくお願いします。
> 986

JavaScript等のコードなら普通のCSSみたいにhead要素から確認出来るので、サンプルサイトのコードを確認してみるのが手っ取り早いかも。うまく行けば、ちょっとサンプルサイトのJavaScriptを改造するだけで目的の動作を実装出来る可能性もある。

だけど今日日ウェブで何かを表現する人間なら、jQuery程度は自分で実装できても良いと思う。サイト構築経験がある者なら、ズブの素人がHTML+CSSを最初から覚えるよりは比較にならんくらい簡単なんだし。

**********************************************************************
>>>987/ニックザレコードさん

遅くなりましたが先日は的確なご教示ありがとうございました^^
お陰様でJQuery実装の元意図した動きがサクッと完成致しました♪
ホンマにありがとうございました!
**********************************************************************




984でご質問させて頂いたものです、新たにご質問させて下さい!


【環境】
PHP Version 5.3.1
Apache/2.2.14 (Win32)
OS:XP

【サンプルソース (※「form.php」のソース抜粋) 】
<?php
session_start();
?>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>お問い合わせフォーム</title>
<link rel="stylesheet" type="text/css" href="css/layout.css">
</head>

<body>
<?php
/*▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼
?入力内容のXSS対策
?変数へ格納
?「form_check.php」から戻った際の入力内容保持セッション処理
?エラー判定
▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲*/

//■名前
$n = trim(htmlspecialchars($_POST['namae'], ENT_QUOTES));
$_namae = $n;
$_SESSION['namae'] = $_namae;
if ($_SESSION['namae'] == "" ) {
$ERR = "<font color=\"#ff3333\">文字が入力されておりません。</font><br>";
} elseif (preg_match("/^[a-zA-Z0-9]+$/", $_SESSION['namae'])) {
$ERR = "<font color=\"#ff3333\">「漢字」か「ひらがな」しかご入力頂けません。</font><br>";
}
?>

<form action="<?php print $_SERVER["SCRIPT_NAME"]; ?>" method="post">
<table class="sample">
<tr><td>お名前:</td><td><input type="text" name="namae" value="<?php print($_SESSION['namae']); ?>" size="20" maxlength="35"> (全角入力:[例] 山本 太郎)<br>
<?php print($ERR); ?></td></tr>
</table>
<p id="bottan"><input type="submit" value="確認"><input type="reset" value="リセット"></p>
</form>


【予定している流れ】
?<form.php>


■入力内容のチェックを同一ページで実施
■内容が全て揃った段階で?に移動し入力内容の確認ページへ移行する。
※現時点で入力内容が入っていない判定が最初に実施されてしまう為にエラー表示がデフォルトで表示されているのですがこれを回避したいです。


?<form_check.php>


■問題無ければ送信ボタンで?へ以降
■修正を改めてかける時、戻るボタンで?に戻った際には入力内容が保持されている


?<send.php>



上記を行うためにはどうすれば宜しいでしょうか?
宜しければサンプルソースを頂戴できれば幸いです(汗)
どうぞ宜しくお願い致します!!




> 988

form.phpのみだけどこんな感じ?





<?php
session_start();

/*▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼
?入力内容のXSS対策
?変数へ格納
?「form_check.php」から戻った際の入力内容保持セッション処理
?エラー判定
▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲*/

$n = '';
$ERR = '';

if (true === isset($_POST['namae'])) {
$n = trim(htmlspecialchars($_POST['namae'], ENT_QUOTES));
}

$_SESSION['namae'] = $n;

$flag = TRUE;

if (false === isset($_SERVER['HTTP_REFERER'])) {
$flag = FALSE;
} elseif ($_SESSION['namae'] == ""
&& 1 == preg_match('/form.php\z/', $_SERVER['HTTP_REFERER'])) {
$ERR = "<font color=\"#ff3333\">文字が入力されておりません。</font><br>";
$flag = FALSE;
} elseif (preg_match("/^[a-zA-Z0-9a-zA-Z0-9 -Λ]+$/", $_SESSION['namae'])) {
$ERR = "<font color=\"#ff3333\">「漢字」か「ひらがな」しかご入力頂けません。</font><br>";
$flag = FALSE;
}

if (true === $flag) {
$replacement = preg_replace('/form.php/', 'form_check.php',
$_SERVER["SCRIPT_NAME"]);
header("Location: $replacement");
}

?>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>お問い合わせフォーム</title>
<link rel="stylesheet" type="text/css" href="css/layout.css">
</head>

<body>

<form <?php print $_SERVER["SCRIPT_NAME"]; ?>" method="post">
<table class="sample">
<tr>
<td>お名前:</td>
<td><input type="text" name="namae"
value="<?php print($_SESSION['namae']); ?>" size="20"
maxlength="35"> (全角入力:[例] 山本 太郎)<br>




<?php print($ERR); ?></td>
</tr>
</table>
<p id="bottan">
<input type="submit" value="確認"><input type="reset"
value="リセット">
</p>
</form>
> 989

いやぁ、今動かしてみたら、全然動かないね冷や汗

何をやったかと言うと、フォームの入力をチェックするページのアクセス元を調べて、それによって処理を振り分けようかなって感じのこと。

余力があったら書き直して再度ポストします。
> BonJinさん

下らない質問をお許しください。PHPファイルでしょうか?HTMLファイルとしてセーブしてませんか?
後PHPが動く環境に正しくセットしていますか?
> BonJinさん

WEBスクリプトで最初に引っ掛かる環境の話ですね。私はPHPファイルはPHPとして保存することをおすすめします。
何事も明示的にすることで他人(この場合未来の自分も含む)が困らないように…PHPだからPHPファイルに保存したほうがいいと感じます。

私が申し上げたのはPHPが動かない静的環境をサーバー側が与えてくれているときもあるので確認のためにしました。

できればテストはHello Worldにして欲しいと古参の思いです。
質問させて下さい。

さくらのスタンダードでPEARのDB_DataObjectを使いたいと思っています。パッケージを全部インストールしたんですが、最後のデータベース操作ファイルの作成が上手くいきません。たぶんコマンドが間違っていると思うのですが、あまりサーバー周りに詳しくなく、良く分かりません。


試したコマンドは

%cd 接続情報ファイルのあるディレクトリ
%php /home/アカウント名/pear/PEAR/DB/DataObject/createTables.php 接続情報ファイル


ディレクトリやファイル名自体は間違いがなく入力されてます。たぶん、phpってコマンドじゃ動作してないので他のコマンドだと思うんですが、分かる方お願いします。一応XAMPPで動かした時は上記のコマンドで行けたんですが。。。


さくらはPHP5.3で動かしています。
> 999

自己レスです。

サーバーを変えたり、コマンドを変えたり、5時間くらい格闘してたんですが、結局集中力が持たず、PEARのライブラリの中身を書き換えてデータベース操作ファイルを作成しました(所要時間10分げっそり)。

全然スマートじゃないですが、目的の動作は確認できたので良しとしておきます冷や汗

ログインすると、残り970件のコメントが見れるよ

mixiユーザー
ログインしてコメントしよう!

Let's PHP 更新情報

Let's PHPのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング