プログラムの書き方について分からない点があります - PHPプロ!Q&A掲示板

2223

  • 0P

プログラムの書き方について分からない点があります

質問日時 / 2009年8月23日 19:22    回答数 / 12件

Questioner:  dejavu  このエントリーをはてなブックマークに追加 

キーワード / Smarty    Apache2    正規表現   

PHP初心者です。
最初は正規表現の書き方についてです。
  1. preg_match("/(\S+) \S+ \S+ \[(\S+) \S+\] \"([A-Z]+) (\S+) (\S+)\" (\S+) (\S+)/",$this->line,$this->result);
  2. preg_match("/(\d+)\/(\w+)\/(\d+):(\d+):(\d+):(\d+)/",
  3.           $this->result[2],$this->dame);

  1. preg_match("/(\S+) \S+ \S+ \[(\S+)\S+\] \"([A-Z]+) (\S+) (\S+) \"(\S+) 
  2. (\S+)/", $this->line, $this->result);
  3. preg_match("/(\d+)\/(\w+)\/(\d+):(\d+):(\d+):(\d+)/", 
  4. $this->result[2], $this->dame);

上に書いた正規表現が正しく、下に書いた正規表現が間違っています。
でも、どこが違うのか私の目では区別がつきません。
一体何が間違っているのでしょうか。

もう1つ分からないソースコードがあります。
  1. $this->qstring = "insert into logging (address, hidstuke, command,
  2.              dir, version, status, tsize) values ('".$this->result[1].
  3.              "',$this->toda,'".$this->result[3]."',                   
  4.                              {$this->result[6]},{$this->tsize})";
この'"変数"'の囲んでるダブルとシングルのクォーテーションは何を意味しているのでしょうか。
質問は以上の2点です。
アドバイスどうぞ宜しくお願い致します。

この質問への意見の募集は締め切られ、ポイントは既に配分されました。
意見を投稿することはできますが、ポイントを受け取ることはできません。



ツリー一覧

┗A01magicflute2問題解決能力を向上させたほうがいい。 どこが違う
 ┗A01-1dejavuアドバイスありがとうございます。 >どこが違うか
  ┣A01-1-1magicflute2『コピペ』して『並べたり』といっています。 つまり
  ┃┗A01-1-1-1dejavu随分失礼をしました。 申し訳ありません。 最初のレ
  ┃ ┗A01-1-1-1-1magicflute2とにかく、値が入った直後にでも、var_dump()する。
  ┃  ┗A01-1-1-1-1-1dejavu重ね重ねのアドバイス痛み入ります。 var_dump()の使
  ┃   ┗A01-1-1-1-1-1-1magicflute2>>CODE <?php var_dump(toda); // クラス
  ┗A01-1-2signal> 確かに今書いているプログラムはテキスト(書籍)のも
   ┗A01-1-2-1dejavu少し今回のレスについて幾つかお訊きしたくてレスを書
    ┗A01-1-2-1-1signal> 何ゆえそう思われるのでしょうか。 逆に「なぜそ
     ┗A01-1-2-1-1-1dejavuわざわざアドバイス頂き、感謝いたします。 >逆に
      ┗A01-1-2-1-1-1-1signal> 本当にゼロから始めろ、という事でしょうか。 違

回答一覧

並び替え:

A01 参考になった
answerermagicflute2 [8月23日 21:28]

問題解決能力を向上させたほうがいい。

どこが違うかなんて、テキストエディタにコピペして並べたり、差分機能を使えばできますよね。
それに、正しいコードというなら、そっちを使えばいい。
(間違いへの興味という事かもしれないけど)

$this->qstringをechoしてみましたか?
ダブルクォーテーションのとなりにピリオドがありますので、
文字列連結していると判断できますよね。

シングルクォーテーションのとなりは、カンマ。
文字列をINSERTする時に必要だからでしょう。
(SQL文は初めてではないはずですが)

この意見に回答する

ツリーへ TOPへ

A01-1
replyerdejavu [8月23日 22:06]

アドバイスありがとうございます。

>どこが違うかなんて、テキストエディタにコピペして並べたり、差分機能を使えばできますよね。
>それに、正しいコードというなら、そっちを使えばいい。

確かに今書いているプログラムはテキスト(書籍)のものでサンプルもありますし、コピペも可能です。
ですが、何が間違っているのか知りたいのです。
それをコピペで済ましてしまうと次もまたエラー表示が出てしまうでしょう。
仮に私がPHP5によるHP作成の仕事をするとした場合、正規表現の問題にぶつかる可能性もあります。
そのためにも、何が間違っているのかを知っておきたいのです。

