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

【PHP】下らねぇ質問はここに書き込みやがれ 61

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2008/01/27(日) 18:17:59ID:jK32tI//
まず読め→【PHP マニュアル】http://www.php.net/manual/ja/
PHPで最良の教本はこの公式マニュアル。市販の書籍は嘘が多いので鵜呑みにしない。
過去スレ、関連スレ、FAQなどは>>2-10辺り

◆前スレ
【PHP】下らねぇ質問はここに書き込みやがれ 62
http://pc11.2ch.net/test/read.cgi/php/1199956159/

◆質問する時の注意
・ サーバーのOS(Linux、Windows他)、WebサーバーとPHPの種類やバージョン等を明記すること。
・ 己の行った操作、変更などを詳しく明記すること。
・ エラーメッセージはそのまま表記すること。「エラーが出ます」だけでは回答不可。
・ 質問者として、態度をわきまえること。
・ 事前に公式マニュアル、リファレンス本くらいはちゃんと目を通しておくこと。

◆質問後の注意
・偽者防止に必ずIDを表示させること。(メール欄に何も記述しない)
・2回目以降は最初に質問した際のレス番号を名前欄に入れること。
・解決しなくても回答をもらった場合はお礼を言うこと。
 (荒らし、煽りは除く。煽られたときも、無闇に反論せずスルーすること。)

◆回答者への注意
・誰にレスしているのか分からないと困るので、>>(アンカー)をつけて回答すること。

【その他諸注意】
・正規表現・PEAR・テンプレート(Smarty等)・フレームワークは各該当スレへ
・SQLについての質問はデータベース板(PCカテゴリ)の各スレで
0367nobodyさん2008/01/30(水) 23:13:59ID:???
そういう関数はありませんのでCakePHPなどのフレームワークを使ってください。
0368nobodyさん2008/01/30(水) 23:14:53ID:???
>>366
CakePHPを使うべき
0369nobodyさん2008/01/30(水) 23:17:50ID:???
なんと都合のいい質問タイミングw
CakePHPの信者共が出張して宣伝活動していることだけはわかった
いいからCakeBBSに帰れw
0370nobodyさん2008/01/30(水) 23:19:55ID:???
PEARは基礎。CakePHPは応用。
PEARは知識。CakePHPは実践。
0371nobodyさん2008/01/30(水) 23:23:02ID:???
学生グループ開発かj会社のプロジェクトでCakePHPを勧めたら周りから否定されて
もっと知れ渡るように布教活動でもしてるのか?
0372nobodyさん2008/01/30(水) 23:25:22ID:???
抵抗勢力がんばれw
0373nobodyさん2008/01/30(水) 23:28:41ID:???
Cakeを使える人vs使えない人
0374nobodyさん2008/01/30(水) 23:28:43ID:???
>>366
最初に仕様を決めてしまえば変更する必要がないぞ
コロコロと仕様を変えるのは良くない
0375nobodyさん2008/01/30(水) 23:31:59ID:???
たまには、Smartyのことも思い出してあげて下さい
0376nobodyさん2008/01/30(水) 23:34:46ID:???
いつまでやってるんだ。それ専用でスレを作ってやったらどうだ
0377nobodyさん2008/01/30(水) 23:38:34ID:9rDWoCR8
くだらないこと聞きますが、PDOってバグってます?

環境はmysql 5.0.54、PHP 5.1.6で実行しました。
例えば、
$res = $pdo->query('SELECT avg(column) FROM table');
を実行するとどこかで失敗しているとおもわれます。(エラーは何もない)
このavgを含むとfalseが返されます。
その後に$pdoの中を見ると、通常ではクエリ実行後にはqueryStringプロパティに実行したクエリがセットされるはずですがセットされていません。

もちろん、直接mysqlにこのクエリを打つと正しく返ってきます。

