トップページphp
1001コメント334KB

【PHP】初心者コーナー 2 Released

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん03/03/24 03:06ID:???

PHPに関するアホな質問はここでやれ。今回からMySQLも受付開始。
アホな質問であっても詳しく質問すること。

PHPが大嫌いなPerl信者もぜひご参加ください。

前スレ
http://pc2.2ch.net/test/read.cgi/php/1011550860/l50  関連>>2-10

普通の質問はこっちな、【PHP】質問スレッド Part7
http://pc2.2ch.net/test/read.cgi/php/1044478561/l50
0295nobodyさん03/04/12 13:13ID:???
>>294
専有ロックと共有ロックについて調べる。
0296nobodyさん03/04/12 13:24ID:???
排他ロックと言いましょう。
0297nobodyさん03/04/12 13:27ID:???
>>293
いちいち変数名を気にしなければいけない理由が分からない。
0298nobodyさん03/04/12 13:29ID:???
>>297
気にするべきです。
0299nobodyさん03/04/12 13:48ID:???
レキシカルスコープなら、変数が見える範囲を最小限にできるから、
絶対にPHPみたいな関数内でローカルな変数よりも狭くできる。

だから有利だと思うんだけど、どうかね。
0300nobodyさん03/04/12 13:54ID:???
>>299
無用な混乱が起こるに一票。
0301キッチン排他03/04/12 14:00ID:9ZnqNoT4
>>295

レスどうもです。

共有ロック
データを読み込めるが書き込めない

排他ロック
データを読み込みも書き込みも出来ない


つまり、ロックしていなければ、"a"の場合ならばファイルが空になる事はないからデータが
飛ぶって事はないけれども、同時アクセスがあった場合には、先にアクセスした方の
処理は反映されない問題が発生するって解釈で良いのでしょうか。

$fp = fopen("hoge.txt","a");
flock($fp,LOCK_SH);

は、特に意味が無いって事になりますよね?
あれ?違うかな??
ん?共有ロックを使っている場合、後からデータにアクセスした方(B)の処理は、
先にアクセスした方(A)の処理が終わってから行われるって事だと思うのですが、
(B)が読み込むデータっていうのは、(A)が書き込みを終了したデータに
なるんでしょうか?
それならば、納得がいくのですが、(B)が読み込むデータが、アクセスした時点
{(A)が書き込みをする前}のデータならロックする意味がないと思ったので。

排他ロックを使えば、どっちみち問題なしって感じがするんですが。。。
共有ロックの存在意義がないように思うのですが、どうでしょう。

#なんか日本語が変なような感じもするんですけど・・・
0302nobodyさん03/04/12 14:11ID:???
>>300
はぅ…この程度なのか。PHPユーザーって。
0303nobodyさん03/04/12 14:19ID:???
flockシステムコールなら・・・

共有ロック
同時に複数のプロセスがロックできる。

排他ロック
ある瞬間にはたったひとつのプロセスしかロックできない。

共有ロックと排他ロックは同時にかけられない。
030430303/04/12 14:20ID:???
というわけで書き込めるかどうかは関係ない。
ロックをかけようとしなければ書き込めるし。
ロックをかけようとした時に排他ロックがかけられていたら、解除されるまで待つ。
030529003/04/12 14:23ID:???
290です。
あれから色々と検索や書籍で調べてみましたが
局部的なレキシカル可の方法は書いていませんでした。
やっぱり出来ないんでしょうか…。
0306キッチン排他03/04/12 14:27ID:9ZnqNoT4
>>303
レスどうもです。

うーむ、いまいち理解できていない自分が憐れ。
今から仕事に行くので、帰って来てからまたお勉強します。

今、現在の考え。
「とりあえず、排他ロックを使えば問題ないかな。」
です。