>$this->qstringをechoしてみましたか?

いいえ、これから試してみます。

>ダブルクォーテーションのとなりにピリオドがありますので、
>文字列連結していると判断できますよね。

文字を連結という事は'"と変数を繋いでいるわけですよね。
ならば、ピリオド無しで最初から'"でくくる訳にはいかないのでしょうか。
また最後の部分は{}で閉じられています。
それなら、全部に{}で閉じてもいいのではないか、とも思うのですが。
まだSQL文の書き方を理解していないのかもしれません。
例えば、'(シングルクオーテーション)で括っているので"(ダブルクォーテーション)の必要性がまだわかりません。

この意見に回答する

ツリーへ TOPへ

A01-1-1
replyermagicflute2 [8月23日 22:50] (最終編集:8月24日 07:45)

『コピペ』して『並べたり』といっています。
つまり、サンプルと自分のコードを並べて比較せよという事です。(問題発見手段の検討)
直ぐにでも、『ズレ』が見つかるはずです。(問題発見)
それがどういった影響を与えるのかを検討します。(問題認識)
サンプル(正しいコード)にあわせて修正します。(解決方法の実践)

ですので、サンプルをコピペして使用せよとはいっていません。
いずれ仕事でというなら、解決方法を模索して、問題解決能力を養いましょうという事です。
2つのソースを提示しただけでは、他人にデバッグしてくださいといっているようなものです。

>それなら、全部に{}で閉じてもいいのではないか、とも思うのですが。
自分は、逆の考えをとります。
{}が必要ないと判断し、その部分も文字列連結に置き換えて記述します。
--追記
本来なら、文字列連結か{}に統一すべきでしょうが。

  1. echo "合計金額は {$hoge}円です。";
自分は、各命令や変数を色分けしてくれるエディタを使用しています。
上記の記述方法だと、変数を含む""の範囲全体が、文字列を表す色になってしまい、
変数を表す色ではなくなってしまいます。
これでは、デバッグの時に見落としてしまう恐れがあるので、
""内で変数を展開する場合、文字列連結で記述します。
  1. echo "合計金額は ".$hoge."円です。";
また、実行速度も、文字列連結の方が速いです。

--

>例えば、'(シングルクオーテーション)で括っているので"(ダブルクォーテーション)の必要性がわかりません。 
シングルクォートは、SQL文の記述に必要な『文字!!』として使用したいんですよ?

とにかく、$this->qstringをechoして、文字列連結の後に、
"(ダブルクォーテーション)、'(シングルクォーテーション)が残っているかを調べる。
そのSQL文を、'(シングルクォーテーション)の有無でどう結果が違うか試す。

この意見に回答する

ツリーへ TOPへ

A01-1-1-1
replyerdejavu [8月24日 19:59] (最終編集:8月26日 21:05)

随分失礼をしました。
申し訳ありません。
最初のレスの書いている内容を誤解して読み違えてしまいました。
要は、それくらい自分で調べろって事ですよね。
確かに、投げやり的な質問でした。
お恥ずかしい限りです。

>とにかく、$this->qstringをechoして、文字列連結の後に、
"(ダブルクォーテーション)、'(シングルクォーテーション)が残っているかを調べる。

SQL文の値を書く場合数字以外は'(シングルクォーテーション)で括るのは分かっていたつもりです。
恥を忍んでお訊きしますが以下の関数 readLog2writeDB() のどの部分で echo $this-qstring; を挿入すればいいのでしょうか。
  1. function readLog2writeDB() {
  2.  if ($this->fp = fopen($this->directory.$this->LGfile, "r")) {
  3.    if ($this->db = sqlite_popen($this->directory.$this->DBfile,0660,$sqliteerror)) {
  4.       while (!feof($this->fp)) {
  5.   $this->line = fgets($this->fp);
  6.   preg_match("/(\S+) \S+ \S+ \[(\S+) \S+\] \"([A-Z]+) (\S+) (\S+)\" (\S+) (\S+)/",$this->line,$this->result);
  7.   preg_match("/(\d+)\/(\w+)\/(\d+):(\d+):(\d+):(\d+):(\d+)/",$this->result[2],$this->dame);
  8.         $this->toda = mktime($this->dame[4],$this->dame[5],$this->dame[6],
  9.         $this->month[$this->dame[2]],$this->dame[1],$this->dame[3]);
  10.           if ("" != $this->result[1]) {
  11.             if ("-"==$this->result[7]) {
  12.             $this->tsize = 0;
  13.           }else{
  14.             $this->tsize = $this->result[7];
  15.           }
  16.           $this->qstring = "insert into logging (address, hidstuke, command, dir, version, status, tsize) values
  17.                           ('".$this->result[1]."',$this->toda,'".$this->result[3]."','".$this->result[4]."',
  18. '".$this->result[5]."',{$this->result[6]},{$this->tsize})";
  19.           $this->qresult = sqlite_query($this->db, $this->qstring);
  20.          }
  21.   }
  22.   sqlite_close($this->db);
  23.       }
  24.       fclose($this->fp);
  25.   }
  26. }