検索してもPDOにそれっぽいバグ報告ありませんが、ご存知の方いませんか?
0378nobodyさん2008/01/30(水) 23:43:00ID:???
>>377
CakePHPを使えば解決します
今すぐに導入すべきです
03793772008/01/30(水) 23:44:52ID:9rDWoCR8
>>378
CakePHPでダメでした。
0380nobodyさん2008/01/30(水) 23:45:44ID:???
>>379
それはあなたが駄目だからです
プログラマーに向いていないと思います
0381nobodyさん2008/01/30(水) 23:48:37ID:???
>>377
group by
0382nobodyさん2008/01/30(水) 23:54:52ID:9rDWoCR8
>>380
PDOがavgを含むクエリに失敗する理由がわかりますか?

>>381
クエリ自体に問題はありませんが、PDOはいかなるときもgroup byが必要ということでしょうか?
知ってる人が見つかってよかったです。
ありがとうございます。
0383nobodyさん2008/01/30(水) 23:58:02ID:9rDWoCR8
>>381
うそつき、ハゲ!

意味なくgroup by入れたけどやっぱりダメでした。
コマンドラインでは成功しました。

PDOはダメってことですか?
0384nobodyさん2008/01/30(水) 23:59:22ID:???
delete from テーブルを実行してみて、どのようになるか教えてもらえますか?
0385nobodyさん2008/01/31(木) 00:05:13ID:???
>>382
MySQLのバージョンが未来すぎるのが失敗する理由です
0386nobodyさん2008/01/31(木) 00:07:26ID:???
http://jp.php.net/manual/ja/ref.pdo.php#pdo.error-handling
とりあえずこれ。
0387nobodyさん2008/01/31(木) 00:08:15ID:???
>>377

$stmt = $pdo->prepare("select avg(col) ...");
$stmt->execute();
$rows = $stmt->fetchAll();
$stmt->closeCorsor();

だとどう?
0388nobodyさん2008/01/31(木) 00:16:07ID:???
>>382
I just recompiled pdo_mysql and the problem was solved.
0389nobodyさん2008/01/31(木) 00:26:05ID:???
>>383
せっかくその他の解決法教えてやろうと思ったがもう教えてやらん
0390nobodyさん2008/01/31(木) 00:30:42ID:REX6IFqd
>>377
$stmt = $pdo->prepare("select avg(col) ...");
の時点でfalseが返ってきます。

>>388
ありがとうございます。
やっとまともな方に答えていただきました。

解決したわけではありませんが、Bug #8045ってことで納得しました。
0391nobodyさん2008/01/31(木) 00:36:22ID:???
こうしてまた可哀相なヤツが生まれる…
0392nobodyさん2008/01/31(木) 00:57:53ID:???
俺も>>332と同じ疑問持ったけど様子見てた。
<>"&あたりしか退避しないからurlencodeでもしとけってことかな。
まあ汚染については厳密にやるとCでもPerlでもきりがないし大げさに取り上げるほどのことではない気はした。
0393nobodyさん2008/01/31(木) 01:08:58ID:???
htmlspecialcharsとurlencodeは全く用途が違うわけだが。
明示的にエスケープが必要なのがプギャーなのかな。
0394nobodyさん2008/01/31(木) 01:26:32ID:???
用途違うんだけどまだ%xxの形なら直で囲っても問題ないかなと。
0395nobodyさん2008/01/31(木) 02:04:47ID:???
http://zapanet.info/blog/item/1217 に

> PHP使ってるヤツらって
> htmlspecialchars($_GET['text']);
> こんなコード書いてる!
> m9(^Д^)プギャー

とありますが、上のコードの何が問題なんでしょうか?
教えて下さい。
0396nobodyさん2008/01/31(木) 02:14:41ID:???
>>395
お言葉を返すようですが、人間的に失格です。
0397nobodyさん2008/01/31(木) 02:14:53ID:???
本人に聞けよ
0398nobodyさん2008/01/31(木) 02:21:25ID:???
これもなんかすげえな。
ttp://www.ipa.go.jp/security/awareness/vendor/programmingv2/contents/003.html

