【PHP】質問スレッドpart26【php】
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
04/12/21 22:34:55ID:???0778nobodyさん
05/02/14 01:35:57ID:???>./phpdocxml.dcl:179:1:E: end of document in prolog
179行1列目って何?prologなんてワカンネ。タグ不整合とか?
0781nobodyさん
05/02/14 01:44:41ID:???オレのESP能力によるとお前はこいつと同一人物に間違いない
http://www.google.co.jp/search?hl=ja&q=%22777get%2C+zuzaa%22&lr=
0782776
05/02/14 01:46:07ID:4jK1nMAEphpdocxml.dclの内容は以下のURLの内容と同じです。
http://cvs.php.net/annotate.php/peardoc/phpdocxml.dcl?rev=1.1.1.1
179行目は最終行の > になります。
0783765
05/02/14 02:02:44ID:8mFM3xspハンドラに渡されたものを全部array_push()して、それをダンプしてみましたが、
"ABC & DEF"とくるはずのものは、"DEF"としか渡されていませんでした。
"ABC"とか"&"とかはまったくハンドラに渡されていません。
xml_parseの仕様でしょうか?
0784nobodyさん
05/02/14 02:14:53ID:???とりあえず上で言われているとおり&のせいかと
実体としてパースされるのでPCDATA領域に&書いたらダメよ
情報不足なのでこれ以上の回答は望めないかと
0785nobodyさん
05/02/14 02:43:43ID:???0786nobodyさん
05/02/14 02:47:26ID:???0788nobodyさん
05/02/14 04:24:51ID:???確かに。DEFの頭の方にスペースがくるとは思わなかった。
サンプル1:<test>ABC & DEF</test>
結果1:
startElement[TEST]
charData[ABC ]
charData[&]
charData[ DEF]
endElement[TEST]
サンプル2:<test><![CDATA[ABC & DEF]]></test>
結果2:
startElement[TEST]
charData[ABC & DEF]
endElement[TEST]
0789nobodyさん
05/02/14 04:27:44ID:???<?php
// $text = '<test>ABC &amp; DEF</test>';
$text = '<test><![CDATA[ABC & DEF]]></test>';
$parser = xml_parser_create('UTF-8');
xml_set_element_handler($parser,'startElementHandler','endElementHandler');
xml_set_character_data_handler($parser, 'charDataHandler');
$result = xml_parse($parser,$text);
if(!$result) {
die(xml_error_string(xml_get_error_code($parser)));
}
xml_parser_free($parser);
function startElementHandler($parser,$name,$attribs) {
echo "startElement[$name]\n";
}
function endElementHandler($parser,$name) {
echo "endElement[$name]\n";
}
function charDataHandler($parser,$cdata) {
echo "charData[$cdata]\n";
}
?>
0790nobodyさん
05/02/14 04:46:55ID:???0791nobodyさん
05/02/14 07:31:39ID:pVfR11DEWarning: No ending delimiter '^' found in /home/www/dbusf000/public_html/seminar.php on line 147
147行目は以下の通りです。
if ( (!preg_match("^[ァ-ヶ?・]*$",$_REQUEST["company_name_kana"])) or strlen($_REQUEST["company_name_kana"]) > 100){
正規表現がまちがってるんでしょうか?
「正規表現メモ」のサイト見ても、どうもマチガイがわからなくて。
お助け願えれば幸いです。
0794nobodyさん
05/02/14 18:06:20ID:???0795nobodyさん
05/02/15 00:02:35ID:FkUTlorqMySQLに保存するようにしたのですが、
時々何かのタイミングでエラーになります。
非常に再現性に乏しいので凹みます。
バージョンは4.3.10です。
ハンドラ書き換えはバギーなのでしょうか?
オリジナルのセッション機構を書いた方が良いのでしょうか…。
0796nobodyさん
05/02/15 01:18:37ID:???DB(MySQL/PostgreSQL)にも、ネットワークファイルにも
書き込んでるけど全然問題ないよ。
貴方のシステム環境が安定してないだけじゃ。
0797nobodyさん
05/02/15 02:30:29ID:???ありがとうございます。
あやうく書き直すところでした。
Unexpected character in input: '
というエラーなのですが、わりと良くある障害のようで、
MLを検索したところ原因はmbstring周りのようです。
セッションハンドラを書き換えたあたりから出始めたので
それが原因と思いこんでいました。
0800nobodyさん
05/02/15 03:56:19ID:???___ ,,.. -' "/ { ` -一-ヾ ヽ. ヽ ☆
/ ▽ / ∧ ヽ、, _,, }}_} ・ ii /
/ { {ゝ{__`ー-Y´f。Vハ'V } * ・ ii
! 〃 i ハ ´{ ヽ 、ソ } く ☆ ii 氏ね
ヾ{{ ☆ `ヾ、_`ヽ'^' ヽ " ! ! i ゚ : ii
ヽ{{ * . ハ く) /.l、! ! ; .ii
ヾ、. { ` ーj‐' {ムノ_ ノ
ヾ , '´  ̄ー‐‐- ' ` く
` ー---─,' 、 、}
,' ,〈 , -ー‐-、i∠⌒ヽ
,' ∧<=ニ二‐ノヽ、二ソ
/ ./ } `"''' "; `7T´
0801512
05/02/15 03:57:28ID:???0802nobodyさん
05/02/15 11:21:45ID:???なんか良く判らないけどエラーが出るようになったつうのは
APCとかのPHPアクセラレータ入れてると出ることがあるので
もし入れてたら切ってみて暫く様子見するのもいい。
0803nobodyさん
05/02/15 17:13:10ID:???// ランダムリンク設定(表示コメント|URL)
$banner = array(
'コメント1|http://***.com',
'コメント2|http://***.co.jp',
'コメント3|http://***.jp',
);
function rnd_banner($banner){
mt_srand((double)microtime()*1000000);
$num = mt_rand(0,(count($banner)-1));
//コメント,URL分割
list($comment,$url) = explode("|",$banner[$num]);
//タグ生成
$display_banner = '<a href="'.$url.'" target="_blank">'.$comment.'</a>';
return $display_banner;
}
?>
------------------
このソースを、表示したいphpに直接貼り付ける形式ではなく、
「random.php」などと名付けて別途保存し、
表示したいphp中に
<?include("random.php");?>
のように挿入して表示できるようにしたいのですが、
どの部分を書き換えれば想定どおりの処理ができるようになるでしょうか?
0804nobodyさん
05/02/15 17:16:33ID:???関数の定義をしているだけなので、それをどこかで呼び出さないと実行されない。
random.phpの中で、echo $display_banner; の一行を入れておけばよい
0805nobodyさん
05/02/15 17:30:29ID:???$display_banner = rnd_banner($banner);
これを加えて random.php としておく。
表示用のPHPのほうで、このファイルをincludeしておき、
表示させたい位置に、
<?=$display_banner?>
を入れる。
0807nobodyさん
05/02/15 20:39:01ID:ELNssm3M0808nobodyさん
05/02/15 22:01:04ID:???指定の箇所に作成する方法がわかりません。
イメージ的に
フォーム送信→ファイル作成(open)→ファイル書き込み(print)
というのはなんとなくイメージ出来るのですが、これを
どうやって毎回テキストファイルを作成するのかよくわかりません。。
すみませんが、ヒントをいただけないでしょうか?
0809808
05/02/15 22:21:44ID:???test.phpにアクセスするとファイルが作成されるという。。
<?php
$lombardia = fopen('test.txt', 'w');
fwrite($lombardia, 'test');
fclose($lombardia);
?>
0810nobodyさん
05/02/15 22:36:14ID:???0811nobodyさん
05/02/15 23:14:11ID:???0812nobodyさん
05/02/15 23:15:57ID:aGG3pDPg/usr/local/bin/pear install http://pear.php.net/get/DB
という具合に。そうしたらzlibが見つかりませんというような
エラーがでました。
調べたところPHPをインストールしたときにzlibなるものを
インストールしていなかったのが原因だと思うのですが、
zlibを組み込むには再度PHPをコンパイルしなおさないと
いけないのでしょうか?
0813nobodyさん
05/02/16 00:24:48ID:???0814nobodyさん
05/02/16 00:32:41ID:???0815nobodyさん
05/02/16 23:11:51ID:kByGIo+tWeb上で多数のユーザーから同時アクセスが想定される状況で
ユニークな文字列を生成したいのですが、
uniqid()の信頼度はどの程度のものなんでしょうか?
サーバーが単一の場合はprefixを付与しただけで十分実用レベルでしょうか?
またホストが複数サーバーに分かれてる場合ではどうでしょうか?
マニュアルに載っているように
> $better_token = md5(uniqid(rand(),1)); // 推測が困難であり、より優れている。
とすればほぼ大丈夫と思って良いですか?
uniqid()の仕組みだけでも教えて貰えたら、と思います。
あいまいな質問で済みませんがよろしくお願いします。
0816nobodyさん
05/02/16 23:26:24ID:???ミリ秒単位でユニークな文字列が作成される。
複数のホスト上で同時に実行して同じ文字列が生成されるのを防ぐために、
ホスト別にprefixを付けると良い。
って書いてありますよ。
uniqidの仕組みについては、ext/standard/uniqid.c を参照。
cvsだと、ttp://cvs.php.net/co.php/php-src/ext/standard/uniqid.c?r=1.40 あたりかな。
0817nobodyさん
05/02/17 13:56:50ID:???「ホスト別に」というところを何故か見落としてましたw
ホスト毎のprefixと乱数の組み合わせで行けそうですね
ありがとうございました。
0818nobodyさん
05/02/17 14:00:03ID:???0819nobodyさん
05/02/17 22:47:38ID:3YY24TUDarray_unshift( $n, array( "value", $v ) );
↑こうやると、↓こんな警告が出る。
Warning: array_unshift(): The first argument should be an array
0820nobodyさん
05/02/17 23:08:56ID:???>あいうえお<BR> >かきくけこ<BR> さしすせそ<BR>
このレスを表示する際、>(引用符)の行の文字カラーを変更したいです。
$com = eregi_replace("(^|/>)(>[^<]*)", "\\1<FONT COLOR=\"FF0000\">\\2</FONT>", $com);
ですと、実際に表示される際の一行目「>あいうえお」 …のみしか適用されません。
これをコメントの全ての行に適用するにはどのようにすれば良いのでしょうか。
0822nobodyさん
05/02/17 23:23:36ID:???正規表現を考える前に
引用符としての">"とタグ<BR>が混在しているのだが、
引用符のところは>ってカキコしたものなのか?
>あいうえお<BR> >かきくけこ<BR>....
なのか、
>あいうえお\n >かきくけこ\n....
どっち?
0823nobodyさん
05/02/17 23:31:43ID:3YY24TUDマニュアルの一部をコピペしただけでわかるかよ。
0824nobodyさん
05/02/17 23:40:48ID:???変数に入ってる値も不明なソースの一部をコピペされただけでわかるかよ。
つか、そのソースとエラーの内容からだと>>821に適合して無いことが原因か、
適合しててもエラーが出るなら、それこそ具体的な値が判らんとわかんねぇよ。
バグの可能性があるんだから。
0825nobodyさん
05/02/17 23:48:01ID:yKXCmIvo0826nobodyさん
05/02/18 00:28:16ID:7WdjA1S7わかりやすい自演の例…
0827nobodyさん
05/02/18 00:31:52ID:???返信が遅くなりすいません。
ログ(書き込み時)は、引用符の">"は>で格納されています。 (ユーザーが">"と書き込みしたものです)
\nは<BR>で格納されています。 (ユーザーが改行したものです)
読み出し時は、
list($no,$re,$dat,$nam,$eml,$sub,$com,$url,$hos,$pw,$col,$ico) = preg_split("/<>/",$line);
("<>"がセパレータ)で読み込みしていますので、
前レスの「レスを表示する際」には、書き込み時の形のまま(前者)が$comに格納されていると思います。
記事展開の周辺は、
# 記事を展開
$i=0;
$flag=0;
$lines = file($logfile) or error("Open Error: $logfile");
$top = array_shift($lines);
foreach ($lines as $line) {
list($no,$re,$dat,$nam,$eml,$sub,$com,$url,$hos,$pw,$col,$ico) = preg_split("/<>/",$line);
です。
0828nobodyさん
05/02/18 00:53:39ID:???0829827
05/02/18 01:05:23ID:???">"が、">"で格納される場合と">"で格納される場合に分かれていたようです。
(この部分の詳細は今は不明です)
最終的に、(>)で格納されているとした場合、下記で大丈夫…だと思います。たぶん。
$com = eregi_replace("(^|>)(>[^<]*)", "\\1<FONT COLOR=\"999999\">\\2</FONT>", $com);
0830nobodyさん
05/02/18 01:06:46ID:???&gtで格納されている場合
$com = eregi_replace("(^|>)(&gt;[^<]*)", "\\1<FONT COLOR=\"999999\">\\2</FONT>", $com);
0831nobodyさん
05/02/19 19:52:30ID:???その中の人数の母体に対するパーセンテージを求めようと思い、
考えて下記のスクリプトを作ったのですが、改良案やもっといい方法が
あればアドバイス頂けないでしょうか。
$percent = substr($num/$amount,2,2);
$percent = preg_replace("/^0/","",$percent);
$num/$amountすると、例えば0.4056414とかいう割り切れない数字が出てくるので、
substrで小数点以降から2桁切り出して、(ここでいうと40)
一桁パーセントの場合は、08とかの結果になってしまうので先頭の0を取る
という処理にしました。
でも、substr(割り算,2,3)としたら、この場合結果が405で、40.5%のようにも
したいなと思っているのですが、そうすると、
substr($result(405が入ってる),1,2) . '.' .substr($result,3,3) . '%';
なんてしなければいけないのかと思うのですが、もっとスマートなやり方
とかありますでしょうか。
長文ですみません。
0832831
05/02/19 19:56:35ID:TVy8jZr4よろしくお願いします。
0833nobodyさん
05/02/19 20:05:25ID:???http://jp.php.net/sprintf
0834nobodyさん
05/02/19 20:05:52ID:???0835nobodyさん
05/02/19 20:09:30ID:???0836831
05/02/19 20:13:23ID:???そう言われてみるとそうでした・・・。
PHPは関数がたくさんあって、計算とかするより関数使わなきゃいけないんだと
強固に思い込んでしまってて、変なことしてました。
お恥ずかしいです。すみません、ありがとうございました。
0837nobodyさん
05/02/19 21:03:02ID:5g9U41P6URLに、?a=1&b=2&c=3ってパラメータを埋め込んだとして、
foreach($_GET as $value){
echo $value;
}
ってした場合、a、b、cの順序で出力されますか?
何がいいたいかというと
パラメータの順序通りに配列にはいってるのかなぁって
疑問に思ったのです。
0838nobodyさん
05/02/19 22:47:47ID:???パラメータの順序通りに入ってたよ
0839837
05/02/20 00:18:51ID:hvCabO8Iもうしわけありませんでした。
説明が悪かったです。
PHPのバージョンや環境に関わらず
常に順番どおりに入っているのかが
疑問点なのです。
よろしくお願いします。
0840nobodyさん
05/02/20 00:36:12ID:???仕様として明記されていない事は不定。
不定なことに対し一定であることを期待して
プログラムを組むのは、ドツボにはまる一要因ナリ。
0841nobodyさん
05/02/20 10:19:13ID:???0842nobodyさん
05/02/20 10:36:02ID:???function quickSort($arr,$left,$right){
if ($left <= $right) {
$p = $arr[($left+$right) / 2];
$l = $left;
$r = $right;
while($l <= $r) {
while($arr[$l] > $p){ $l++; }
while($arr[$r] < $p){ $r--; }
if ($l <= $r) {
$tmp = $arr[$l];
$arr[$l] = $arr[$r];
$arr[$r] = $tmp;
$l++;
$r--;
}
}
}
$this->quickSort($arr, $left, $r);
$this->quickSort($arr, $l, $right);
}
}
見よう見まねで作ったソートなんですけど、実行すると
PHP has encountered a Stack overflow
ってエラーが出ます。
おかしな所があれば修正お願いします。
0843nobodyさん
05/02/20 12:36:47ID:???0844nobodyさん
05/02/20 13:47:32ID:???0847nobodyさん
05/02/22 00:28:25ID:WO7XFPFB呼び出し元の関数の名前を知る方法はないでしょうか?
0848nobodyさん
05/02/22 00:35:54ID:???ありますよ。無名な関数を使いますが。
私が即席で作った下の関数を研究してみてください。
この関数をどの関数から呼び出されたのかを知りたい
関数から呼び出してみてください。名前が返ります。
function whocall() {
$bt = debug_backtrace();
return $bt[2]['function'];
}
0852847
05/02/22 11:53:12ID:???ありがとうございます!
$bt[1]ですよね?
こんな関数があるとは知りませんでした。
>>850
そうしていたのですが出来るなら省略したいなと思いました。
>>851
そうですよね。
0853847
05/02/22 11:54:59ID:???失礼しました。
0854nobodyさん
05/02/22 13:10:07ID:d7ashhNp電源が入ってたり入ってなかったりするサーバに対し、
いま電源が入っている(アクセスできる)かを確認し、
その結果によって [Online] / [Offline] のような文字または画像を表示したいと考えています。
(結果を表示するページのサーバは、常にアクセス可能とします)
file関数で情報を取ってこれるかというやり方をしようと考えましたが(以下にスクリプト)、
この場合は yahoo.co.jp など存在し、アクセス可能なドメインでは[オンライン]、
yahoo.co.jppなどの存在しないドメインは[オフライン]と即表示されます。
しかし、ドメイン登録してあるのにサーバ電源が落ちている場合にはすぐには表示されません。
(set_time_limit関数の使い方は間違っているのでしょうか・・・)
set_time_limit(3);
$a = (@file("http://www.hogehoge.jp/")) ? "オンライン" : "オフライン";
print $a;
何か良い考えが思いついた方は、ご教授頂けるとありがたいです。
環境はPHP4.3.3 on RedHatLinux 7です。
0856854
05/02/22 13:51:59ID:d7ashhNpレスどうもありがとうございます。
set_time_limit(3);
$a = (@fsockopen("www.hogehoge.jp", 80, $errno, $errstr, 3)) ? "オンライン" : "オフライン";
print $a;
としても、「オフライン」の場合には結果表示にデフォルトのタイムアウト時間までかかってしまいます。
即座に表示することはできないでしょうか。
上のスクリプトでは処理を3秒でタイムアウトさせて結果を表示させたいと考えているのですが。。
(上のスクリプトでは、オンライン/ドメインが存在しない場合は即座に表示されます)
0858nobodyさん
05/02/22 17:58:06ID:RE6B17ts例えば、C だと以下のようなことは御法度です。
char* func(){
char *abc = "abcdefg";
return abc;
}
PHPではこんなこと出来ますか?
function func(){
$abc = "abcdefg";
return $abc;
}
0859858
05/02/22 18:03:01ID:???すみません、ちょっと質問の仕方を間違えました
PHPでは関数の返り値に、CでいうAuto変数のポインタを返せますか?
0860858
05/02/22 18:13:34ID:???仕切り直します。
PHPでは関数の返り値に、CでいうAuto変数のポインタを返せますか?
例えば、C だと以下のようなことは御法度です。
char* func(){
char abc[] = "abcdefg";
return abc;
}
PHPではこんなこと出来ますか?
function func(){
$abc = "abcdefg";
return $abc;
}
0861nobodyさん
05/02/22 18:27:01ID:???そもそもPHPにはポインタという概念がないので...
変数そのものを指し示す必要があるなら、「リファレンス返す」かな。
0862858
05/02/22 18:35:13ID:???私の「参照」の概念がイマイチなのが問題のようです。
すみませんでした。
0863nobodyさん
05/02/22 18:46:16ID:???http://www.php.net/manual/ja/language.references.php
0865nobodyさん
05/02/23 20:36:20ID:???どなたかヘルプお願いします。/home/foo/lib/ext/pear以下に、全てのライブラリをまとめようと思っています。
$ wget http://go-pear.org -O go-pear.php
...(略)...
$ php go-pear.php
...(略)...
1. Installation prefix : /home/foo/lib/ext/pear ← ここを任意のディレクトリに変更
...(略)...
Would you like to install these as well? [Y/n] : y
Loading zlib: ok
Downloading package: PEAR-stable......ok
Downloading package: Archive_Tar-stable....ok
Downloading package: Console_Getopt-stable....ok
Downloading package: XML_RPC-stable....ok
Bootstrapping: PEAR...................(remote) ok
Bootstrapping: Archive_Tar............
Warning: mkdir(/tmp/gope11Ui8e/Archive): File exists in /home/foo/bin/go-pear.php on line 622
(remote) ok
Bootstrapping: Console_Getopt.........
Warning: mkdir(/tmp/gope11Ui8e/Console): File exists in /home/foo/bin/go-pear.php on line 639
(remote) ok
Downloading package: DB...............ok
Downloading package: Net_Socket.......ok
Downloading package: Net_SMTP.........ok
Downloading package: Mail.............ok
Downloading package: XML_Parser.......ok
Downloading package: PHPUnit..........ok
Fatal error: Undefined class name 'pear' in /home/foo/bin/go-pear.php on line 675
となります。何かヒントがあれば幸いです。
0866nobodyさん
05/02/23 21:59:50ID:???してみるとか。...面倒か。
0867nobodyさん
05/02/24 03:10:14ID:/1etLdeQエラーを修正することが急務ですが、何よりも、このエラーログの肥大化をストップするように言われました。
あちこち探したのですが、見付かりません。
エラーレポートを吐き出さないようにする方法はありませんか?
0871nobodyさん
05/02/24 07:09:09ID:???配列丸ごと書き換えることはできないんでしょうか?
変数をひとつひとつ書き換えていて、発狂寸前です。
0874nobodyさん
05/02/24 09:20:42ID:???array_map()使わなくても「変数をひとつひとつ書き換え」る馬鹿は、そうはいないと思うけど。
0876nobodyさん
05/02/24 11:54:17ID:???発狂しそうな方法ってこれ位しか思いつかないんだけど、まさかこんなの?
$data['sono1']=htmlspecialchars($data['sono1']);
$data['sono2']=htmlspecialchars($data['sono2']);
$data['sono3']=htmlspecialchars($data['sono3']);
$data['sono4']=htmlspecialchars($data['sono4']);
:
:
ずっと続く
他にあったら知りたい。つーか、普通にループを使う方法しか
思いつかなくて、これ以上効率の悪い方法が考え付かん。
0877nobodyさん
05/02/24 12:00:20ID:???if (!is_array($val)) {
$_POST[$key] = htmlspecialchars($val);
}
}
変数をひとつひとつ書き換えるよりはループで回したほうが
■ このスレッドは過去ログ倉庫に格納されています