1度表示されたのですが、 insert into logging (address, hidstuke, command, dir, version, status, tsize) values までしか表示されませんでした。
それと同時に、以下に変数を書きますが、
 protected $result;  // 行を分解した配列
 protected $dame;    // 日付を分解
 protected $toda;    // 日付を分解
この3つの変数の意味も良く分かりません。
なので、配列の数字が何を意味しているのかも分かりません。
SQL文は理解できますが、値の挿入部分の変数や配列が何を意味しているのか分かりません。
分かる方がいましたら、教えて頂きたいです。

この意見に回答する

ツリーへ TOPへ

A01-1-1-1-1 満足
replyermagicflute2 [8月25日 19:43]

とにかく、値が入った直後にでも、var_dump()する。
$this->result、$this->dame、$this->todaも同様。

ソースを逆に辿って行けば、$this->LGfileにたどり着くでしょ?
access.logとvar_dumpの結果を見比べればいい。
(access.logの中身なんて、こちらが知る由もない)

この意見に回答する

ツリーへ TOPへ

A01-1-1-1-1-1
replyerdejavu [8月26日 11:30]

重ね重ねのアドバイス痛み入ります。
var_dump()の使用方法は以下ので宜しいでしょうか。
  1. $this->toda = mktime($this->dame[4],$this->dame[5],$this->dame[6],
  2.         $this->month[$this->dame[2]],$this->dame[1],$this->dame[3]);
  3. var_dump(toda);
  4. print_r(toda);
  5.  
  6.  
  7.  $this->qstring = "insert into logging (address, hidstuke, command, dir, version, status, tsize) values
  8.                           ('".$this->result[1]."',$this->toda,'".$this->result[3]."','".$this->result[4]."',
  9. '".$this->result[5]."',{$this->result[6]},{$this->tsize})";
  10. $this->qresult = sqlite_query($this->db, $this->qstring);
  11. var_dump(qresult);
  12. print_r(qresult);
まずこのプログラムを利用するメインプログラムが30秒以上かかっても画面を表示できず、エラーがでますので、今一結果が分からないのですが。
このやり方で問題無いならば、残念ながら私の脳みそでは変数$toda,$dame,$resultについて何の値を表示するものか、何故配列なのか永遠に理解できないでしょう。

この意見に回答する

ツリーへ TOPへ

A01-1-1-1-1-1-1 満足
replyermagicflute2 [8月26日 20:00]

  1. <?php
  2. var_dump(toda);           // クラス変数を扱うから$this->を付けないと
  3. var_dump($this->toda);    // すると、こうなる
  4.  
  5. var_dump(qresult);        // なんか質問と違うのがでてきたよ
  6. var_dump($this->qresult)// qresultならこうする
  7.  
  8. var_dump($this->result);  // 質問では、resultでしょ
  9.  
  10. var_dump(dame);           // これ、無いね
  11. var_dump($this->dame);    // これはこうする

*前回の質問『ログファイルがうまく表示されません』(以降 前)より

>テキスト(書籍)に則って既存のログファイルを加工するプログラムを作りました。
とあるんだから、access.logファイルの中からほしい箇所を、
正規表現を使って取ってこようとしているのでしょう。
・前71行:fopenでaccess.logファイルを開く
・前75行:ファイルの終端にくるまで、whileでループ
・前76行:fgetsで一行ずつ取り出し、$this->lineに入れる
・前77行:$this->lineから正規表現でマッチした部分を、$this->result(配列)に格納
・前78行:$this->result[2]から正規表現でマッチした部分を、$this->dame(配列)に格納
・前81行:$this->dameの日付をタイムスタンプにし、$this->todaに格納
実際にaccess.logに何が入っているかは、当方にはわかりませんので。
一つ々々、var_dump($this->hoge)して、access.logと見比べるしかないでしょう。