より良いWebアプリケーション設計のヒント
開発基盤選定における考慮事項の例
(1) プログラミング言語の選択
1) 例えば、PHPを避ける
2) 大規模システムにはJavaや.Netを使う
0399nobodyさん2008/01/31(木) 02:27:58ID:4JBYr2L1
はじめまして、質問です。

PHPでサイトを作ったのですが、
自分は普通にBBSに書き込めるのに、他の人からBBSに書き込めないという情報をもらい困っています。

下手なソースをアップしてもいいのですが、長いだけにそれも無理そうです。
ログを取ってみたところ、自分は書き込みチェックのフェーズまで進んでいるのに、他の人は書き込み(エラーチェック)フェーズにまでいっていないように見受けられました。
(あくまでも推測)
しかし、次のフェーズへの移行はhiddenで指定しているため、両者に差異はないはずなのです。
環境の違いでもないようでした。

情報が少ないので難しいと思いますが、こういった場合どのような理由が考えられるでしょうか?
もしくは、チェックツールや、どこかソースのミスを判定してくれるところなどはありませんでしょうか。

なにか解決の糸口となりえる情報をよろしくお願いします。
0400nobodyさん2008/01/31(木) 02:30:45ID:???
どのポイントで想定外の動きになっているか特定する
エラーメッセージを表示する
0401nobodyさん2008/01/31(木) 02:32:46ID:???
>>399
そんな便利なもんはないです。
こっちにソースの要所だけでも書いたほうがはやいと思う。
もしくは、分岐ごとに全部条件を出力して相手にどの経路まで進んだか聞いて調べる。
04023992008/01/31(木) 02:46:27ID:4JBYr2L1
<form method="POST" action="">
<td><input type="submit" name="submit" value="書き込む"> 名前 <b>:</b> <input type="text" name="name" size="25" value="">
 E-mail <font size="1">(省略可)</font> <b>:</b>
<input type="text" name="mail" size="25" value=""></td>
</tr><tr><td><textarea name="bbsfor__text1" rows="8" cols="75"></textarea></td></tr>
</table><input type="hidden" name="userid" value="SS0001">
<input type="hidden" name="bbsid" value="7">
<input type="hidden" name="mode" value="bbs">
<input type="hidden" name="step" value="toukou">
<input type="hidden" name="close" value="0">
<input type="hidden" name="write" value="free">
<input type="hidden" name="ticket" value="6">
</form>

一番怪しそうなところはここの部分です。
書き込めなかったという人の報告によると、書き込みボタンを押したあとに画面がそのままになって、テキストエリアに入力した文字などが消えているそうです。
ただし自分以外にも書き込める人もいます。
0403nobodyさん2008/01/31(木) 02:47:12ID:???
>>398
簡単に作るにはいい言語といった上でのことだし
セキュリティがメインのとこだからまだ新しい言語であるphp避けるべきってのはあってる。
0404nobodyさん2008/01/31(木) 02:47:49ID:???
いやそれだけ見せられても分かるわけないって
0405nobodyさん2008/01/31(木) 02:49:49ID:???
>>402
これだけじゃわからんがACTIONが空だけどこれはいいのかな。
0406nobodyさん2008/01/31(木) 02:50:22ID:???
ポストバックだろ
0407nobodyさん2008/01/31(木) 02:51:30ID:???
action空だから今のリファラに飛ばしたいんだろ
ダチにはノートンのリファラ返すように言っとけ
04083992008/01/31(木) 02:51:47ID:4JBYr2L1
>>405
セキュリティ上、空のほうがいいそうです。と本に書いてありました。

>>406
ポストバック?
0409nobodyさん2008/01/31(木) 02:55:41ID:???
なんじゃそりゃ
0410nobodyさん2008/01/31(木) 03:16:49ID:???
ここのやり取りを読んでいると、物事を難しく考え過ぎているような嫌いがある。

