【PHP】質問スレッドpart30【php】
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2005/10/25(火) 06:50:06ID:Q4oGlTH3【基本ルール】
・新規質問の方は上げてください。age進行でお願いします。
・質問者は2回目以降、最初のレス番号を名前欄に入れてください。
・回答者は質問者に対して>>(アンカー)をつけてください。
・煽り・荒らしは放置。荒らしに反応した香具師も荒(ry
・解決しなくてもこたえてもらったら礼を。
【質問テンプレ】
・マニュアルを調べたか、google検索したか(調べたキーワード)
・タイトル(禁:教えてください!etc) 例:requireとinclude
・内容 例:requireとincludeはどう違うのですか?
・質問する際には環境も明記。
【その他諸注意】
・正規表現・PEAR・テンプレート(Smarty等)・フレームワークはそれぞれの該当スレへ
・SQLについての質問はデータベース板(PCカテゴリ)の各スレで
・オブジェクト指向については良スレがないから本を買え
・速さについては自分でベンチをとってここに書け(違う環境の人も調べてくれるかも)
【PHP マニュアル】
http://www.php.net/manual/ja/
※マニュアル上部の「search for」から検索を活用すべし(便利)。
過去スレ、関連リンク、FAQ等>>2-10辺り
0286>>284
2005/11/09(水) 18:27:40ID:???<?= hogehoge ?>
は <?php echo hogehoge ?>の略
$_SERVER["PHP_SELF"] は自PHPスクリプトのURLを格納している変数
これでわからないならもう一度はじめから入門書読みな
0287nobodyさん
2005/11/09(水) 18:28:00ID:???だって手を使うと頭がよくなるっていうもの
0288nobodyさん
2005/11/09(水) 18:31:35ID:???<?=
<?
0289nobodyさん
2005/11/09(水) 20:16:19ID:???<?php
以外はshort_open_tagなんかの設定環境によって使えない場合があることも言っとけ。
0290nobodyさん
2005/11/09(水) 20:17:46ID:???0291284
2005/11/09(水) 21:09:20ID:???大変ありがとうございますm(_ _)m
やっぱりBASICでPRINTを"?"と略したりするのと同じようなものだったのですね。
ぶっちゃけ使っている入門書はソフトバンクの"PHPによるWEBスーパーアプリケーション"なんですが
いきなりこの書式を使っている部分がありましたので面食らいました。
ところで"<?=$_SERVER["PHP_SELF"]?key=hoge>"は"<?=$_SERVER["PHP_SELF"];key=hoge;?>"と書くべきだと思うのですが
この部分はどうなっているのでしょうか…
0292nobodyさん
2005/11/09(水) 21:42:37ID:???それがやろうとしているのは、
「$_SERVER["PHP_SELF"] と 文字列"?key=hoge" を連結したものを出力」 でそ?
文字列部分は、URI表記でいう所のquery。 $_GETで取り出すやつ。
0293nobodyさん
2005/11/09(水) 22:13:05ID:???本を読んでるのに,その本のことをここで聞かないといけないなんて・・・
その本は燃やしてしまったほうがいいかもしれないね.
コードの実行環境はないの?
いろいろ試しながらのほうがいいかと.PHPのマニュアルも参照しつつ.
0294nobodyさん
2005/11/09(水) 22:42:36ID:Rf4f8pCBリファラーを記録するスクリプトを作ろうと思ってGoogleで検索したのですがどうしても
解決しませんでした。
ユーザが、404.phpにアクセスした時のリファラーを「referer.dat」に
記録したいのです。
知ってる方いましたらお願いします。
途中で挫折:(http://www.geocities.jp/nullpo_de_ga/source.txt )
0295294
2005/11/09(水) 23:44:37ID:Rf4f8pCB0296nobodyさん
2005/11/09(水) 23:59:37ID:???0297nobodyさん
2005/11/10(木) 00:53:20ID:???0298nobodyさん
2005/11/10(木) 08:12:19ID:Vd5L+S6Aフォームで同じ名前を指定してsubmitした後に配列にいれてます。
-------
<input type="checkbox" name="hoge[]" value="hogehoge1">
<input type="checkbox" name="hoge[]" value="hogehoge2">
<input type="checkbox" name="hoge[]" value="hogehoge3">
:
-------
for($i=0;$i<count($_POST['hoge']);$i++){
$temphoge =$_POST['hoge'][$i];
・・・処理
}
-------
としてたんですけど、チェックボックスをJavaScriptで全部チェックしようと
思った場合、
<input type="button" name="allchk" onclick="document.form1.hoge[1].checked=true;" value="全てにチェック"><br>
<input type="button" name="allchk" onclick="document.form1.hoge[].checked=true;" value="全てにチェック"><br>
<input type="button" name="allchk" onclick="document.form1.hoge.checked=true;" value="全てにチェック"><br>
といずれにしてもエラーになってしまいます。
PHPで、POSTで受け取ったものを配列に入れる方法って他にありませんか?
また、両方の処理を実現させるいい方法があれば教えていただけませんでしょうか?
0300nobodyさん
2005/11/10(木) 09:19:39ID:???でアクセスできる
0301教えてください
2005/11/10(木) 09:49:12ID:GWhi70M+やればいいのでしょうか?
HTMLではフレームを使えば取得できるのですが・・・。
PHPではどのように書けば取得できるか教えてください。
初心者ですいません。検索してもうまくヒットできませんでした
0303301
2005/11/10(木) 09:56:34ID:GWhi70M+>>302さんそうです! それで取得したいんですが
HTMLの表示させる部分にはどのようなタグを記述すればいいんでしょうか?
0305301
2005/11/10(木) 10:01:44ID:GWhi70M+index.html(これがメインのHPだとします)
kousin.html(こちらが更新履歴を出力するHPです)
このkousin.htmlをindex.htmlに表示させたいんです。
kousin.htmlを更新すればindex.htmlに反映がされるので
phpでこれをどうやればできるのかを教えて頂きたいです。
0309301
2005/11/10(木) 10:06:27ID:GWhi70M+ありがとうございます。そちらの方を勉強させてもらいます。
アドバイスくれてありがとうございます!
>>307
嫌です;;かっこわるいのでw
>>306
悪い人ですね。。。
0311301
2005/11/10(木) 10:09:16ID:GWhi70M+ssiですね!
こんな簡単な方法があったんですね。
0312301
2005/11/10(木) 10:11:13ID:GWhi70M+自分はMMOのサイト作成で使おうと思ってます。
MMOの公式サイトの更新やお知らせを自分のHPで表示できるようにも
しようと考えてました。(自分のサイトの更新履歴もです)
0314301
2005/11/10(木) 10:31:13ID:GWhi70M+でもssiで取得する方法などを教えてくれてありがとうございました。
興味がわいたので勉強してきます。
0315nobodyさん
2005/11/10(木) 10:47:22ID:???0316nobodyさん
2005/11/10(木) 11:21:50ID:???他人のコンテンツを自分のコンテンツと混同させるような
表示方法になると思うんだが・・・
0317301
2005/11/10(木) 11:34:56ID:GWhi70M+0319nobodyさん
2005/11/10(木) 12:44:07ID:???セーフモードで外部ファイルのインクルードってできないのでしょうか?
セーフモードがインクルード関連のメソッドの使用を禁止してるのは解りますが
何か解決策はないものでしょうか・・・外部ファイル指定できないのは痛杉。
ためしに <? include( "echo.php" ); ?> としてみた結果は以下の通りです。
Warning: main(): open_basedir restriction in effect. File(/php/bin/echo.php) is not within the allowed path(s): (.:/virtual:/tmp:/usr/local/lib/php) in /virtual/hogehoge/public_html/index.php on line 2
Warning: main(/php/bin/echo.php): failed to open stream: Operation not permitted in /virtual/hogehoge/public_html/index.php on line 2
Warning: main(): Failed opening '/php/bin/echo.php' for inclusion (include_path='.:/usr/local/lib/php') in /virtual/hogehoge/public_html/index.php on line 2
phpinfo() で解るセーフモード関連の値は以下の通りです。
Configure Command --enable-safe-mode'
safe_mode On
safe_mode_exec_dir /usr/local/php/bin
safe_mode_gid Off
safe_mode_include_dir /usr/local/lib/php
safe_mode_allowed_env_vars PHP_
safe_mode_protected_env_vars LD_LIBRARY_PATH
PHP_PREFIX /usr/local
LD_LIBRARY_PATH :/usr/local/mysql/lib/mysql:/usr/local/pgsql/lib
0320301
2005/11/10(木) 13:07:13ID:???できませんでした。。。
だからどっかに移動しないとだめです。
ドメインと有料プランなのに
PHPのincludeで自サイトのURLを指定して取り込みされることは非常に負荷が掛かりますので、極力おやめください。
場合よっては制限させていただくことがございます。
http://72.14.203.104/custom?q=cache:Ju5uWRscdtkJ:sb.xrea.com/showthread.php%3Ft%3D10180+include&hl=ja&ie=UTF-8&inlang=ja
ここに書いてましたよ
0321nobodyさん
2005/11/10(木) 13:15:52ID:???を見ると、なんも分かってないよな。コイツ。
結局、成りすましサイト作ろうとしてるようにしか見えない。
<?php
echo file_get_contents("http://〜");
?>
<!-- 以下 自サイトのHTML -->
0322301
2005/11/10(木) 13:23:43ID:???神!ありがとん!
0324nobodyさん
2005/11/10(木) 13:38:46ID:???既に、>>301において自分で解法を書いているのに何をウダウダ…
>HTMLではフレームを使えば取得できるのですが・・・。
PHPでフレーム下記だしゃいいじゃん。
ページ内にってんならiframe。
いずれにしてもHTMLのタグでこと足りるだそ。
0327nobodyさん
2005/11/10(木) 15:49:15ID:???え?成りすましがばれないようにやりたいの?
たとえサイトに溶け込ませるような表示をするにしても、引用元のバナーかリンクくらい貼っときなよ。
他人のものを自分のものであるかのように使うのはイクナイ
ちなみに方針としては、file_get_contentsとかで取得したものを正規表現で必要な部分だけ抜き出してechoで表示、ってのがおそらくチミのやりたいことにマッチする希ガス。
あとは、一度取得した情報はなるべくキャッシュしておいてHEADメソッドで更新チェック+再取得するかどうか分けたりする等の効率を図るとか(そのほうが相手側のサーバの負担もちょっと減る)。
まあ徐々にスキルアップしていってくれ。
0328301
2005/11/10(木) 15:51:57ID:GWhi70M+0329301 ◆F4BkeOen4w
2005/11/10(木) 15:53:05ID:GWhi70M+人として最低ですよ。罰があたるでしょう。
0330nobodyさん
2005/11/10(木) 16:16:21ID:???つかおまいXREAスレとマルチだろ
0331nobodyさん
2005/11/10(木) 16:49:18ID:???0332nobodyさん
2005/11/10(木) 18:56:59ID:???0333nobodyさん
2005/11/10(木) 20:09:24ID:???俺xreaだけど普通にできるよ?
つかエラーメッセージ見ると全然違うところのecho.phpを開けようとしてるっぽいんだけど。
<? include( "./echo.php" ); ?> でもダメ?
0334320
2005/11/10(木) 23:21:19ID:???あ、構成が違ってました。
public_html
├ index.php
└ php
└ echo.php
こんな感じで、index.php から echo.php をincludeする時、
include("/php/echo.php");
としてもエラーになってしまいます。
今XREAで話題の
ttp://itpro.nikkeibp.co.jp/article/NEWS/20051102/223939/
ttp://pc8.2ch.net/test/read.cgi/hosting/1130539792/
この騒動が原因であると信じたい…
XREA有料申し込んで1ヶ月しかたってないけど(しかも1年契約)
解約して制限ユルユルのロリポにいこうかな
0335nobodyさん
2005/11/10(木) 23:31:32ID:???0336nobodyさん
2005/11/11(金) 00:03:08ID:???<a href="test.php?files=ソ連">リンク</a>
test.php側でURL経由でわたされた$filesを表示させると
print_r($_GET['files']);
結果は >> ソ\連
と、カタカナのソの字の後に\マークが入ってしまいます。
いろいろ試した結果、引き渡す文字数や内容には関係なく、
カタカナのソがあればその後に無条件で\マークが付与
されてしまうようです。
受け取り側のtest.phpで\マークを除去するようプログラムを
組めば回避は出来ますが、どこか腑に落ちません。なぜ渡した
文字のうち”ソ”の字だけ\マークがついてしまうのでしょうか?
※もしかしたらソの字以外にも\マークが付く文字があるのかも
しれませんが試していないので何とも言えません。
0340nobodyさん
2005/11/11(金) 00:27:58ID:???まず、URLに使って良い文字と使っちゃいけない文字がある。
どういう文字が使えるかは、「RFC3986」でググって調べてみそ。
で、そういう文字はrawurlencode()を使って、使って良い文字に変換するようにする。(URLエンコード)
次に、shift-jisで「ソ」という文字は2byte目に 0x5c (= \) が含まれる。
他にも、「表、十」あたりもそう。
0x5cは特殊な意味を持つので、GET・POST・COOKIEにそれが含まれる場合に
自動的にエスケープする仕組みがPHPに組み込まれている。
エスケープされた結果、特殊な意味を持つ\では無く、\という文字そのものを表すようになる。
" "の中で \ を使う時に、 "\"" てな感じにするのを思い出してもらえば分かり易いかと。
これは、マニュアルの php.iniのmagic_quotes_gpc あたりを参照。
0341336
2005/11/11(金) 00:42:14ID:???php.iniのmagic_quotes_gpcをoffに変更することでソの字も問題なく
表示できるようになりました。助かりました、ありがとうございます。
0342nobodyさん
2005/11/11(金) 01:29:15ID:???0345nobodyさん
2005/11/11(金) 03:54:37ID:???0346nobodyさん
2005/11/11(金) 05:46:54ID:???0347nobodyさん
2005/11/11(金) 09:39:02ID:???> >>336
> " "の中で \ を使う時に、 "\"" てな感じにするのを思い出してもらえば分かり易いかと。
この部分なんか変じゃない?
0348341
2005/11/11(金) 13:49:18ID:???0352340,350
2005/11/11(金) 15:42:16ID:???布団をパタパタされたので急いでいた。
エスケープならなんでも良かった。
今は"\\"の方が良かったと後悔している。
0353nobodyさん
2005/11/12(土) 18:23:07ID:???しているんだけどOperaだと問題なくセッションを共有できるのにFireFoxだと
うまく共有できない(セッションIDが変わっている)
両方のphpファイルではちゃんと先頭で
session_start();
しているしなにがいけないんだろう?
OperaとFireFoxでプログラムの組み方変えなきゃならないの?
0354353
2005/11/12(土) 19:29:46ID:???PHPの設定パラメータ「session.use_trans_sid」が0に指定されていると想定し、
/* index.php */
session_start();
print "session_id = " . session_id();
<a href="session.php?<?=SID?>">リンクA</a>
<a href="no_session.php">リンクB</a>
/* index.php */
/* session.php */
session_start();
print "session_id = " . session_id();
/* session.php */
/* no_session.php */
session_start();
print "session_id = " . session_id();
/* no_session.php */
上記の3つのファイルを用意する。
index.phpにて「リンクA」をクリックすると表示されるセッションIDは同じである。(当然)
そのあとブラウザの戻るボタンを押しindex.phpに戻ってきてから次に「リンクB」を
クリックする。するとなぜかURLでセッションを引き渡してないにもかかわらず同じ
セッションIDが表示されるのである。
次に順番を変える。indexphpにて先に「リンクB」をクリックして(当然セッションIDは違う)、
それから「戻る」ボタンをおして戻ってきて、次に「リンクA」をクリックするとなぜかindex.php
で表示されたセッションIDと違うのである。URLでセッションを引き渡しているにもかかわらず。
0355nobodyさん
2005/11/12(土) 19:30:37ID:???0356353
2005/11/12(土) 19:31:59ID:???そこで問題なんだが先に「リンクB」を押してしまったとしても、
ブラウザの戻るボタンを押してindex.phpに戻ってきてから「リンクA」をクリックしたとき、
セッションIDがindex.phpのそれと等しくするよう(セッションが引き継がれるよう)にする
方法は無いだろうか?
0357nobodyさん
2005/11/12(土) 19:39:21ID:???問題はデータが渡せているかいないかだべ。
0358353
2005/11/12(土) 19:44:43ID:???0360nobodyさん
2005/11/12(土) 20:45:50ID:???>するとなぜかURLでセッションを引き渡してないにもかかわらず同じ
>セッションIDが表示されるのである。
実はクッキーで渡してたりして
0361nobodyさん
2005/11/12(土) 22:43:06ID:???0362353
2005/11/13(日) 01:08:33ID:???クッキーがオンのときでもURLでセッションを引き渡していなければ
引き渡されないようにする方法って無いんだっけ?
index.phpが表示されるたびにsession_idをrenewできればいいのかな?
>>361
レンタル鯖('A`)・・・
0363nobodyさん
2005/11/13(日) 02:31:35ID:???foreach ($str as $ch) {
switch ($ch) {
case ...
}
}
のように、文字列を一文字ずつ処理したいのですが、どういうふうにしたら良いですか?
上記のように書くとInvalid argument supplied for foreach()と言われてしまいます。
0364363
2005/11/13(日) 02:33:28ID:AK9WWUo70365nobodyさん
2005/11/13(日) 02:39:31ID:???アルファベットだけでいいのなら、$str[] で個々にアクセスできるから、for文を使うとか。
マルチバイトならmb_substr()をクルクル回す。
0366nobodyさん
2005/11/13(日) 03:01:28ID:???もしforeachが使いたいなら、str_split(PHP5)やpreg_splitなどで配列にしてしまう手もあるね。
マルチバイトの場合mb_splitでは一文字ずつに区切れないので365のようにmb_substr使うのが最善かな。
0367363
2005/11/13(日) 03:06:15ID:AK9WWUo7どうもありがとうございます!
foreachに直接文字列は使えないんですね。
参考になりました。
0368nobodyさん
2005/11/13(日) 03:12:09ID:???ちなみにPHPでは文字列の部分文字に角カッコ[]でアクセスするのは非推奨らしい。
中カッコ{}を使うべし。$str{$i}みたいに。
C系やJavaなんかに慣れてると[]でアクセスできた方が気持ちいいけどね。
Zend的には文字列と配列は混同すべきでない、って立場らしい。
363のようなforeachに対する混同をなくすためっていう意味あいもあるのかな。
個人的にはforeachで文字列も回せたほうが気持ちいいんだが。
(需要の有無は別として)
0369363
2005/11/13(日) 03:31:27ID:AK9WWUo7参考になります。
すみません、もう一つ質問なんですが、PHPでクロージャのようなものは実現できませんか?
0370nobodyさん
2005/11/13(日) 03:52:48ID:???関数を無名で定義したいという意味ならPHPでは無理。
ただ、可変関数を使えば関数へのアクセスを変数に格納したり引数で渡したり別の関数の返り値にするなどの模倣はできる。
$f = "strlen";
echo $f($f); // 6を表示
このとき関数名を文字列で持ちまわす必要があるので、匿名の関数という考えがPHPにはない。
0371nobodyさん
2005/11/13(日) 03:59:57ID:???嘘イクナイ。
http://jp.php.net/manual/ja/function.create-function.php
まあ、使いづらいというか書きづらいものではありますが。
0373nobodyさん
2005/11/13(日) 04:28:06ID:???evalに近い保守性の低下を招きそうなところが難点だね。
利点は関数の名前を自分で考えなくていいってことくらい?
0374363
2005/11/13(日) 04:49:35ID:AK9WWUo7ありがとうございます。本当に勉強になります。
まだまだ自分の勉強不足を思い知らされました。
色々と奥が深そうですね。どうもありがとうございました!
0375nobodyさん
2005/11/13(日) 05:37:38ID:rUB5/Vi+0376nobodyさん
2005/11/13(日) 05:44:07ID:???{
$a1["data"] = 大きなデータ1
$a2["data"] = 大きなデータ2
$a1["ref"] =& $a2;
$a2["ref"] =& $a1;
unset($a1);
unset($a2);
}
shori(); // 1回目
shori(); // 2回目
このようなコードで1回目の処理が終わったところで占有されていたメモリは解放されます?
解放されないとしたらどう対処すべき?
$a["ref"]は実際には別の関数で隠蔽してたりして、解放時にアクセスするのは避けたい場合もあるのでunset($a["ref"])ができるとは限らない状況なんです。
0377nobodyさん
2005/11/13(日) 07:32:49ID:???2chを見ているとPHPはプログラミング初心者向けのような印象です。
PHPのプロフェッショナルの方々から見るとどのような見解ですか?(得られるものはどれくらいありますか?)
一応C++とJavaScriptとVBの経験がありますけど、PHPの用語など自分にはかなり高度に見えるのですが。
できれば中高生向けの解説HPや本など教えてもらえると思います。
PHP以外にもサーバサイドインタフェースが取り扱いできる言語があったらいいのですが。
0378nobodyさん
2005/11/13(日) 08:14:36ID:???PHP5でイテレータ使ってみた。微妙w
class StringIterator implements Iterator {
private $chars, $pos, $len;
public function __construct($utf8_str) {
$this->chars = preg_split('/(.)/su', $utf8_str, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
$this->len = count($this->chars);
$this->pos = 0;
}
public function __toString() { return implode('', $this->chars); }
public function current() { return $this->chars[$this->pos]; }
public function key() { return $this->pos; }
public function next() { $this->pos++; }
public function rewind() { $this->pos = 0; }
public function valid() { return $this->pos < $this->len; }
}
$str = new StringIterator('【PHP】質問スレッドpart30【php】');
echo $str, "\n"; // echo $str->__toString() . "\n";
foreach ($str as $char) {
echo $char, "\n";
}
0379nobodyさん
2005/11/13(日) 09:03:04ID:???なるほど。発想的にけっこう面白いんじゃないかな。
JavaでいうStringTokenizer、STLでいうstringstreamに通じるものがあるね。
洗練させればforeachでちょっとした字句解析なんてのもできそう。
foreach ($str as $token) ...
ってな感じで。
0381nobodyさん
2005/11/13(日) 09:10:53ID:???0382nobodyさん
2005/11/13(日) 09:13:29ID:???0383nobodyさん
2005/11/13(日) 09:18:44ID:lJ8slral//設定
$yourname = $_POST['name'];
$file=fopen("name.dat","r");
while($row=fgets($file,1024)){
if(eregi('($yourname)[a-z0-9./_\-]+',$row,$data)){
print($data[0]."<br />");
}
}
fclose($file);
?>
ユーザがフォームに文字例入力して[送信]ボタンを押すと
上のプログラムが[name.dat]中から既出を検索してくれるプログラムを作りました。
これで正規表現の検索が出来ると思ったのですが、なぜかprintしてくれません。
どこか悪いところでもあるのでしょうか?
お願いします。
0384nobodyさん
2005/11/13(日) 09:48:26ID:???整数だけど。
>>383
まずはパターンの部分をシングルクォートではなくダブルクォートに。
$rowには改行も含まれているので、たぶんtrimか何かで削除すべきでは?
あとはそのname.datの一行に含まれるデータがどういう形式かわからないと何とも言えない。
[a-z0-9./_\-]+ってのがすごく奇妙なんだが。
0385nobodyさん
2005/11/13(日) 09:51:42ID:???なぜくだ質スレで回答をもらっているのにここに来る?
FAQにすら載らない基本中の基本を分かっていないのなら、
マニュアルの「言語リフアレンス」の項目を音読することをお奨めする。
■ このスレッドは過去ログ倉庫に格納されています