>メインプログラムが30秒以上かかっても画面を表示できず
書籍のコードが正しいなら、まずはそちらで動作確認しては?
まさかとは思いますが、sqliteや、access.logファイルは存在しますよね。

この意見に回答する

ツリーへ TOPへ

A01-1-2 参考になった
replyersignal [8月24日 08:42]

> 確かに今書いているプログラムはテキスト(書籍)のものでサンプルもありますし、コピペも可能です。

コピペして少しいじるだけじゃ上達しません
もっと簡単な本から始めたほうがよさそうです
それと正規表現、SQLの初心者向けの本も読んでみたらどうでしょうか?

> 仮に私がPHP5によるHP作成の仕事をするとした場合、

「仮に」の話ですが・・・
ここで質問する人が仕事を請け負ってはいけないと思います
その仕事に関わる全ての人に対して失礼であり迷惑です

> 例えば、'(シングルクオーテーション)で括っているので
> "(ダブルクォーテーション)の必要性がまだわかりません。

変数に入ってる内容くらい表示させましょう

この意見に回答する

ツリーへ TOPへ

A01-1-2-1
replyerdejavu [8月26日 11:53]

少し今回のレスについて幾つかお訊きしたくてレスを書きました。

>もっと簡単な本から始めたほうがよさそうです

何ゆえそう思われるのでしょうか。
確かに難しくないと言えば嘘になり、今回のようなログファイルをいじるプログラムに関しては変数が何を表示させたいのか分からずにいます。
これだけでも十分signalさんの忠告を受け入れるべきかもしれませんが、それよりも今まで質問してきた内容も含めてそう思われるのかどうかお答えしてはもらえませんでしょうか。

>それと正規表現、SQLの初心者向けの本も読んでみたらどうでしょうか?

正規表現に関してはご忠告のとおりだと思い、ただ今自分にあった正規表現について書かれた本を探し中です。
もし、お薦めの本があるなら教えて頂けると幸いです。

>変数に入ってる内容くらい表示させましょう 

これはどういう意味でしょうか。
magicflute2さんと同意見と考えて宜しいでしょうか。
違うのならば、signalさんのご意見をお聞かせ頂けないでしょうか。

最後に……。
私はこのテキスト(書籍)に関するプログラムのエラーについて出版元の問い合わせフォームに書き込みました。
2つとも極めて重要な部分だと思ったからです。
返答が返ってくるのかどうかは分からないですが、私としては解答してもらえるものだと思っています。
また、今のテキスト(書籍)は既に全ページ数の半分以上を過ぎており、できれば1度全てを終わらせてから既に見つけてある新たな初心者向けのテキスト(書籍)をやっていくつもりでいます。

ただ、今までの実感としてPHPという言語が様々な意味でつかみどころのないプログラム言語だと認識しており、私はこのままPHPを学んだとしても、HP作成の仕事につけるかどうか非常に不安感を覚えるようになりました。
もし宜しければ、その事に関して無理なのかどうか努力すれば可能なのかどうか示唆して頂けると大変有り難いです。
アドバイスどうぞ宜しくお願い致します。

この意見に回答する

ツリーへ TOPへ

A01-1-2-1-1 満足
replyersignal [8月26日 13:53]

> 何ゆえそう思われるのでしょうか。

逆に「なぜそう思わないのでしょうか?」
プログラム(PHP)の基礎ができてないから、毎回「自分の英語がネイティブに通じません」
みたいな質問をされているのではないですか?

ClassもSQLもPearもPHPを学んでいく上で欠かせない知識であり技術だと思います
ただ現状の基礎すらできていない初心者が欲張りすぎです

なので、まず初心に戻ってPHPについて学ぶ必要があるのではないかと思いました


> お薦めの本があるなら教えて頂けると幸いです。

正規表現はとても奥が深いです
ログの解析や、スクレイピング程度のことでしたら厚さ1cm未満の書籍で十分でしょう

Perlのサイトですが
http://www.rfs.jp/sb/perl/02/09.html
preg_*** シリーズなら同じものが使えます


> magicflute2さんと同意見と考えて宜しいでしょうか。

そういうことです

--
dejavuさんはPHPを難しく考えすぎです
PHPなんてプログラミング言語で一番簡単ではないかと思えるほど簡単です

難しく思えるのは、PHPに付随する技術(SQLや正規表現などなど)を
同時に学ぼうとしているからだと思います