phpもwebという仕組みも究極的には、OnとOffの電気信号をやり取りをしているに
過ぎないというベースの考え方から、考える癖をつけた方がいいよ。

枝葉ばかりの方法論に固執せずに、仕組みから考えていく方が応用が利くと思う。
0411nobodyさん2008/01/31(木) 03:23:30ID:???
postbackにするのとセキュリティってどういう関係があるんだ。。。
0412nobodyさん2008/01/31(木) 03:38:32ID:???
ファイル名を隠したいってことかな?
セキュリティが向上するとも思えんが
04133992008/01/31(木) 03:52:32ID:4JBYr2L1
まだ確定ではりませんが、事前にリファラーブロックをかけてたのでそれが原因かもしれません。
解除してみてテストしてもらいます。

>>411
XSS対策です。詳しくは【PHP サイバーテロの技法 防御と攻撃の実戦】という本に書いてあります。
この本もここの人に推奨されたので勉強のために買いました。
0414nobodyさん2008/01/31(木) 03:55:42ID:???
リファラ要求するならERROR:referer情報が変です。(ref1)的なものが必要だろ
0415nobodyさん2008/01/31(木) 07:30:54ID:???
思い切ってセキュリティーに関する部分をコメントアウトしてみたらどうかな。
もしくは、1つの項目をログファイルに追記で書き込むだけの簡潔なプログラムを
書いてみるとか。
0416nobodyさん2008/01/31(木) 09:55:14ID:no07dFZM
すみません、駄質なんですが
connect()とpconnect()の違いはなんでしょう?
p-が継続的だとはマニュアルに書いてあるんですが、これはclose()しないと
サーバに付加がかかり続けるということでしょうか?
closeしないで次のページに移動してまたpconnectしたらまた付加がかかって、
それもcloseしないで次のぺーじでpconnectしたらまた… みたいになるのですか?

どうもよくわかりません
そうならないとしても、「継続的」であることでの具体的なメリットって
どんな場合ですか?
0417nobodyさん2008/01/31(木) 09:56:56ID:???
pconnectは、おなじ接続があったらさっきのを再利用、だよ。
イメージが逆だな。
0418nobodyさん2008/01/31(木) 10:14:03ID:no07dFZM
>>417 ありがとうございます!
イメージが逆ってのは、再利用するから接続しなおす負荷(?)がかからないって
ことですね? じゃ、いいことみたいですね
あと、続けて質問ですみませんが、マニュアルを読んでるとclose()してるサンプルって
見たことありません。しなくていいものなんですか?
ブラウザを閉じたら勝手にクローズ。だけど、ページ移動なら接続は
キープされるってことでしょうか?(pconnectの場合)

同一ページで何度も同じ接続処理を書くことってあまりないと思うので、
ページ遷移で持ち越せる位の機能じゃないとpconnectって意味薄そうな気がするのですが…
0419nobodyさん2008/01/31(木) 10:34:31ID:???
cgiと違って終了してもプロセスは残るから再利用可能になるんだよ。
ttp://www.php.net/manual/ja/features.persistent-connections.php
0420nobodyさん2008/01/31(木) 11:00:34ID:???
>>330
最終的には特定のxmlやらiteratorから別のxmlを作るのが目的。
modelの作成にSimpleXMLElementが使えないかなーと。

生成元からxpathで抽出して生成ノードがコンテナなら抽出元のノードの生成ノードの下にぶら下げる。
次に先程生成したノードをxpathで抽出してぶら下がったノードに相対パスを突っ込んでさらにノード作成、みたいな。

ちとややこしいけど・・・
0421nobodyさん2008/01/31(木) 11:04:56ID:???
>>418
pconnect()の対になるclose()は意味が無い。
connect()の対になるclose()はスクリプトの終了の際に
自動的に行われるので大抵の場合はしなくても構わない。
HTTPリクエストで実行されるスクリプトの場合、
接続時間が短く、リソースを掴んだままでも影響が少ないからね。
因みにリソースにはそこでSELECT等して取得したデータも含まれる。
(MySQLの場合)