では、これにて失礼します。
お付き合いありがとうございました。
0307nobodyさん03/04/12 14:29ID:???
>>306
そだな。何でもかんでも排他ロックすれば取りあえずは安全だ。
今度はデッドロックの恐怖に苛まれることになるが。
0308nobodyさん03/04/12 15:09ID:???
>>305
出来ないからもう調べなくていいよ。
0309nobodyさん03/04/12 15:29ID:???
>>290
PHPとPerlは同じものだと思ってるのか?
いつまでもPerlと同じ書き方すりゃ、そりゃ引っか刈る罠。おまえバカだろ。(w  
031029003/04/12 15:50ID:???
>308
そうですか、出来ないとわかっただけでもスッキリしました。

>309
私はただ、出来るのか知りたかっただけなのですが
何故、あなたがそこまで私を小馬鹿にされるのか解りかねます。
0311nobodyさん03/04/12 17:49ID:???
>>290
局所変数バカと同一人物と思われ、かつ
根本的にコーディングの問題がある事を指摘されたようですね。
がんばってください。
0312nobodyさん03/04/12 19:34ID:???
>>310
309ではありませんが、
if文のブロック内のみ有効な変数を必要とする、コーティングの仕方に問題があると思う。
perlを作っている人もmyをそのような使い方のために作ってのではないと思うけどな。
0313nobodyさん03/04/12 23:55ID:MIn0iMWR
んなあほな。最小限のスコープで記述し、妙なエラーの発生を防ぐっていうのは、近代的な方法だと思うんだけど、違うのか?意見を求む。
0314nobodyさん03/04/13 00:06ID:???
グローバルにした方が都合がよいのならグローバルにする。
もちろんiとかaとかわけのわからん短い名前をつけたり、複数の目的に使ったりするのは御法度だけど。
0315nobodyさん03/04/13 00:34ID:???
>>313
バカにあほといわれた。
ところで、宣言しない限りグローバル変数になってしまうperlが持つレキシカルスコープという
概念を持った処理系って他にあるの?
0316nobodyさん03/04/13 00:38ID:???
そのためのモジュールがあるし、そこら辺は問題ないんじゃないの?<Perl
0317nobodyさん03/04/13 00:40ID:???
というか、よく読んだら>315の言ってる意味が解らないや。
0318nobodyさん03/04/13 00:46ID:???
>>317
スマソ。
perl以外でレキシカルスコープという概念を持った処理系が他にあるの?
って聞きたかったわけ。
0319nobodyさん03/04/13 04:28ID:???
>>318
C++とかJavaとかは

if(hoge)
{
int a;
}

とかするとaは自分の生まれたブロックとその子孫ブロックでのみで生きられる。
0320nobodyさん03/04/13 04:47ID:???
>>319
そうか、それは正直知らん&すまんかった。
Javaでも勉強するとしよう。
0321nobodyさん03/04/13 17:13ID:???
>>319
それがレキシカルスコープなの?もしそうならCにも存在するということになるけど。
0322nobodyさん03/04/13 18:22ID:???
PHP質問スレッドが次スレ立つ前に1000行ってしまってますた。
Part8立てようと思ったけど、ホスト規制で立てられなかったので
誰か親切でエロイ人立ててください。
おながいします。

↓現行スレ
【PHP】質問スレッド Part7
http://pc2.2ch.net/test/read.cgi/php/1044478561/l50
0323nobodyさん03/04/13 18:32ID:???
>>321
そう。しかしPHPには無い。
0324nobodyさん03/04/13 18:45ID:???
>>322
このスレに統合
0325nobodyさん03/04/13 20:37ID:???
今後PHPにも出る可能性があるものだね。
0326nobodyさん03/04/14 00:55ID:???
スレ立てますタ。
【PHP】質問スレッド Part8
http://pc2.2ch.net/test/read.cgi/php/1050249148/
032732203/04/14 01:48ID:???
>>326
 ∧_∧
(  ´∀`)
人 Y /
( ヽ し
(_)_)
スレ立てありがd&乙カレー
0328キッチン排他@職場03/04/14 02:39ID:nGNbFDFK
デッドロック
卵が先か鶏が先かって状態ですよね?
今の所、そんな複雑なスクリプトを書くスキルがないので、デッドロックで
困った時に、困る事にします。

ところでファイルロックについて更に質問なのですが、
$fp = fopen($filename,"a");
ならばロックした方が良いって思うのですが、

$file = file($filename);
とかの場合もロックした方が良いのでしょうか?

今作ってるスクリプトが、おおまかな流れとして以下のような感じなのです。

1. file()関数で現在あるデータを配列に代入
2. foreach()関数でpostされたデータと現在あるデータを照合
3. なければfopen()関数で開いて排他ロック
4. fputs()関数で書き込んでから、ロック解除してクローズ

やはりfile()関数を使った直後にロックを掛けた方が良いのでしょうか?
0329キッチン排他@職場03/04/14 02:47ID:nGNbFDFK
flockは、ファイルポインタが必要・・・
って事は、file()関数の直後でロックする事自体ムリって事ですか・・・

マニュアルちゃんと嫁ですね。
すいません。
0330nobodyさん03/04/14 03:31ID:???
デッドロックは複数のファイルをいじくるようになったら考えろ。

で、その例だと重い処理やユーザが多い場合トラブる。
Aがデータ読む→Bもデータを読む→Aがデータ更新→Bもデータ更新
の時、BはAによる変更がなされていない古いデータを参照、処理している事になる。
fopen→施錠→読む・処理・書き込み→close が正解。

開錠は?と思ったなら手元の本のロック関係の項目を読み返せ。
0331キッチン排他@職場03/04/14 04:52ID:nGNbFDFK
>>330
レスどうもです。

> 開錠は?と思ったなら手元の本のロック関係の項目を読み返せ。
実はまだPHPの本を持ってないんです。(webだけでなんとかやってるんですが)
近い内に、一冊PHP本を買ってみます。

修正前と修正後のソースを晒してみます。

[before]
http://www.kari.to/upload/source/d/1444.txt

[after]
http://www.kari.to/upload/source/d/1443.txt

こんな感じになってますが、ヤバイでしょうか?
0332nobodyさん03/04/14 06:28ID:???
>>331
メールの送信はcloseの後の方がいいんじゃない。
0333nobodyさん03/04/14 11:19ID:f50BSraC
ディレクトリのパーミッションを変更することってできますか?
chomd関数だとどうやらファイルしか扱えないみたいだし、mkdir関数は既存
のディレクトリに対してしかパーミッションの設定が聞かないようなので。
やりたいことは、ファイルのアップロード時に一時的にディレクトリのパーミッションを変更し、
アップが終了したら元に戻すってことです。環境はredhat Apache php4.3.1です。
0334nobodyさん03/04/14 11:21ID:???
>>332の指摘に便乗して便乗質問。
ファイルをオープンしながらその中でいろいろ処理しつつ、
ファイルに書き込んでいくなんて処理はまずいかな?

例えば親記事に返信できる掲示板とかで、
・listでログを配列に全部読み込む。
・wでログファイルオープン
・forで配列をまわす。
・すでにあるログ書き込み。
・返信の親記事発見。
・いろいろと処理(置換したり、入れ替えたり)して親記事と子記事書き込み。
・残り書き込み
・close

こういう場合は予め配列操作しておいた後で、一気に書き込んだ方が
いいのかな?
0335動画直リン03/04/14 11:45ID:ri8n5kTm
http://www.agemasukudasai.com/movie/
0336キッチン排他03/04/14 16:04ID:kFyvhyAa
>>332

レスどうもです。

http://www.kari.to/upload/source/d/1445.txt

クローズしてからメール送信するようにしました。
postされたデータ(A)と現在あるデータ(B)を照合して、BにAがある場合は
エラーを表示させてBにAを反映させず、BにAがない場合は、BにAを追加して
メールを送るというのがやりたかったのですが、やりたい事は出来ました。

施錠・開錠の位置は、これで問題ないのでしょうか?
それと、ちゃんとロックされているかの確認って皆さんどうされてるのでしょうか?

>>333
1.一時的にディレクトリを作って、その中にアップロード
2.アップ完了したら、ファイルを任意のディレクトリへ移動
3.1.で作ったディレクトリを削除

ってのはどうでしょう?
スマートじゃないし、PHP始めたばかりの人間の戯言なので的外れなレスを
返しているかもしれませんが・・・
既存のディレクトリのパーミッションを変える関数があったらごめんなさい。
0337nobodyさん03/04/14 16:17ID:R0bR1Nwj
http://yahooo.s2.x-beat.com/linkvp/linkvp.html
0338nobodyさん03/04/15 08:49ID:???
>>313とその他大勢の話の食い違いは、
同じ変数名を使うことを前提としているかどうかだと思うんだが。
また、変数を定義する順番も。

仮にスベテのブロック内でスコープが適用されるとしても、
$hoge = NULL;
function foo(){
if (true) {
}
}
という形の時に、if内に$hogeという局所変数を追加するような書き方
(たぶん>>293の書き込みがあったから、
こういう書き方をしたいと思ってると決めつけてるんだと思うが)
をするのは問題外だが、
function foo(){
if (true) {
$hoge =256;
}
}
というような形が先にあった場合、

$hogeのスコープを最小限に出来れば、
今後foo()内にスコープを持つ変数や
グローバルスコープの変数を追加する時に、
"うっかり"名前が重複してエラーになる可能性は低くなる。
特に複数人で開発を行う場合はありえない事ではない。
(もちろん注意して、重複しないようにするのが好ましいが)
0339nobodyさん03/04/15 18:01ID:???
そうそう。実際、エラーになってくれればまだ幸せで、それがたまたま文法的に合ってたりすると、、、やっかいな「バグ」の原因になる。
0340nobodyさん03/04/16 00:54ID:???
>>338
>グローバルスコープの変数を追加する時に
>複数人で開発を行う場合はありえない事ではない
関数名が重複しないように悩むことはあっても、
ローカル変数が把握できなくて悩んだことはないね。
それに、関数内に追加したくなるglobal変数なら全員把握するもんでは ?
大体、何のために関数化しているの ? php の開発が特殊なのかな...
0341nobodyさん03/04/16 01:18ID:???
>>340
>大体、何のために関数化しているの ? php の開発が特殊なのかな...

複数人で作業を分担すると、個々の能力が違うわけで
開発規模が大きくなればなるほど、いびつなコードになっていく…ことがあった。
0342nobodyさん03/04/16 06:39ID:???
>>341
全体を複数人でやるのはわかるが、ひとつの関数に複数人が同時に手を
入れることはそうそうないだろう。
0343nobodyさん03/04/16 07:32ID:???
>341
最初の設計が悪いんだよ。
0344nobodyさん03/04/16 09:48ID:???
むやみに小さく関数化させると遅くなるよ。
0345山崎渉03/04/17 12:01ID:???
(^^)
0346nobodyさん03/04/18 02:01ID:???
age
0347佐々木健介03/04/18 02:05ID:???
     ______
    /_      |
    /. \ ̄ ̄ ̄ ̄|
  /  /  ― ― |
  |  /    -  - |
  ||| (5      > |
 | | |     ┏━┓|   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
| | | |     ┃─┃|  < こんなサイトを見つけた
|| | | |  \ ┃  ┃/    \  正直、スマンカッタ
| || | |    ̄         \_________
http://freeweb2.kakiko.com/mona/
0348nobodyさん03/04/18 21:21ID:???
>>340 >>342-344

読む人が一人なら問題は無いんだけどな。お前ら。全然分かってない。
0349nobodyさん03/04/19 13:53ID:PcDRg1R2
プロパティに配列を定義して
その配列にメソッドから要素を追加したいのです。

class Mona {

var $arr = array();

function Mona(){
}

function setValue($value){
//array_push ($this->$arr,$value);
$this->$arr[] = $value;
echo(count($this->$arr));
}
}

$m = new Mona();
$m->setValue("si");
$m->setValue("giko");


どうすればよいのです。
0350nobodyさん03/04/19 14:07ID:???
ちゃんとエラー内容を見てるかい?
$this->arr[] = $value;
0351nobodyさん03/04/19 14:32ID:???
>>350
array_push ($this->$arr,$value);でもエラーだということは、
$arr = array();じゃだめぽですか?
0352nobodyさん03/04/19 14:49ID:???
こう書くと分かりやすいかな。
$this->$arr[] = $value;
$this->arr[] = $value;
0353nobodyさん03/04/19 16:56ID:???
>>352
ありがとうございますて。
現在、ものすごい脱力感に見舞われています。
今後気をつけます。
0354nobodyさん03/04/19 17:55ID:UAxx4/l2
abc.htmlってファイルをオープンして、
abc.htmlに、改めて指定してあるHTMLタグを
書き込んで、
そのファイルを閉じるにはどうすればいいのでしょうか?

いろいろ調べたが分からんので誰か教えてください〜
0355nobodyさん03/04/19 18:06ID:???
>>354
日本語のレベルで変だ。
035635403/04/19 18:09ID:UAxx4/l2
スマソ。そこは見逃して教えてくれませんか?
要はabc.htmlというファイルに指定のタグを書き込み
たいんです。
たとえば、100とかいう数字程度なら分かるんだけど、
タグみたいに長い文字数の場合はどうすればいいのか・・・。
0357nobodyさん03/04/19 18:12ID:???
>>356
$data = file("abc.html");

$fp = fopen("abc.html","w");

fwrite($fp,"<html>");

foreach($dat as $data)
{
fwrite($fp,$dat);
}

fwrite($fp,"</html>");

fclose($fp);


ぱっと思いついたのはこれ。
035835603/04/19 18:32ID:UAxx4/l2
>>357
レスサンクスです。
ただ、perlでは下記みたいな簡単な感じで出来るみたいなんだけど、
phpでもできないですかね?
マジでPHP初心者なんでforeachを使う理由がわからないっす。

open (INDEX, ">index.html") ;
print INDEX "<HTML>\n<HEAD>\n";
print INDEX "<TITLE>$title</TITLE>\n";
print INDEX "</HEAD>\n";
print INDEX "</html>\n";
close (INDEX) ;
0359nobodyさん03/04/19 18:34ID:???
>>356
やっぱり意味不明だよね。

>>たとえば、100とかいう数字程度なら分かるんだけど、
じゃ、この分かるんだけど。っていう分かるを書いてみてよ。
036035603/04/19 18:38ID:UAxx4/l2
$fp = fopen("abc.html","w+");

$count = "100";

fputs($fp, $count);

fclose($fp);

じゃねーの?
0361動画直リン03/04/19 18:40ID:PZJVQOkw
http://www.agemasukudasai.com/movie/
036235603/04/19 18:42ID:UAxx4/l2
この『100』の代わりに
『<HTML><HEAD><TITLE>title</TITLE>
</HEAD></html>』っていうタグを入れたいんだけど。
0363nobodyさん03/04/19 18:44ID:???
>>358

>マジでPHP初心者なんでforeachを使う理由がわからないっす。
file() を調べてみたら、分かるよ。
>>357
は、とあるデータに、htmlタグで囲むだけのサンプルであって、無理に
file を使うこともないし、foreach() を使うことも当然なし。
中に何書きたいか?でしょ。

たんに、
>>358
のようにしたきゃ、fopen() して、fwrite() して fclose() すりゃいい。
ここは、PHP初心者というレベルのものでもないと思うけどね。

だから、PHP初心者ではなく、全部初心者なんでしょ?
なら、素直に、そう書けば、それなりなフォローもつくでしょう。
0364nobodyさん03/04/19 18:48ID:???
>>362

$fp = fopen("abc.html","w");
$data = "<HTML><HEAD><TITLE>title</TITLE></HEAD></html>";
fwrite($fp,$data);
fclose($fp);

エラー処理はしてないけど、まぁ。
0365nobodyさん03/04/19 18:52ID:???
356と363は日本語を上手く使えない罠
036635603/04/19 18:54ID:UAxx4/l2
>>363,364
なるほど。ありがTO〜〜。
ちなみにまぁPHP初心者をプログラム初心者と同義で使ってたよ。
言葉足らずってやつだ。
0367nobodyさん03/04/19 18:56ID:???
>>366
>言葉足らずってやつだ。
意味変わってる。
036835603/04/19 18:57ID:UAxx4/l2
ちなみにfput とfwriteはどうやって使いわけるんだろう。
ま、これは本かなんかで調べるダス。
教えてくれたらうれP〜が
0369nobodyさん03/04/19 18:58ID:???
>>368
改行のあるテキスト用。
0370nobodyさん03/04/19 18:58ID:???
>>368
http://www.php.net/manual/ja/
037135603/04/19 19:02ID:UAxx4/l2
ごめん、もう少し質問。
たとえばタグが<FONT size="5">とかだったら、
$data = "<FONT size="5">";
という風に""がゴッチャにならないのでしょうか?
037235603/04/19 19:04ID:UAxx4/l2
>>369-370
なるほど、そうなんだ。勉強なりました。どもです。
0373nobodyさん03/04/19 19:05ID:???
>>371
エスケープします。

$data = "<FONT size=\"5\">";
0374nobodyさん03/04/19 19:05ID:???
>>371
いいかげんにしないと頃すぞ
037535603/04/19 19:06ID:UAxx4/l2
ワカタ!!エスケープシーケンスって奴を使う??
037635603/04/19 19:07ID:UAxx4/l2
>>373
ありがとうございます。マジで感謝します。
>>374
とりあえずお前がシネヨw
0377nobodyさん03/04/19 19:07ID:???
>>375
DOSのBASICプログラマか何かか?
0378nobodyさん03/04/19 19:09ID:???
今データベース操作のPHPを作っているんですが(MySQL)
データベース接続中にエラー表示でexit;すると、
自動的に切り離ししてくれるんですか?
0379nobodyさん03/04/19 19:10ID:???
>>378
最悪コネクション切れるからなぁ。
0380nobodyさん03/04/19 19:11ID:???
マニュアルの mysql_connect を嫁
0381bloom03/04/19 20:10ID:PZJVQOkw
http://www2.leverage.jp/start/
0382nobodyさん03/04/19 21:23ID:+e8LI5YY
大人の出逢いから ピュアな出逢いまで・・・。
素敵な お相手が貴方を待っています!
もちろん 女性は完全無料です!
http://www.sweet.st
0383動画直リン03/04/19 21:41ID:PZJVQOkw
http://www.agemasukudasai.com/movie/
0384tantei03/04/19 22:15ID:???
★あなたのお悩み解決致します!!
●浮気素行調査
彼氏、彼女、妻、夫の浮気を調査致します!!
●別れさせ工作
あらゆる手段を使ってターゲットを別れさせます!!
●盗聴器盗撮機発見
あなたの部屋に誰かが仕掛けているかも!!
●行方調査
行方不明になっている家族の消息を調査致します!!
●電話番号から住所割り出し
一般電話、携帯から住所を割り出し致します!!
その他人生相談からどんなお悩みでも解決いたします!!
 直通  090−8505−3086
URL  http://www.h5.dion.ne.jp/~grobal/
メール  hentaimtt@k9.dion.ne.jp
   ■グローバル探偵事務所 

0385山崎渉03/04/20 05:58ID:???
   ∧_∧
  (  ^^ )< ぬるぽ(^^)
0386山崎渉03/04/21 00:46ID:???
∧_∧
(  ^^ )< ぬるぽ(^^)
0387nobodyさん03/04/21 12:56ID:AYv3e7ja
携帯からPOS送信でPHPにデータをおくってるんですが
NAME指定がないので$HTTP_POST_VARSで受信できません。
なにかPOST使用で方法ないですか?
0388nobodyさん03/04/21 14:21ID:5cXc42kk
ホントに初心者でバカな質問だと思いますが、
phpの処理後に特定のページに強制的にジャンプさせる方法はないでしょうか?
html側での話かもしれませんが関連本を読んでも分かりませんでした。
0389nobodyさん03/04/21 14:48ID:6OPNxtTd
>>388
http://www.php.net/manual/ja/function.header.php
見よ
0390nobodyさん03/04/21 14:56ID:???
あたり前の事だけどPHPマニュアルって便利だよね。
0391nobodyさん03/04/21 15:36ID:???
>>387
phpinfo()で どこに値が入ってるかみてごらん
0392動画直リン03/04/21 15:41ID:ukRLYPuy
http://homepage.mac.com/hitomi18/
0393nobodyさん03/04/21 15:55ID:AYv3e7ja
>>391
携帯からのPOSTなんでして
ただphpinfo();だけをかいたら携帯の方に
出力してしまってエラーになると思います。
結果をファイルに保存とか可能でありますか?
0394nobodyさん03/04/21 17:08ID:???
>>387
php.ini
; Always populate the $HTTP_RAW_POST_DATA variable.
always_populate_raw_post_data = On
■ このスレッドは過去ログ倉庫に格納されています