個人的には書籍やPear、SQL、正規表現など全く忘れて
簡単なチャットや掲示板を0から作ることをオススメします

すっごい考えて悩んで作ることから始めてみてください

参考まで PHP関数マニュアル
http://www.php.net/manual/ja/indexes.php

この意見に回答する

ツリーへ TOPへ

A01-1-2-1-1-1
replyerdejavu [8月26日 15:47]

わざわざアドバイス頂き、感謝いたします。

>逆に「なぜそう思わないのでしょうか?」
>プログラム(PHP)の基礎ができてないから、毎回「自分の英語がネイティブに通じません」
みたいな質問をされているのではないですか?

なるほど、見る人から見るとそういうに感じるのですね。
私は変な誤解をしていましたが、私の勉強のやり方がそもそも間違っているのでしょうかね。
独学も恐いものですね。

>PHPなんてプログラミング言語で一番簡単ではないかと思えるほど簡単です

そういう風に言われると未来に希望が湧いてきました。

>難しく思えるのは、PHPに付随する技術(SQLや正規表現などなど)を
>同時に学ぼうとしているからだと思います

そうですか。
だから、正規表現やSQLの初心者用の本を買うように薦めてくれたわけですね。
自分にはあらゆる知識が未熟である事を痛感されられますね。
真っ先にダメなのがHTMLなのですが、そこから始めた方がいいのでしょうか。

>個人的には書籍やPear、SQL、正規表現など全く忘れて
>簡単なチャットや掲示板を0から作ることをオススメします

ここに書籍も含まれていますよね。
本当にゼロから始めろ、という事でしょうか。
でも仮にチャットや掲示板を作成するにしてもHTMLの知識が必要不可欠になりますよね。

>すっごい考えて悩んで作ることから始めてみてください

これは上の文章に繋がりますね。
『はい、やってみます』という風に答えても返事だけ威勢がいいようにしか聞こえないと思うので、取り敢えず努力をしてみますと書かせて頂きます。
また、私は先ほど今のテキスト(書籍)に関しては全て終わらせてからまた別のテキスト(書籍)を買うような内容を書きました。
よって、私は今どうするべきか迷っています。
何が言いたいのか。
今のテキスト(書籍)を続けるにあたり、またここへ質問するかもしれません。
それは、signalさんの思いを裏切る事になり、折角頂いたアドバイスを無にする事になります。
なので、やはりここは勉強する順序を変えていかなければならないと思っています。
HTML⇒PHP⇒正規表現⇒SQLというような順番でsignalさんどう思われるでしょうか。

もう一度引用しますが、

>PHPなんてプログラミング言語で一番簡単ではないかと思えるほど簡単です

この言葉を胸にこれから頑張っていこうと思います。

この意見に回答する

ツリーへ TOPへ

A01-1-2-1-1-1-1
replyersignal [8月26日 16:43]

> 本当にゼロから始めろ、という事でしょうか。

違います、ゼロから作ると言うことです
書籍に載ってるサンプルをコピペしていじるだけではなくて
自分の手で <?php から ?> まで書いてみてください

難しいコードを眺めるよりも、簡単なコードを書いたほうが
はるかに勉強になります

プログラマを志してる人にとってHTMLは勉強するなんてほどのものでもないです
無理にデザインを組み込まなければ
  1. <html>
  2. <head>
  3. <title>簡単なHTML</title>
  4. </head>
  5. <body>
  6. こんにちは
  7. </body>
  8. </html>
これで十分なわけですし

なので

> HTML⇒PHP⇒正規表現⇒SQLというような順番でsignalさんどう思われるでしょうか。

それで問題ないと思いますが、HTMLを覚えないとPHPできないわけでもないし
つまらないと思うので

PHP + 簡単なHTML ⇒ 必要な分だけの正規表現 + SQL

でしょうか

質問はいくらでもしてもよいと思います、Q&A掲示板ですし
ただ、書籍からコピペしたコードについての質問は・・・と思いますけど

この意見に回答する

ツリーへ TOPへ

<<質問一覧へ



Pick Up Q&A

Q
動的なURLを静的に見せる方法
 このエントリーをはてなブックマークに追加 
A
普通に考えて、mod_rewrite でしょうね。 http://www.nishishi.com/blog/2006/01/mod_rewrite_url.html...

>>続きを読む

GETのままでは検索エンジンのロボットが拾ってくれなかったためにSEO対策として有効だと言われていますね。

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)