あとpconnect()によるリソースの再利用だけど
接続文字列が同じだから必ずしも再利用されるとは限らない。
再利用のためのプールが1つではなく、プロセスで1つで
プロセス間でそれを共有しないため。
だから接続をタイムアウトまで最悪上限まで保持してしまう
pconnect()はかえって効率が悪くなる(不具合)場合もあるよ。
httpdの設定とか絡んで要調整。
0422nobodyさん2008/01/31(木) 11:17:14ID:???
>>420
SimpleXMLObjectのプロパティ≠子要素だから上のコードには無理がある
addNode()とか定義して自分でXMLオブジェクトを展開して追加するしかないと思うが
SimpleXMLを投げ捨てる、という手も
0423nobodyさん2008/01/31(木) 11:24:17ID:???
addChild()のユーザ投稿だと、一旦Domオブジェクトにしてから追加してるのがあるね。
0424nobodyさん2008/01/31(木) 12:00:56ID:???
>>722
__set使ってればオーバーライドすれば誤魔化せるかなーとか思ったけど見てのとおりの惨敗。
投げ捨てるか、xpathを取得して保管するか、xpathをキーにしてarrayでも作るか、どうするか思考中。

>>723
なんと。情報ありがとうございます。
調べてみて試してみます。
0425nobodyさん2008/01/31(木) 12:06:11ID:VNDK0Dvo
Magpie RSSで日付を取得する方法について教えて下さい

最新バージョンの0.72を使っています
phpはバージョン5系です。

$date = date("Y/n/j G:i", $item['date_timestamp']);
このようにしてRSSの時間を取得するようにしてるのですが、

echo "<li>$date<a href=\"$url\">$title</a> ($p_title)</li>\n";
このように書いて実行してるのですが、なぜか時間表示が全部1970/1/1 9:00になってしまいます。

アドバイスお願いします。
公式サイトではdate_timestampで取得することを進めているのですがどうもうまくできません。

0426nobodyさん2008/01/31(木) 12:11:55ID:???
>>425
1970/1/1てことは$item['date_timestamp']が空だね
変数をダンプしてデバグしましょう
0427nobodyさん2008/01/31(木) 12:15:47ID:???
>>426
レスありがとうございます。
変数をダンプしてみたいと思います。
助かりました!
0428nobodyさん2008/01/31(木) 12:27:27ID:???
>>423
SimpleXML使えないわー
0429nobodyさん2008/01/31(木) 12:36:27ID:???
function xxx(&$c1=null) {
$c1 =100;
}
xxx();


素朴な疑問なんだけどPHP5では
上の例のように参照渡しでかつその変数を省略できるけど
その省略した変数に関数内で値を変更しても大丈夫なのだろうか?

今はパラメータ数を判定して
省略されてない場合にだけ値を変更してるんだけど
そんなの必要ないのかな?

いろいろ探したけど確証が得られなくて・・・

0430nobodyさん2008/01/31(木) 12:50:08ID:???
>>424
シリアル化してつっこんでやるってのは?
04314162008/01/31(木) 13:12:48ID:???
>>419>>421
詳しい説明ありがとうございます
かなり深いですね、、適当やってると痛い目見そうだし
もっと参考書でこういうの説明して欲しいんですが、してないですよねー

プロセスとかの基本用語から理解なきゃダメですね  ありがとう
0432nobodyさん2008/01/31(木) 13:55:27ID:???
>>429
質問するときはID表示、これこのスレの掟
とりあえず>>1を読め、読めない・実行できないなら質問するな
0433nobodyさん2008/01/31(木) 14:06:44ID:???
http://zapanet.info/blog/item/1217 に

> PHP使ってるヤツらって
> htmlspecialchars($_GET['text']);
> こんなコード書いてる!
> m9(^Д^)プギャー

とありますが、上のコードの何が問題なんでしょうか?
教えて下さい。
0434nobodyさん2008/01/31(木) 14:08:50ID:???
>>433
お前は直前のレスも読めないのかと
0435nobodyさん2008/01/31(木) 14:48:21ID:???
質問させてください。

・test1.php
・test2.php
・entry.php


http://test.com/test1.php?a=1

このtest1.phpの中に以下のimgタグを
埋め込んでtest2.phpを呼び出しているとします。

<img src='http://test.com/test2.php?a=<;?php echo $a; ?>' width='0' height='0'>

で、このtest2.phpの中にさらに
下記のようなimgタグを埋め込んでいるのですが、

<img src='http://test.com/entry.php?a=<;?php echo $a; ?>' width='0' height='0'>

当然動作しません。

このtest2.phpの中でなんらかの方法でentry.phpを
呼び出して、aの値を登録したいのですが
どのようにすればよいのでしょうか・・・

そのやり方を教えて欲しいです。
よろしくお願いいたします。

0436nobodyさん2008/01/31(木) 14:49:56ID:???
>>435
質問するな死ね
0437nobodyさん2008/01/31(木) 14:53:10ID:89mDm5mU
ID表示ですか・・・
失礼しました。


で、質問させてください。

・test1.php
・test2.php
・entry.php


http://test.com/test1.php?a=1

このtest1.phpの中に以下のimgタグを
埋め込んでtest2.phpを呼び出しているとします。

<img src='http://test.com/test2.php?a=<;?php echo $a; ?>' width='0' height='0'>

で、このtest2.phpの中にさらに
下記のようなimgタグを埋め込んでいるのですが、

<img src='http://test.com/entry.php?a=<;?php echo $a; ?>' width='0' height='0'>

当然動作しません。

このtest2.phpの中でなんらかの方法でentry.phpを
呼び出して、aの値を登録したいのですが
どのようにすればよいのでしょうか・・・

そのやり方を教えて欲しいです。
よろしくお願いいたします。
0438nobodyさん2008/01/31(木) 15:08:35ID:???
>>437
何がしたいのかわからん
entryにtest2の画像のimgタグ、test2にtest1の画像のimgタグを入れてるってこと?
0439nobodyさん2008/01/31(木) 15:10:37ID:???
>>437
外部ファイル呼び出したいだけだろ?
file_get_content(URL);
で゙呼び出せるよ
04404292008/01/31(木) 15:22:24ID:qO0TdOQJ
失礼しました。再度お願いします。

function xxx(&$c1=null) {
$c1 =100;
}
xxx();


素朴な疑問なんだけどPHP5では
上の例のように参照渡しでかつその変数を省略できるけど
その省略した変数に関数内で値を変更しても大丈夫なのだろうか?

今はパラメータ数を判定して
省略されてない場合にだけ値を変更してるんだけど
そんなの必要ないのかな?

いろいろ探したけど確証が得られなくて・・・
04414372008/01/31(木) 15:29:08ID:???
>>439

ありがとうございます。
その関数を調べてもう少しテストしてみます。
0442nobodyさん2008/01/31(木) 15:30:35ID:xq4Ruxkp
セッション管理について質問です。

1:$_SESSION変数で、それぞれのデータを全て持ち回す方法
(例)
$_SESSION['name'] = 'name';
$_SESSION['email'] = '[email protected]';

2:セッションキーを生成して、$_SESSION['session_key']にキーのみ持ち回して
データはオブジェクトをシリアル化して、キーをファイル名とする一時ファイルに保存する方法
(例)
$_SESSION['session_key'] = '4hak2ajh8adjkeubz'; //実際はユーザごとにユニークな値を生成
$file = file("/tmp/" . $_SESSION['session_key']);
$data = unserialize(base64_decode($file['0']));

3:$_SESSION['data']にオブジェクトをシリアル化して、1つの$_SESSION変数だけ持ち回す方法
(例)
$_SESSION['data'] = base64_encode(serialize($data));
$data = unserialize(base64_decode($_SESSION['data']));

どれが一般的なのでしょうか?
0443nobodyさん2008/01/31(木) 15:43:16ID:???
>>442
一般的は1
2は自作セッション
3は関数や実行結果を保存しすぐリストアしたい時
0444nobodyさん2008/01/31(木) 15:48:45ID:???
>>440
別に問題ないんじゃね?
初期値もいれてんだしreturn後に$c1を参照したいときにゃたまにやる
0445nobodyさん2008/01/31(木) 16:28:44ID:???
>>444
変数の不変性から言って多いに問題があるのだけど、
そんなの関係ねーと小島よしおを信仰しているなら、
それも一興といわざるを得ない。
0446nobodyさん2008/01/31(木) 16:43:09ID:???
変数の不変性?
0447nobodyさん2008/01/31(木) 16:49:35ID:???
そりゃ定数なら問題だが変数だろ?
0448nobodyさん2008/01/31(木) 17:20:24ID:Zzvt9fFU
エスケープシーケンスを置き換えたるため以下のように書きました。
testesc の $char に\に続く一文字だけ該当するように想定していますが
何故か \"のときだけ " ではなく \" 2文字が引数に渡されてしまいます。
これはどこに問題があるのか教えてください。

<?php
$in = '\\\\abc\tdef\\"';
$out = preg_replace('/\\\\(.)/e', "testesc('$1')", $in);
echo 'input [' . $in ."]\n";
echo 'output [' . $out ."]\n";
function testesc($char){
    if($char=='"'){
        return '"';
    }elseif($char=='\\"'){
        return '?';
    }elseif($char=='\\'){
        return '\\';
    }elseif($char=='t'){
        return "\t";
    }else{
        return '';
    }
}
?>
実行結果
input [\\abc\tdef\"]
output [\abc def?]
0449445 2008/01/31(木) 17:22:23ID:???
ことば足らずだったかもしれないが、指摘されていることは違います。
私が言いたいのは、返すことが予定されている変数を呼び先で勝手に変えてはいけないという意味で不変性と言っている。
OOP志向から自明の理であるが、使用貸借契約と消費貸借契約における客体を想像すれば分かりやすい。
0450nobodyさん2008/01/31(木) 17:25:32ID:???
参照で渡してる時点で変えられる事が前提だと思うのだが・・・
0451nobodyさん2008/01/31(木) 17:31:15ID:B+pFj7HJ
本当のクローラーとは違うかもしれませんが、
プログラム練習として自分なりのクローラーを作ろうとしています


現在はネットワークを縦横無尽に走るものではなく、
自分で用意した一つのサイトのトップページを指定し、
そこから同サイト内の全ページをDBに登録するプログラムを作っています

流れ的にはこうです
1. file ()でトップページを取得
2. 1.で取得したページからurlを抽出しリスト化
3. 2.で取得したurlからリンク先のページ内容を取得
4. DB(MySQL)にurlと対応するページ内容を追加、または更新
 (レコードが追加か更新かは、DBにそのurlがあるかないかで判断する)
5. 3と4をループ

ここまではうまくいっていますが、質問があります

もしurlから取得したページがたまたま503だった場合、追加も更新も行わないようにしたいのです
その場合、分岐させていけばいいのだと思い、下のようなものを考えました

if(ページ内容が空じゃない){
ページ内容をデータベースに登録する
}

しかし、自分のページが503になったことがないので試せないのです
これで合っているのでしょうか?
04524452008/01/31(木) 17:33:33ID:???
>>450
OOPは、現実の世界で考えれば分かりやすい。それが本質だし。

居酒屋で下駄箱の鍵を店員に預かってもらったら、
店員に勝手に開けられて「靴を磨いておきました」って言われたら、
それが正常な行為であっても、予想に反した動作だと思うだろ。
要はそういうこと。
04534292008/01/31(木) 17:48:14ID:???
>>452
なんか勘違いしてるみたいだけど
値を渡したつもりなのに参照渡しなってしまうという
PHP5の仕様のことを問題にしてるのではなく、
参照渡しである変数を呼び元が省略した場合に
関数内ではその変数の参照先はどこになるんだろうということです。

ローカル変数になるならいいのだけど
どこかにそのへんの詳しい情報がないだろうか。
0454nobodyさん2008/01/31(木) 17:49:38ID:???
>>451
レスポンスヘッダのコード見ればいいんじゃね?
0455nobodyさん2008/01/31(木) 17:56:07ID:???
ttp://gihyo.jp/dev/serial/01/php-security/0005?page=3
を参考にテストしてみたんですが、再現出来ません。
php4です。
このサイトに書いてある、この正規表現では二行目は無視するっていうのは本当なのでしょうか?

/*----------------------------------
<?php
$_GET['id'] = "6666". PHP_EOL . "aaa";

var_dump($_GET['id']);
if (preg_match('/^[0-9]+$/', $_GET['id'])) {
var_dump($_GET['id']);
}
?>
----------------------------------*/
0456nobodyさん2008/01/31(木) 18:01:43ID:???
本当だよ。一行ずつ正規表現で表したい時もあるべ
0457nobodyさん2008/01/31(木) 18:03:54ID:B+pFj7HJ
>>454
すると404とかも判断できるということですね!
レスポンスヘッダとかわからないので調べてきます
ありがとうございました
04584552008/01/31(木) 18:04:48ID:5Z05+qC0
すいません、id表示忘れていました

>>456
だとすると>>455のコードでは再現出来ていないという事でしょうか・・。
このコードでTRUEが得られるつもりで書いたのですが、駄目なようです。
0459nobodyさん2008/01/31(木) 18:15:18ID:???
>>458
ずばり言うわよ。

Smartyを使えば、もっと簡単。
0460nobodyさん2008/01/31(木) 18:17:40ID:5Z05+qC0
>>459
smartyも興味あるのですが。
何故再現できないか知りたいんです・・。
0461nobodyさん2008/01/31(木) 18:20:59ID:???
>>452
参照で渡してるんだろ?
お前の好きな現実の世界に例えると
クリーニング屋にシャツ出したのに
汚れが落ちてるとブツブツ言ってるようなもの。
0462nobodyさん2008/01/31(木) 18:34:36ID:???
いつのまにか$が改行関係なく最後のにしかマッチしなくなってんな
PCRE_DOLLAR_ENDONLYがどーとか書いてあったからその辺かもね
0463nobodyさん2008/01/31(木) 18:37:12ID:5Z05+qC0
>>462
なるほど、昔の仕様ということですね。
ありがとうございます。

こういう細かい仕様変更はちょっと怖いですね・・。
0464nobodyさん2008/01/31(木) 19:13:51ID:???
Smarty厨うぜえw オールドタイプは市ね
04654482008/01/31(木) 19:51:16ID:Zzvt9fFU
>>448 の正規表現を /\\\\(.)/ から /\\\\(\C)/ や /\\\\(.{1})/
に変えたり、関数名を全てシングルクオートの 'testesc(\'$1\')' 囲んだりもしましたが
やはり文字の \" が分割されず $1 に \" が2文字渡されてしまいます。
\ に続くASCIIコードの半角記号も一通り試してみましたが \" のときだけ2文字になります。

原因どなたか分かる方おられないでしょうか。
0466nobodyさん2008/01/31(木) 20:50:27ID:VNDK0Dvo
再度質問申し訳ありません。

php4で動作するスクリプトをphp5でも動かせるようにソースを書き換えてくれるソフトなどないでしょうか?
ソースが長いので書き換えるのが。
■ このスレッドは過去ログ倉庫に格納されています