【PHP】下らねぇ質問はここに書き込みやがれ 22
htmlに埋め込むアクセス解析を作りたいのですが、 どうすればよいのでしょうか? htmlにincludeは無理ですよね
サッカー見ろよ非国民
>>584 imgタグでアクセス解析をしつつ画像を返すPHPスクリプトに飛ばすとか、
フレーム使うとか。
587 :
581 :2006/06/18(日) 23:54:08 ID:???
>>582 質問がくだらなすぎた・・ごめん
そしてありがとう!
>>584 鯖の設定次第じゃなかったっけ?
*.htmlでもPHPとしてちゃんと認識してくれるような設定になってるとこも
あったと思う。
php://outputストリームの明示的なcloseはどうやって行うのでしょうか? <html> 略 </html> <?php fclose(output); sleep(5); // 重い処理 ?> 的なことがしたいのですが。
>>590 ソースっても...山ほどあるからぐぐれw
少なくてもApacheとIISには拡張子で
振り分ける機能が普通にある。
>>590 <?php ?>が含まれてない.phpファイルがあってもいいように
単に.htmlをphpパーサに渡すだけじゃん。
ソースとかの問題じゃないよ。
>>590 拡張子がphpやcgiだとCGIとばれるからアタックを受けやすい
だからセキュリティに厳しいとこはよくやってる
ソース欲しいならApacheの設定ファイル(httpd.conf)でも見て来い
UNIXは拡張子でOSが勝手に実行アプリを判断することなんてないからな
Yahoo!がそういうことしてるっぽいかなーとかふと思った。 htmlファイルなのにアクセスするたびにソースが変わったりしてたような。
>>583 > RSSフィードを作るのに FeedCreator.class.php 以外に良いものってありますか?
これスレ違いでしたかね…
みんな自分で書いているのでしょうか
デジカメで撮ったファイルって「DSC00124.jpg」見たいな感じで 英数字が混ざったファイル名が多いじゃないですか これを上手く表示させるために $common = DSC00 $open = 001 $close = 124 のようにして、DSC00001〜DSC00124のファイルをHTMLで表示しようと思って for($a=$open ; $a<=$close ; $a++){ print("<img scr=\"{$a}\"><br>") } っていうことを考えたんですけど、$a = $open が 001 となっていて、以降1ずつ加算していくと 002ではなく普通に 2 という値が入ってしまいます。 これはどのように回避すればよいでしょうか?
0<>1<>2<>3<>\n 1<>2<>3<>0<>\n 2<>3<>0<>1<>\n 3<>0<>1<>2<>\n このように<>区切りで情報が書かれているテキストで、 任意の列を基準にソートするには、どうすれば良いのでしょうか。
601 :
nobodyさん :2006/06/19(月) 10:00:33 ID:Pg3y549I
>>600 データがさほど多くないのならfileで全部読んで
explodeを使って目的の列のデータで配列を作ってその配列をasortかarsortして
そのキーの並び順通りにファイルに書き出すなり使うなりすればいい
多いのならデータベースを使うべき
603 :
nobodyさん :2006/06/19(月) 10:21:16 ID:ywXHAQss
変数の初期化って具体的に言うとどういうことですか? 僕の買った本にはPHPは変数を初期化しなくても使えるから気にするなみたいに書いてあるのですが、一説には初期化しないとセキュリティ的にダメとか...。 くだらないですが、宜しくお願いします。
セキュリティ的に駄目ということはないと思う ただ、使い捨てのコードならともかく、長く利用するコードなら その変数が初期化忘れてでたまたまうごいているのか、 意味があって未定義にしているかが、わからないと 数ヵ月後に、もう一度そのソースを見たときに苦労することになる
php5 smarty apacheを使って認証アレコレを勉強しているんですが、 認証okならセッションにログイン情報を格納して、"logout.php"へのリンクを踏むと ログアウト処理してトップ画面を表示 ということがしたいのですが、ブラウザのURL入力欄に"〜sample/logout.php"と出てしまいます。 これを"〜sample/"と表示させるにはどうしたらいんでしょうか? logout.php内で ログアウト処理の後にheader("index.php") 記述しても ログアウト処理を踏まずindex.phpへ飛んでいるようです 参考になるHPなどあればご指南お願いしますm(_)m
606 :
nobodyさん :2006/06/19(月) 11:03:37 ID:ywXHAQss
>604 ありがとうございます。 セキュリティ的には問題ではないのですね。 逆に、未定義にする意味というか、未定義にしておく必要がある状況というのはどんなときですか?
607 :
600 :2006/06/19(月) 11:20:24 ID:???
>>601 ありがとうございます。usort関数についてはよく知らないので、
この後調べてみることにします。
>>602 ありがとうございます。確かにそれだと、うまくいきそうです!
>>601 さんと
>>602 が教えてくださった方法で速度を比べて、
速そうなほうを使ってみたいと思います。ありがとうございました!
608 :
nobodyさん :2006/06/19(月) 11:32:52 ID:ywXHAQss
例えば<input type="text" name="username">をサブミットして extract($_POST)とやるのと、 $username = $_POST['username']とやるのはどこがどう違うのですか? どちらも$usernameとして使えるようになりますが、前者は御法度ということになっていますよね?
>>597 文字列"DSC00001"をインクリメントしてみ
データーを呼出して、header関数のlocationを使ってサイト移動したいとき データーのURLには特殊文字が含まれていていいもの? それとも変換しておいたほうがいいの?
>>606 0とfalseとnullに違いを持たせるとき
C言語のほとんどの環境ではそれらはすべて0と同じ意味だけど
PHPなどはそれぞれ意味が違う
そのため
if (!$foo)
というコードを書いたときに $foo は0、false、null全てを許すのか
それとも
if ($foo === 0)
を簡略して書いたかを明確にしていないと、バグの原因になったりする
$foo = 0;
この初期化を通らないと
if ($foo === 0)
は警告が出る。これは、$foo にfalseやnullではなく数値の0が
入ってくることを期待する処理となる
614 :
nobodyさん :2006/06/19(月) 12:03:49 ID:ywXHAQss
>612 すごく分かり易いです。ありがとうございます!
だから変数は使用前に、 $name = ""; // 名前格納用 $age = 0; // 年齢格納用 とか宣言してから使うようにするといいってことだね><
616 :
608 :2006/06/19(月) 12:56:16 ID:ywXHAQss
>609 >4を読んで試したのですが、いまいちピンと来ないです。 extract($_GET)の場合だと、パラメータに付けた任意の値が代入されてしまいますが、extract($_POST)変数が上書きされることはないような気がします。 >4を読んで_GET[hoge]=fugefugaという値を送ってみたのですが、確かにextractによって$_GET[hoge]=fugafugaが成立(?)してしまいますが、例えばフォームに_POST[hoge]=fugafugaと入れてサブミットしても、extractで展開されて上書きという風にはならないです。 なんだか混乱していますが、extractが致命的な例を知りたいです。宜しくお願いします。
617 :
nobodyさん :2006/06/19(月) 12:57:29 ID:ywXHAQss
× extract($_POST)変数が ○ extract($_POST)の場合、変数が
くだらない質問はいいが、くだらないまたは間違った解答をするやつは消えろ
>>618 それじゃ、駄目だよ
ちゃんとどれが間違っているか指摘しないと
>>616 試してないけど、こういうのってヤバくね?
つか、ヤバいですか?
<form action="
http:// >>616 のサーバ/該当のスクリプト.php" method="post">
<input type="text" name="_SESSION[hoge]" value="fuga">
<input type="sumit" value="送信">
</form>
自分が知ってるのは「送信フォームが必ずサーバ上のHTMLから実行されるわけじゃないから気をつけろ」ということだけ。
個人のPC上にフォームをコピってきて、改変して実行される可能性もあるって教わったです。
つか、extractなんて初めて知った
>>620 んなことしなくてもHTTPしゃべれればいくらでも好きなようにPOST出来るわな。
質問です。 PHPとPostgresqlでツールを作ろうと考えています。 たとえば住所録で都道府県をセレクトボックスで入力する際に 001 北海道 002 青森 ・・・ といった選択肢を 1.テーブルを作っておくか、配列をファイルに書いておいてrequireするか 2.北海道なら"北海道"で持ってていいのか、001を持っておいて表示する際は$pref[ 001 ]みたいにするのか ex.そもそもPostgres系のスレでするべき質問か どうするのがベターなのでしょうか
625 :
nobodyさん :2006/06/19(月) 14:25:44 ID:ywXHAQss
>620 レスありがとうございます。 確かにそれは見ただけでヤバそうですね。面倒だけど、 $hoge = $_POST['hoge']; $fuga = $_POST['fuga']; (以下項目数ぶん続く) とやるのが一番安全確実なんですかね? でもやっぱなりextractが御法度のがわからんですorz registar_globals = OnはPOSTも変数上書きできたのでダメなのは分かったのですが...。
>>624 この状況で、別に言う必要もないことを敢えて言ってるからな
>>623 都道府県名が変更されることを考慮するか、
変更されたときに変更以前に選択された結果へ伝播するようにするか、
入力されたデータの使い道はなんなのか
など様々な条件によって異なってくるよ。
>ex.そもそもPostgres系のスレでするべき質問か
システム設計について基礎から学ぶのが正解
>>623 (1) 都道府県なんてほぼ変更ないだろうということで、別ファイルで配列作りインクルード
$pref[001] = '北海道';
$pref[002] = '青森県';
$pref[048] = '沖縄県';
(2) またはDBで別テーブルにしてJOIN
(1)は管理などが楽で直感的、PHP側が(2)と比べると冗長になる可能性はある。
DB側はPrimaryKeyで数値にして、SQL文も単純になりDB容量もすこーーし小さくなる。
ループ処理で "<td>$row[$i]</td>" とかしたいなら(2)かな
検索フォームも作りDBから抽出したりするなら(2)のほうが楽
>>628 "<td>".$pref[$row[$i]]."</td>"
(1)でもこうやればいいだけだから、これは(2)の利点として挙げるのは変だよ
まぁ道州制が導入されても10年後とかそんな感じだろうしね
>>625 >>4 を読んでも分からんのならもう分からないままで良いんじゃない?
誰もextract()が絶対ダメとか言ってないわけでさ、
別に問題ないケースもあるわけだから。
多分君のスクリプトでは問題は起こらないんだよ。
>>623 そんなの作る人の趣味で決めて良いと思う。
俺なら$_POST['location'] = "北海道"で済ますなあ。
633 :
623 :2006/06/19(月) 17:23:57 ID:???
>>629 MySQLで悪いけど、こういう時とかかな
while ( $row = mysql_fetch_array($res) )
{
echo "<tr>";
foreach ($row as $cell) { echo "<td>$cell</td>"; }
echo "</tr>";
}
extract($_GET); if ( hogehoge ) { $file = "hoge.php"; } if ($file) { include($file); } こんな馬鹿なコードを書かないようにね!!
PHP+Eclipse+CVSで、お奨めの本ありませんか? 「オープンソース徹底活用 EclipseによるPHPスクリプト開発」 という本があって良さそうなのだけど、古い本のもよう。 今時の新しい良い書籍が在れば教えてください。
質問です。 10件ごとにページ移動で表示させたいのですが、 全てのデータを10件ごとに表示はできるのですが、 検索結果を10件ごとに表示するやり方がうまく思いつきません。 どなたか教えてください。
>>637 状況が良くわからない
「全てのデータ」配列があって、そこから「検索結果」配列ができているんだろ
すでに10件ずつ表示できるのなら、そのまま表示できるだろう?
データベースを利用した場合は、PHPの問題じゃなくてSQLの問題だ
データベースによって仕様が違うのでなんともいえないが、
普通、limit やら、top やらを使って、10件ずつとか取得してくる
こいつらが使えない場合は、あきらめて全件取得してくるしかない
いや、一度全部のデータを読み込んで 一度検索結果のみを配列に格納したほうがいいのかな?
よくないだろ。 全件文の行数が知りたいなら、1 count 2 必要分だけデータ取得 の2クエリ
>>641 つまり、一行ずつ読み込んで
検索が一致したらその数を数えるということですか?
>>642 状況をもっと詳しく説明しろ
その検索もとは何だ?
データベースか?CSVファイルか?それ以外の何かか?
$data = "データの場所"; $file = file($data); $count = count($file); for($i=0;$i<$count;$i++){ 行[$i]を読み込む if(検索で一致){ $search++; } if($search>=10){ break; } } こうですかわかりません><;
>>645 ボクちゃん。
まずは、もっと基本的なことを勉強してこようね。
>>645 ( ゚д゚) …普通のxxxx.cgi?
(つд⊂)ゴシゴシ
(;゚д゚) ….cgi?
(つд⊂)ゴシゴシゴシ
_, ._
(;゚ Д゚) …!?
まあ
>>639 の上段が全てだと思う。
全てのデータを10件ずつ表示できるのなら
検索にヒットするデータをそれと差し替えれば良いだけのこと。
問題はこれがPHPの質問なのかどうかってことだ。
>>648 xxxx.datだったら直リンで中身見れるから・・・。
CSV??
つまり、検索にヒットしたデータを配列に格納すればよいのでしょうか?
>>649 ああ、そういうことか。おk、把握した。
仮に$linesという配列に全データを入れたとしよう。
で、その各要素から検索ワードにヒットしたものを$hittedという配列に入れるとしよう。
そしたら、全てのデータを表示する時は$linesを10件ずつ表示(1)して、
ヒットした物を表示したい時は
$lines = $hitted;
としてから$linesを10件ずつ表示(2)すればいいってわけだ。
お分かりかな?
テキストファイルだったら、fileで全件配列に入れちゃって 表示する範囲だけforで回しておけばいいよ。 どうせたいした量でもないんだろ。
いくらくだすれでもこれは^^
>>653 横からすまん。俺いつもそうやってるんですが、多い場合ってどうするのがいいんですか?
テキストファイルでやるとしたら・・。
ページャー付いてるスクリプトを見て理解するのが一番早いんじゃまいか?
>>655 多い場合はそもそもテキストファイルよりDB使うだろ。
どうしてもテキストファイルにしたいなら、何度も表示するようなものは
予めヒット数とかキャッシュしておいてfopen、fget()で最後のヒット行までしか読み込まないとか工夫すれば良いんじゃない?
条件がころころ変わるような検索は全件読み込まないと無理だけど、それでも一気にメモリを食うfile()は使わない方が良い。
>>655 テキストを読み込むバッファと、最終的に利用する配列を分ける
まずはバッファに読み込んで、必要なものだけ配列へコピーする
これを件数分たまるまで繰り返す
あ、ちなみに
>>657 のは[1][2]...とかページ数分のページャが付いてる場合ね。
prev nextしかないなら、表示数+1読めば次のページがあるかないか分かる。
と思ったが、そうでもいないな・・・。 最後の+1分が最後の行だったら結局最後まで読む事になるか。
件数が少なければこんな感じでいいんじゃないかい $page = 2; // 表示したいページ数 1-n $disp_count = 10; // 表示したい行数 $start_pos = ($page - 1) * $disp_count; $end_pos = $start_pos + $disp_count; if ($end_pos > $count) $end_pos = $count; // 10件に満たないときはどうするとかいろいろは // $start_pos,$end_posをどうにかする $arr = array(); for($i=0;$i<$count;$i++){ 行[$i]を読み込む if(検索で一致){ $search++; if ($end_pos < $i) break; if ($start_pos >= $i) { // 条件に合致しているとき$arrに溜める $arr[] = $file[$i]; } } } // $arrに目的のレコードが入ってるはず foreach ($arr as $rec) { echo $rec["....."].なんちゃら表示; } // 違ってたらスマ、誰か直して下さい。
くだスレらしくなってきた。
Basic認証とDigest認証なのですが
hittedはやばいよ
ツボったwwww
667 :
nobodyさん :2006/06/20(火) 07:39:43 ID:Js32egMI
data.txtにあるテキストデータの中で aaa,bbb,ccc,ddd eee,fff,ggg,hhh iii,jjj,kkk,lll とある内の fffを含むものを見つけて消すには どうしたらいいですか?
すれ違いだったらゴメソ。 <form method=post action=hoge.php> <input type=text name=これこれ> <input type=text name=あれあれ> <input type=submit value=こっちのばやい> <input type=submit value=あっちのばやい> </form> で、”これこれ”や”あれあれ”の中身を こっちのばやいに送るときと あっちのばやいに送りたいときが同じform上にあるときは ”input type=submit”や”form”にnameを付けたりして区別させるんですか
669 :
668 :2006/06/20(火) 08:16:25 ID:???
自己解決ですsumaso
画像アップする掲示板を作成してますが、 アップされたファイル名をユニークにしたいと思っています。 たとえば、 アップ前ファイル名 中田.jpg アップ後ファイル名 imge1DOf7.jpg こんな風にリネームする関数ありましたでしょうか。
>>670 俺ならデータが同じであるかを考慮してデータからハッシュ取るよ。
そういうのが必要なければ
>>671 の時刻(ミリ秒)で良いんじゃないの。
あとuniqid()
>>667 file()でデータ取得して
正規表現でfff探して
見つかったらunlinkで消す
>>673 行を消したいのかもね。
file()でデータ取得して
正規表現でfff探して
見つからなかった行をスタックして
最後にスタックした行があるのならファイルを書き直す
って感じか。
質問 仕事でPHPやるときってPHP4と5どっちが多い?
例えば以下のようなソースが$dateに入力されているとします。
<a href="
http://yahoo.co.jp "><img src="logo.jpg" width="100" height="50"></a>
<strong>アクセスはこちらまで!!</strong>
このソースから画像表示(<img>タグ)だけを取り出してechoで表示させることは
出来ますでしょうか?
>>667 673 674
preg_grep を使えば見たが目スマートに解決できる。
>>667 preg_grep と書いたが、ファイルから読み出して特定行を消して書き直すのであれば、
fopen( +r) からの処理で、
1行づつ読み出し、 strpos にて、fffがあるかをチェックして、
ないなら、書き出しようの配列に追加、
全行チェックの後,
ftruncate
fseek
fput
fclose
の手順が、ファイルロックの観点からいうと最適だとおもふ。
なお、fffのチェックにstrposを使うのは、正規表現を使うより動作が速いため、
特にパターンパッチを行う必要がない特定文字列ならば、これが推奨される。
.$n.みたいな記述がありますがこの変数の前後の.(dot)は何を意味してるんでしょうか。 これまで学んだ何冊かの本でもいつも華麗にスルーされていて いまだにピンときません。。。 「.」で探しても文字列連結のときの.(dot)しか出てこないしで。 あほすぎな質問ですがお願いします
.$a = "foo"; みたいなこと? エラーなると思うが。
構文エラー
>>680 文字列連結の . の気がするんだが違うのか?
>>680 $n = 'bb';
$hoge = 'aa'.$n.'cc';
echo $hoge;
---> aabbcc
とかじゃなくて?
686 :
680 :2006/06/20(火) 16:49:55 ID:???
皆さんすみません。PHP独得の構文なのかと思って脈絡もなく質問してしまいました。 ↓は今手もとの書籍からの引用でそういう記述がある1行のみ部分です。 $strPathには取得したファイル名が入っています。その前後にdotが。 print("<li><a href='record.php?doc=".$strPath."'>".$strPath."</a></li>"); 1行だけでわかりますでしょうか?
単なる連結だ
どう見ても文字の連結じゃん^^
689 :
680 :2006/06/20(火) 16:54:44 ID:???
うわあ〜やばい・・・今初めて気づいたけどやっぱ普通に文字列連結ですね、これ。 やっぱアホ杉だです。すいませんm(_ _)m
>>686 >>685 のとおり
間を開けると良く判る。
print( "<li><a href='record.php?doc=" . $strPath . "'>" . $strPath . "</a></li>" );
691 :
680 :2006/06/20(火) 17:01:38 ID:???
皆さん、ありがとうございます。重複しました。
>>865 ですでに指摘されてたんですね。すみません。
ほんとうに・・・俺って奴は・・・orz
692 :
680 :2006/06/20(火) 17:05:04 ID:???
693 :
nobodyさん :2006/06/20(火) 17:17:50 ID:e7ISWcMQ
質問です htmlspecialcharsはHTML出力時とDB格納時のどちらにかけるのが正しいのですか?両方すかね?
694 :
nobodyさん :2006/06/20(火) 17:21:19 ID:84KpNS9w
気にするな。みんな適当だから。
>>693 HTML出力時
DB格納時はpg_convertとかその辺のを使う
>>693 DB格納前。
なぜならヴぁ、HTML出力時であれば、HTML出力するたびに htmlspe〜を通さないとならない。
DB格納前に行えば、その一回だけですむ。
>>693 タグを含めた文字を検索とかするわけじゃなければ、DBに入れる前に変換してもいいんじゃない。
でも、公式かどっかにhtmlspecialcharsはHTML出力する直前にやるべきだ。みたいな事が書いてあった気がするけど。
出力前までhtmlspecialcharsしないのは、メール/HTML等に対応する為だとか。
まぁ、でも別にどっちでもいいと思うよ。
698 :
nobodyさん :2006/06/20(火) 17:59:39 ID:e7ISWcMQ
>694,695,696 トンクスっす。 やっぱみんな適当なんですかね。適当を卒業したいのですが...。 XSSとかの本を読んでると、なんかキリ無い気がして萎えます。 プロの現場というか、それで喰ってる人たちはどの程度対策してるんでしょうか? >695 pg_convertは初めてみました。便利そうですね。 >696 へんなjavascriptが表示されて...とか言う具合にはならないですかね?
おいおい、基本的な部分が分かってないと見た。
701 :
nobodyさん :2006/06/20(火) 18:25:48 ID:e7ISWcMQ
>699 おっしゃるとおりです。完全に独学してるので怪しいです。 色々本も買ったのですが、結構著者によってまちまちというか、 htmlspesialcharsさえやっときゃ殆ど大丈夫みたいな書き方されてたり...。 フォーム入力から→DB登録→一覧表示みたいな流れで最低限これだけはやっとけみたいのありますか?
>>693 html出力時にするのが一般的
DBに投入前に行うと、そのデータを編集するときにエスケープする前の状態に戻してから
編集して、再度htmlspecialchars()を使う必要があるから
そんなことをするくらいなら、出力する前にやるほうが楽
703 :
nobodyさん :2006/06/20(火) 19:00:00 ID:mpIQquvJ
フォームで、未入力の項目がある場合、条件式はどうするのが良いでしょうか? 私が考えたのは: 1. if (isset ($_POST['name'])) { ...処理... } // POST がTRUE なら処理 2. if ($_POST['name'] === '') { ...処理...} // POST の値が空なら処理 皆さんなら?
>>703 2 か if (strcmp($_POST['name'], '') {
>>703 (strlen($_POST['name']) > 0) and (strlen($_POST['name']) <= $MaxNameLen)
>>703 if (!isset($_POST['name']) || $_POST['name'] == '') { ...処理... }
if (!$_POST['name']) {...処理...}
708 :
nobodyさん :2006/06/20(火) 21:09:57 ID:e7ISWcMQ
if(strlen($_POST['name']) == 0) {...処理...}
709 :
nobodyさん :2006/06/20(火) 21:32:39 ID:mpIQquvJ
>>707 それはまずい
数値の0がきたときと空が来たときの判別ができない
CSVというのはなんですか?
712 :
711 :2006/06/20(火) 22:32:37 ID:???
データをCSVで保存するとカンマ区切りでExcelでは読みやすくなるのですね。
Excelというのはなんですか?
くだらん釣りはスルーヨロ
718 :
676 :2006/06/20(火) 23:31:39 ID:???
タイミング悪くてだいぶレスが流れてしまったのですが、、 678さんが「できる」と回答していますが、どうやってやるんでしょうか? 自分ではどの関数を使ってどうやってやればいいかの ソースの組立の予測が付きません・・。 ヒントか何か教えていただければと思います。
かなりスレ違いと思いますがお願いします。 ページA→ページBと移動する際に パスを引き継ぎたいのですが getではパスがばれるので× postだとアンカーで引き継げない となるとsessionidがベストなのでしょうか?
720 :
nobodyさん :2006/06/20(火) 23:34:25 ID:Vcobe6Xy
>>718 一番手っ取り早いのは正規表現で取得してくる
>>719 セッションがベスト
セッションのことをsessionidと言ってるならもうちょっと勉強ヨロシク
724 :
723 :2006/06/21(水) 00:02:45 ID:???
独自ドメインのサーバーでテストしたところ、同じスクリプトで/で終わっていても正常に動作しました。 Xreaのサブドメインの方でテストすると出来ないっぽいです。 session.cookie_domainを設定して試してみましたが、やはいダメでした。 という事はサーバーの設定の関係でしょうか。
>>723-724 全てやりつくして自分ではどうにもならないって状況になってから質問しなおせ。
で、次質問するときは、phpinfoで出るセッション関連設定晒せ。
あと、例で用いるドメインはexample.comな。
>>723 おちつけ
なにが保存されないんだ
セッションとクッキーの違いは分かってるか?
クッキーの確認方法はなんだ?
ブラウザを閉じたら内容がクリアされるようなクッキーはファイルには保存されないのを知ってるな?
>>725 これ以上はもう無理そうです。
>>726 デフォルトで言うところのPHPSESSIDクッキーが保存されません。
クッキーはブラウザのクッキー表示機能で確認してます。
セッションの設定は session.bug_compat_42OffOff session.bug_compat_warnOnOn session.gc_probability11 session.hash_bits_per_character55 session.gc_divisor10001000 これ以外はデフォルトのようです。
>>725 なんでexample.comじゃなきゃいけねーの?
ブラウザ=Firefoxです。
731 :
729 :2006/06/21(水) 00:17:24 ID:???
ごめん。俺が悪かった
すみませんお願いします。 数値を全角から半角に直したいのですが $com1 = i18n_ja_jp_hantozen($_POST["com1".$i],"n"); と記述したところ、 Fatal error: Call to undefined function: i18n_ja_jp_hantozen() というエラーが返ってきました。 PHP4ではまだ対応されていないのでしょうか?
>>733 変更されていたのですね^^;
mb_convert_kana()で試したところも同じエラーになりました。
「mb」を使うには何か設定が必要なのでしょうか?
735 :
nobodyさん :2006/06/21(水) 00:42:18 ID:Ap/VWjSS
セッションに配列を入れて出力する仕組みを書いています。 以下のようなソースになるのですが、出力結果はArrayとなって うまくできません。おかしい箇所を訂正・指摘していただけないでしょうか? //送信ボタンが押された場合 if(isset($ok)){ //セッション『id』に値がある場合 if(isset($_SESSION["id"])){ array_push($_SESSION["id"],$id); for($i=0;$i<count($_SESSION["id"]);$i++){ print "$_SESSION[id][$i]"."<br>"; } //セッション『id』に値が無い場合 }else{ $_SESSION["id"] = array($id); print $_SESSION["id"]; } }
>>734 マルチバイト関数はインストール時に指定が必要
その鯖の環境では使えるのかい?
>>736 ローカルです。
extension=php_mbstring.dll
にしてあるのですが使えないのです。
>>735 最初にelseの方にいくよな?
そしてarrayを代入してそれをprintしてればarrayが表示されて当たり前だろ?
>>737 オマイが設定したと言っても本当に正しく設定してあるか分からんだろ?
phpinfo()を出したまい
>>738 出しました。
「mbstring」らしき文が見当たりません
740 :
735 :2006/06/21(水) 00:59:26 ID:???
>>738 それでは最初のelseではprintをせずに2回目の送信を行ったところ
forで出力してもやっぱり、Arrayっと表示されます。
※$idが最初は10次は20入れた場合
10
Array
>>739 phpinfoの
Configuration File (php.ini) Path
のphp.iniにあるextension=php_mbstring.dllの前に;が無いか
phpinfoの
extension_dirのディレクトリにphp_mbstring.dllファイルがあるか確認
>>739 じゃぁ使えないな
>>740 × $_SESSION[id]
○ $_SESSION['id']
>>741 extension=php_mbstring.dll
;はありません。
extension_dirは ./ ./ となっています
>>743 php_mbstring.dllのありかを探してそのディレクトリを
php.iniのextension_dirに指定してみれ
php.iniはphpinfoで表示された場所のファイルを修正
745 :
735 :2006/06/21(水) 01:09:38 ID:???
>>742 7行目のprintの箇所ですよね?
以下のようにしたのですが、状況は変わらずです・・。
print $_SESSION['id'][$i]."<br>";
>>745 742じゃないが、最後の行に
print_r($_SESSION);
で中身がどうなってるか確認してみれ
747 :
nobodyさん :2006/06/21(水) 01:15:53 ID:A9H5bJA/
extension_dirにphp_mbstring.dllの場所を設定したら解決しました。 ありがとうございます。 mb_convert_kana($_POST["com".$i],"n"); としたら、出力が「?P?P?P」になっちゃったよ;;
748 :
735 :2006/06/21(水) 01:16:01 ID:???
>>746 最初に10を、2回目に20をテキストボックスに入れて送信した結果です。
Array ( [id] => Array ( [0] => 10 [1] => Array ( [0] => 10 ) ) ) Array ( [id] => Array ( [0] => 10 [1] => Array ( [0] => 10 ) ) )
なんかかなり変な感じですね・・。しかも配列にArrayが入っているし・・。
全く原因が掴めません。。array_pushが悪い訳じゃないだろうし。。
>>747 mb_convert_kana($_POST["com".$i],"n","sjis");
でやってみれ
//送信ボタンが押された場合 if(isset($ok)){ //セッション『id』に値がある場合 if(isset($_SESSION["id"])){ array_push($_SESSION["id"],$id);// (3) for($i=0;$i<count($_SESSION["id"]);$i++){ print "$_SESSION["id"][$i]"."<br>"; // (4) } //セッション『id』に値が無い場合 }else{ $_SESSION["id"] = array($id); // (1) print $_SESSION["id"]; // (2) } } 最初はelse以降に逝くが、$idが10なら (1)の$_SESSION["id"]はarray(10)になる。 当然(2)はArrayと表示される。 次はセッションが既にあるから上段に行って、 $idが20なら(3)で$_SESSION["id"]はarray(10, 20)になる。 当然(4)では 10 20 と表示されるはずだ、と。 この20がArrayとなっているという事は(3)の$idがArrayになってるって事だから、 この処理以前の$idの取り方に問題があるような気がする。
753 :
735 :2006/06/21(水) 01:23:00 ID:???
>>750 ,752
どうも解説ありがとうございます。私もどこがおかしいのか全くわからなくて・・。
ちなみに、$idを受け取る送信ページは以下のソースです。普通のHTMLです。
<form action="session.php" method="post">
<input type="text" name="id">
<br>
<input type="submit" name="ok" value="送信">
</form>
>>753 print_r($_POST);
print_r($id);
で中身をみてみちゃどうかね。
多分 $id = $_POST["id"]; とすべきところを $id = array($_POST["id"]); とでもしている予感。
756 :
735 :2006/06/21(水) 01:33:54 ID:???
>>754 ■1回目の10を入れた場合
Array ( [id] => 10 [ok] => 送信 )
10
■2回目の20を入れた場合
10
Array
Array ( [id] => 20 [ok] => 送信 )
Array ( [0] => 10 [1] => Array ( [0] => 10 ) )
758 :
757 :2006/06/21(水) 01:39:01 ID:???
$_SERVER['PHP_SELF'];で解決しました。
>>754 $id = てな感じで$idを代入しているとこ書いてみてくり
そういえば、csvだと直リンで中身見られることはないの?
>>760 見ることもできるし、見られなくすることもできる
いろいろな設定次第
762 :
735 :2006/06/21(水) 01:47:32 ID:???
>>759 特に代入してないです。
>>735 で書いたとおりです。
別に$idはそのまま出力される(値が入る)かと思いますが。。
763 :
nobodyさん :2006/06/21(水) 02:01:38 ID:B7JejGVK
>>762 展開してるのね。了解。
■2回目の20を入れた場合
10
Array
Array ( [id] => 20 [ok] => 送信 )
Array ( [0] => 10 [1] => Array ( [0] => 10 ) )
↑ここで最後の$_SESSION[1]が配列になっているし、中身が10のまま
なんか、セッションがあろうがなかろうが関係ないんじゃないか?
$_SESSION["id"][] = $id;
for($i=0;$i<count($_SESSION["id"]);$i++){
print $_SESSION["id"][$i]."<br>";
}
764 :
735 :2006/06/21(水) 02:24:29 ID:???
>>763 ご説明ありがとうございます。
//セッション『id』がある場合
〜
} //最後から二つ目の}
をコメントアウトしました。そして763さんのコードを追加してみたのですが、
2回目の20を入れた処理で
10
Array
Array ( [id] => 20 [ok] => 送信 )
Array ( [0] => 10 [1] => Array ( [0] => 10 [1] => Array *RECURSION* ) )
このようになります。あまり変わりないような気がします・・。
765 :
735 :2006/06/21(水) 02:27:43 ID:???
テストをWindowsXPのローカル上で行っていまして、 PHPが5.1.4なのですが、あまり関係ないですよね・・。 session_start();もしているからセッションが有効になっているはずだし・・。
>>764 いや、735をいっそのことこうしたらどうかと。
//送信ボタンが押された場合
if(isset($ok)){
$_SESSION["id"][] = $id;
for($i=0;$i<count($_SESSION["id"]);$i++){
print $_SESSION["id"][$i]."<br>";
}
}
$_SESSION["id"]があるかどうかで
何か処理が変わるの?735だと単純に$idを追加すればいいだけのような気がするんだけど。
767 :
735 :2006/06/21(水) 02:49:46 ID:???
>>766 変わり無しです・・。766さんのコードに変更したのですが、
10
Array
というエラーが出ます。環境による問題ですかね。。
>>767 よっしゃ。とりあえずそのファイルどっかに上げてみてみないか?
もしくはそんなに長くないコードならここに貼り付けるか
769 :
735 :2006/06/21(水) 02:55:19 ID:???
【送信前・index.html】 <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=euc-jp"> <title>セッションテスト</title> </head> <body> <form action="session.php" method="post"> <input type="text" name="id"> <br> <input type="submit" name="ok" value="送信"> </form> </body> </html>
770 :
735 :2006/06/21(水) 02:57:18 ID:???
【送信後・session.php】 <?php session_start(); ?> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=euc-jp"> <title>セッション受け取り</title> </head> <body> <?php //送信ボタンが押された場合 if(isset($ok)){ $_SESSION["id"][] = $id; for($i=0;$i<count($_SESSION["id"]);$i++){ print $_SESSION["id"][$i]."<br>"; } } ?> <input type="button" onClick="history.back()" value="前に戻る"> </body> </html> 何度もお手数おかけします。。よろしくお願いします。
>>770 WInXP,Apache1.3,php5.0.3
結果
10
20
2回目の$_SESSIONの中身
Array
(
[id] => Array
(
[0] => 10
[1] => 20
)
)
ただし、register_globals Offのため
$id=$_POST["id"];
$ok=$_POST["ok"];
を追加した
うまくいってるけど?
あれ? $_SESSION["id"][] = $id; ~~~~~~~~~~~ こういう書き方ってありだっけ?
774 :
735 :2006/06/21(水) 03:23:08 ID:???
>>771 テストしていただいてありがとうございます。
うちはApache2.0.52とPHP5.1.4ですが、やはりなりません。
Linux+PHP4系のレンタルサーバにファイルをアップしても
同様に、
10
Array
という表示です。どうなっているのか・・。
775 :
735 :2006/06/21(水) 03:26:12 ID:???
わかりました!! $_SESSION["id"][] = $id; ↓ $_SESSION["id"][] = $_POST["id"]; とすることで、771さんと同じ結果になりました! ちょっと理由がわからないのですが、変数を$_POSTにしないといけないみたいですね。。 長い間、お付き合いいただき、ありがとうございます。 また勉強します。
>>774 恐らく$idがおかしそうなので、最初に
<?php
session_start();
$id=$_POST["id"];
$ok=$_POST["ok"];
?>
ってやてみたらどうかな
>>775 もう見て無いかもしれないが、よく考えたら
register_globalsがOnなため、$_POSTと$_SESSIONの両方の["id"]が
$idに展開されて変になっていたのではないかと
$_SESSION["id"]を$_SESSION["xid"]にするとうまくいくべ
779 :
nobodyさん :2006/06/21(水) 05:43:39 ID:r7tfflxK
既に何かデータが存在するファイルに上書きをする時は、w+でいいんですか?
w+でもいいけど既にあるんだったらwでいいんじゃない?
書くけど書いたのをファイルを開いたまま読みたいときw+ 書くだけw
782 :
nobodyさん :2006/06/21(水) 06:27:43 ID:r7tfflxK
wでやってるんですが、上書きできないんですよね 何故でしょう? こんな感じです。 if (is_writable($file)) { if (!$handle = fopen($file, 'w')) { print "Cannot open file ($file)"; exit; } for($i; $i <= $count-1; $i++){ $files_rows = preg_split("/,/", $files[$i]); $serial = $files_rows[0]; if($files_rows[16] == $_POST['original']){ $mod_file .= $add_data."\n"; } else{ $mod_file .= $files[$i]."\n"; } } flock($handle,LOCK_EX); if (!fwrite($handle, $mod_file)) { print "Cannot write to file ($file)"; exit; } fclose($handle); }
783 :
nobodyさん :2006/06/21(水) 06:45:56 ID:r7tfflxK
ポインタ指定してないのが原因でしょうか?
if (!$handle = fopen($file, 'w')) { for($i; $i <= $count-1; $i++){ ぱっと見 この2つの行になんだか違和感。 普通はこうかな if (!($handle = fopen($file, 'w'))) { for($i=0; $i < $count; $i++){
jpeg画像を表示ではなく、ダウンロードさせるにはどのようにすればよいのでしょうか?
>>782 段階を追って確認してみれば?
まず
if (is_writable($file)) {
はちゃんと通過できてるの?
あとぶっちゃけ
$handle = fopen($file, 'w');
の1行だけ実行したら中身空っぽの0バイトファイルになるはずだけどどうよ?
これで0バイトになったら上書き自体はできてるってことだ。
こういうのはシンプルなコードで順次確認が基本だよ。
>>785 画像データの標準出力への出力前にheader()を使って別のファイルタイプとして認識させる。
Parse error: parse error, unexpected '{', expecting '(' って何ですか?
構文解析エラー: '('が来ると思ってたのになんか'{'がキタこれナニこれ
phpではmethod=getのデータは$_GET['']で受け取るんかいな?
その通り。つかマニュアル嫁
配列の使い方の関係で、どうしても定義してないキーが出ちゃう場合があって noticeエラーが頻発しちゃうんだけど、これって無視しても特に問題ないよね? notice出ないように修正することも出来なくはないけど、 すごく無駄なコードが増えちゃうしスパゲティ化するから、 かえって修正しないほうがいい気がしてる。
noticeエラーは開発時のデバッグお助け機能くらいで考えとけばいいんじゃねーかと俺は考えてる。 全部潰せばより堅牢にはなると思うが、正直なとこ過剰としか思えん。 ちゃんとデバッグできない低脳な人は片っ端から潰した方がいいかもしれんけどな。
ポリシーをどうするかは本人の自由だと思うので好きに決めていいと思うけど、 > すごく無駄なコードが増えちゃうしスパゲティ化する ってのが気になるな。 そんなにあちこちで定義されていないキーを使うってのは、スクリプトの構造自体に問題があるんじゃないかなぁと。
>>795 親切といえば親切だし、過剰といえば過剰だよね。
>>796 あちこち・・・ってほどでもないんだけど、ある一つの処理に関する配列において、
要素の数が場合によって0〜9個まで、まちまちになるのよ。で、それをHTMLテンプレに埋め込んだ変数(配列)に
展開するときに、noticeが出ちゃう。
>>797 エラーの抑制方法はもちろん知ってるわけで・・・ 質問の意図が分からなかったんかな?
>>798 じゃぁ無視するとエラーログがとんでもないことになる。
どこまで保存するかの設定にもよるが。
>>798 >>796 も書いてるが、存在しないキーでエラーが出たり、
それを修正するためにスパゲティコードになる時点で根本的に設計がおかしい
まあ、好きにすれば?としか答えようがないな
配列を初期化すればいいんじゃないの。
任意の項目名で自由にHTMLテンプレ上に表示させたいとかゆー類っぽいな
素直に @をつけるか、 Noticeメッセージを表示しないように設定するかのどっちかだな。
804 :
nobodyさん :2006/06/21(水) 11:44:35 ID:NAuR8t7O
PRINTかECHOで複数行を簡潔に記述したいのですがどう書けばいいのでしょうか? 以下のようにしても動きませんでした。一行ずつ関数書くのは省きたいです。 PRINT" あかさたな テスト りんご ";
>>840 ?>
あかさたな
テスト
りんご
<?php
print <<< HTML りんご だいすき ぱいなっぷるも すき HTML;
sendmailを使いたい場合は何か設定をしなくてはいけないのでしょうか?
めいらーでーもん
>>804 ひょっとして
PRINT"
あかさたな<br>
テスト<br>
りんご<br>
";
>>804 echo "あかさたな<BR>テスト<BR>りんご";
print(" あかさたな\n テスト\n りんご\n "); こういうこと?
おまえら単純な質問に協力しるなんてなんていいやつらなんだ (つд`) おじさんは感動して涙がとまらないよ。
>>815 多分暇なだけだよ
インデントを使いたいなら、
echo "あいうえお"
."かきくけこ"
."さしすせそ"
."たちつてと";
818 :
nobodyさん :2006/06/21(水) 17:43:17 ID:r7tfflxK
1150672920,aaa,bbb,ccc 1150671220,ddd,eee,fff 1150672450,iii,jjj,kkk のファイルは、0行目がタイムスタンプになっています。 mktime関数を使っています。 このタイムスタンプで日付が現在に近い順に並べ替えしたいのですが どうすればいいですか。
>>818 先頭がタイムスタンプなら、そのまま行ごとソートでいいのでは?
>>818 それは3つのファイルの0行目の例か?
それとも行頭がタイムスタンプになっている1つのファイルの各行を並べ替えたいという事か?
何にせよ日付が先頭なら、配列に入れてソートすればいいだけじゃ?
ただし、日付が何年も前のものが入る可能性があるなら、単純にソートはだめだな。
すまん。何年も前のが入ってるとどうして単純なソートじゃ駄目なのか分からん。
>>824 >>823 ではないが、「何年も先のが」って言いたかったンじゃまいか?
命題が「現在に近い順」だから
ま、タイムスタンプって言ってるから未来の数値は入らないとは思うけど
スイッチ構文($AAA) ケース1 0; ユーザー関数A ケース2 1; ユーザー関数B ブレイク HTMLの表示 以上の文で質問です。 ブレイク文の処理で、SUBMITボタン押して$AAAの値を変え、ケース1の処理を動かしたいのですがうまくいかませんでした。 考えられるヒントをどうか与えてください。 はしおった書き方ですいません。
jpgやgif、pngについて アップロードしたいのですが どうすればできますか?
hoge.php?foo=bar を extract も $foo = $_GET['foo'] もやってないのに $foo = "bar" となってしまうのはどの設定でしょうか?
d register_globals でした。
なんか普通にプログラム組んでリャありえないような質問ばっかりだな。
スレタイ
不覚にもつっこみにワロタ
さらに
>>834 が初心者なら余計にワロエタ
下らん質問でスマンがAjax+PHP使って例えば、 図なんかに噴出し等で文字を入れることをするとします。 掲示板みたいな感じで誰でも挿入できるとします。 その文字をファイルベースでサーバにログや噴出しの位置情報を保存したとしたら、 部分更新がAjaxのメリットなはずだけど、結局更新は全体的に読み込みなおしですよね?
>>837 669じゃないが、
<input type="submit" name="a" value="OK_a">
<input type="submit" name="b" value="OK_b">
見たいにして、
if (isset($_POST['a']) {
// TO DO a
} else if (isset($_POST['b']) {
// TO DO b
}
で処理を分岐させこともできるし、javascript の onClick を
使う方法もある
>>838 状況がいまいち理解できないが、
ユーザーが入力した値をサーバに保存すして
次回更新時のその保存した値で画面を再生成ってこと?
>>838 質問の意味がいまいちイメージし難いんだが。。。
ファイルベースで噴出しの位置情報を保存っていうのはテキストにX=30,Y=50って言う値を
保存するって感じか?
で、噴出し内のコメントも保存しないといけないよな?
@最初にPHPファイルにアクセスした場合、まずPHPが背景画像を表示する。
Aそしてテキストを読んで位置情報を取得する
・・・書いててよく分からんなって北。
そもそも@の段階で表示しなくても言い訳だもんな。Aまで進んで位置情報から
それなりのCSSファイルを作ってやればいい訳だし。
別にajaxを使わなくても出来そうだな。まぁ、普通のJavaScriptは必要だろうけど
>>838 全体を読み込み直ししちゃったらAjaxの意味ないじゃん。
そこをJavaScript使って部分更新するからAjaxなんだろ?
>>841 そんな感じです。
つまり、そのあと噴出しをドラッグで動かせるようにした場合なんかだと、
結局ログファイル全体を配列かなんかで読み込み→PHPの関数で配列を編集→ファイル全体を書き込み→ファイル全体を再読み込み
とまあこんな感じになるんでしょうか。
>>842 JavaScriptだけでサーバのログは書き換えられるの?
部分的な読み込み直しはできると思うんだけど。
>>843 結局位置情報はどのタイミングで保存したいんだ?
保存ボタンを作って、ボタンを押して位置情報をDBなりテキストなりに
保存するっていうんならajaxは必要ないよ。
噴出しを動かす部分はただのJavaScriptで実現できる。
>>843 ふきだしを移動させるだけなら、別に再読み込みはいらないだろう
JAVAScriptを切ってるおれにはなんのことだかさっぱりわからん。完成させて時代を開いてくれ
>>845 リアルタイムでの更新をイメージしてた。ドラッグして動かして、移動が終わった時点で更新、と。
>>846 移動させただけなら、そうか、書き込み処理だけで再読み込みいらないか。ごめん。
>>844 動かすたびにサーバー側データも同期を取りたい→それには送信+ページ丸ごと再読み込みってこと?
もしもサーバーへのデータ送信がページ丸ごと再読み込みでしかできなかったら
検索エンジンで使ってるような非同期検索なAjaxは動いて無いじゃない。
バックグラウンドでサーバーに送信→更新→情報取得→ページ部分更新まで問題なくできるよ。それがAjax。
>>847 時代が開かれても君には一生無縁の話だから気にする必要はない。
_, -'"``'ー-、_ ||``'ー-、_ ``'ー-、_ || l ``'ー-、_ ``'ー-、_ ``'ー-、_ || .l ``'ー-、_ _, -'"l || l || l ``'ー-、||, -'"``'ー-、_ ||. l ``'ー-、_ ``'ー-、_ . || l ``'ー-、_ ``'ー|| l ( )ノ ``'ー(д゚;)_ -'" </13/ <| 1|ヾ'ー-、_ ノ >○ ``'ー-、_
852 :
nobodyさん :2006/06/22(木) 04:11:27 ID:4vrB1Nlw
<form action="" method="post" enctype="multipart/form-data"> <p>Pictures: <input type="file" name="pictures[]" /> <input type="file" name="pictures[]" /> <input type="file" name="pictures[]" /> <input type="submit" value="Send" /> </p> </form> <?php foreach ($_FILES["pictures"]["error"] as $key => $error) { if ($error == UPLOAD_ERR_OK) { $tmp_name = $_FILES["pictures"]["tmp_name"][$key]; $name = $_FILES["pictures"]["name"][$key]; move_uploaded_file($tmp_name, "data/$name"); } } ?> の15行目 move_uploaded_file関数が必ずエラーになってしまうのですが 何故でしょうか?
エラー文ぐらい書け
○○ as ■■ っていう文をよく見るんですけど、これどんな意味なんですか? 今見てるのは foreach(○○ as ■■ => △△) {〜〜〜;}という文です。 辞書にも載って無かったです。
855 :
nobodyさん :2006/06/22(木) 05:48:05 ID:4vrB1Nlw
>853 自己解決しました! 書き込み用のファイルをうpしてませんでした
辞書って何だよ。ちゃんとPHPのマニュアル嫁
>>854 そのマニュアル、古くない?
foreach文はPHP4以降で追加された構文だろ。
859 :
nobodyさん :2006/06/22(木) 06:04:20 ID:4vrB1Nlw
またまたエラーなのですが Warning: file(/data.cgi): failed to open stream: No such file or directory in /home/example/ と Warning: rsort() expects parameter 1 to be array, string given in /home/example/ の意味を教えていただけませんか?
>>859 2番目のエラーは1番目のエラーに伴うもの
863 :
859 :2006/06/22(木) 08:14:17 ID:4vrB1Nlw
ありがとうございました!
>>824 最近のタイムスタンプは、先頭が繰り上がって、1・・・・になっているが、
何年か前までは、一つ桁が少ない、9・・・・だったからだ。
行ごとそのままソートすると文字列比較になって、以前のタイムである,
9・・の方が昇順で後ろに来てしまう。
865 :
864 :2006/06/22(木) 09:16:34 ID:???
echo mktime(10, 46, 40, 9, 9, 2001); echo mktime(0, 0, 0, 1, 1, 2000); これをやってみるといい。
866 :
nobodyさん :2006/06/22(木) 09:40:11 ID:XjfBJY0m
複数の画像を重ね合わせて1枚の画像として出力したいのですがどうすればよいですか?
>>886 image_combin($image[0], $image[1], IMG_LANDSCAPE | IMG_PORTRATE);
868 :
nobodyさん :2006/06/22(木) 10:28:45 ID:XjfBJY0m
>>867 すみません、ググってもなかったのですが、何か参照サイトとかありませんかね
870 :
867 :2006/06/22(木) 11:04:22 ID:???
>>868 上記のような関数を自作すれば便利かなと。
>>869 扱うってただの文字列だろ?それを一体どうしたいんだ?
グーグル検索のURL貼ってるが、それも意味わからんし。
まさか、検索の一覧から意図を読み取れ、とか言うんじゃねーだろーな?
ま、単純に整数値に変換してシフトでもすれば?
>>872 何故俺に言うw
なんだその回答は!?って意味の「はあ?」だよ
>>869 PEAR内の関数を自分用のファイルにコピペでいいんじゃね
>>869 こんなのが欲しかったわけか?
function ipInNetwork($target_ip, $netmask) {
$target_ip = ip2long($target_ip);
list($network_ip, $network_bits) = explode('/', $netmask);
$network_ip = ip2long($network_ip);
$host_mask = bindec(str_repeat('1', 32 - $network_bits));
return ($target_ip ^ ($network_ip | $host_mask)) <= $host_mask;
}
CIDR表記とか知ってるなら、これくらいさくっと作ろうぜ・・・
文字コードをEUCで統一しているんですが、なぜか文字化けします METAでもEUCを指定しています この場合、文字化けする原因て何が考えられますか?
実際の文字エンコードは何なのよ?
SJISかJISです。
またはUTF-8です。
どっちだよw
884 :
nobodyさん :2006/06/22(木) 14:54:01 ID:oCUi25wn
PHPで例えば function test() っていうユーザー関数をkansuu.phpってファイルに書いてるとして index.phpでtest()関数をコールするにはどうしたら良いですか?
886 :
nobodyさん :2006/06/22(木) 15:17:01 ID:oCUi25wn
>>885 ありがとうございます。include()を呼び出すとfatalエラーが出ます。
include 'index.php';と記述しています。
index.phpのなかにもtest()があってkansuu.phpにもtest()と言う関数が記述されています。
その内容は全く違うのですが。kansuu.phpの中でindex.phpのtest()を呼び出すことはできますか?
面倒な質問してすみません。
エラーの内容は?
include 'index.php'; というのはなんかおかしい
こういうことか? index.phpの内容 <?php function test() { } ?> kansuu.phpの内容 <?php function test(){ } ?>
>>878 ShiftJISとかいろいろとメタタグで宣言してみれ。それで文字化けがないならApacheの設定とPHPの設定の問題。
891 :
nobodyさん :2006/06/22(木) 15:47:36 ID:oCUi25wn
index.phpの内容 <?php function test() {中略} ?> kansuu.phpの内容 <?php include 'index.php'; function test(){中略} $s=test(); //kansuu.php内の方 $p=test(); //index.php内の方 echo "<html><BODY>$s,$p</BODY></html>" ?> 見たいな感じ。
なるべく同じ関数名はつけないほうがいいとおもうが…
>>891 変数に置き換える手法いいね。でも変数に入れるなら、最初から関数名はどーでもよくなるわな。
894 :
nobodyさん :2006/06/22(木) 15:58:11 ID:oCUi25wn
違うファイルに関数名変えて同じの書けば良いことなのでしょうけど たまたま、index.phpに書いてるコードがそのまま使えそうだったので楽しよとしただけです。 関数名変えます。
普通は違う関数名を付けて万事解決なわけだが、 そこを敢えて同じ名前で区別する方法は無いかというのが質問の趣旨だよな。 OK、俺には分からんッ!
896 :
884 :2006/06/22(木) 16:00:16 ID:oCUi25wn
みなさまご協力ありがとうございました。
897 :
884 :2006/06/22(木) 16:02:03 ID:oCUi25wn
あと携帯サイトを作ってるのですがこのスレの携帯サイト版見たいなのってありますか? 一応検索しても出てこないので。スレ違いな質問ですみません。
>>897 聞いている意味がよく分からんが、このスレは普通に携帯からでも読めるぞ。
p2使えばスレ内検索とかもできる。
900 :
nobodyさん :2006/06/22(木) 16:17:57 ID:z1rfr09/
$logfilename=1.htm; $fp = fopen($logfilename, "w"); こういうソースがあるとして1.htmが上層フォルダの場合どうしたら良い? $logfilename=../1.htmにしたらダメだった。相対パスで指定したいんだけど。 お願いします。
$logfilename= "../1.htm";
$logfilename = "../1htm"; じゃ駄目なのかなぁ。
それとパーミッション[666]は当然やってるんだろうね。
904 :
nobodyさん :2006/06/22(木) 16:25:10 ID:z1rfr09/
ありがとうございました。 $logfile="../".PHP_NAME; で解決しました。
905 :
878 :2006/06/22(木) 16:27:31 ID:???
>>881-882 偽
全ファイル、エディッターでEUCに統一
METAも全ページ(HTMLページ)
<meta http-equiv="Content-Type" content="text/html; charset=euc-jp">
で統一しているんですがなぜかバグります
mbstring.http_output
mb_string がはいっているなら、 内部エンコードがEUC、outputがsjisになっている可能性が高い。 metaを書くなら sjisにするか、 どうしてもEUCでブラウザに表示させたいなら、 スクリプト先頭あたりで mb_http_output('EUC'); ob_start('mb_output_handler');
909 :
nobodyさん :2006/06/22(木) 17:16:10 ID:4vrB1Nlw
ソートがうまくいきません。 少し教えてくださいませんか。 <?php $file = "test_data.cgi"; $data = "110220327"; // 今までのデータがあるファイルを呼び出す $file = "test_data.cgi"; $files = file($file); $count = count($files); // 既にあるファイルを $old_files に格納 for($i = 0; $i <= $count; $i++){ $old_files .= $files[$i]; } // 現在のデータを足す $old_files .= $add_data."\n"; // そのままでソート $filename = "$file"; $somecontent = $old_files; $old_files = preg_split("/\n/",$old_files); ksort($old_files, SORT_NUMERIC); for($i = 0; $i <= $count; $i++){ print "old_files[$i] = <!---->$old_files[$i]<!----><br><br>"; } ?>
910 :
909 :2006/06/22(木) 17:19:14 ID:4vrB1Nlw
test_data.cgiの内容です 110220330,aaa,adoifja, 110220333,adf,agtargg, 110220335,hwr,adfgads, 110220313,gar,argvtta, 110220342,arg,drfgsrg, 110220329,jtr,fjhtsfg, 110220343,tfe,gthrlff,
>>909 ナニがしたいのかわからん
それとforループの回数が1回多い
$old_files .= $files[$i];は文字連結だがソートしたいなら$old_files[$i] = $files[$i];じゃないのか?
912 :
nobodyさん :2006/06/22(木) 17:45:56 ID:z1rfr09/
他のPHPファイルを実行させるってできる? index.php <? printf "テスト"; 更新.php //index.phpないでこのPHPファイルを実行させるみたいなの ?> 読込みではなくて実行ってのが可能なのかどうか? わかりにくい説明ですみません。
include | require
>>913 だからそれ(読み込み)じゃないって言ってるじゃん。
915 :
nobodyさん :2006/06/22(木) 18:06:38 ID:z1rfr09/
大量にユーザー関数を定義しておいて それをincludeしたりするのって実行スピードに置いてはどうなの?
>>914 a.phpからb.phpを実行する例。
遠慮無く1000回ほど試すといいぞ。
a.php:
<?php
require('b.php');
?>
b.php:
<?php
for ($i=1;$i<1000;$i++) {
print "このヴォケが";
}
?>
求めているのがこれでないとしたらget付きURLにLocationで飛ばす、かな。
>>915 何と比較して聞いているのかが理解不能だが、
用のないユーザ関数を大量に読み込ませたりすれば
そりゃ実行スピードは落ちるだろうね。
918 :
nobodyさん :2006/06/22(木) 18:19:43 ID:ylHLo5v5
strstr($mail,array("!","#","%","&","(",")","@",",","/")) この書き方ってできなかったっけ?
バイナリセーフって何ですか?
>>909 >ksort($old_files, SORT_NUMERIC);
使う関数が間違ってる
923 :
nobodyさん :2006/06/22(木) 18:36:09 ID:z1rfr09/
>>917 よく使いそうな関数をファイルにまとめるとして、
よく使うが使わない関数も当然読み込まれてしまうと思う。
それで実行速度が遅くなるならそのファイルから使う関数だけを読み込んだりしたい。
そんなやり方ありますか?
>>923 関数群をカテゴリ分けするしかない。
というか、そんなに遅くならない。
require や include を速くしたいなら 無料になった Zend Optimizer 3 を入れたら?
PHP5+Sqliteで勉強させてもらっています なぜかわからないのですがDB(ファイル)が存在しませんといわれてしまいます 実行している手順は /home/hotta/に移動し sqlite testでtestというDBを作成し テーブルを作成し、データを入れ ls -l /home/hotta/test でファイルの存在を確認した後 <?php define('DB', '/home/hotta/test'); if (!file_exists(DB)) { die(DB ." が見つかりません \n"); } ?> を実行してみると 必ず/home/hotta/testが見つかりませんといわれてしまいます ファイルはあるはずなのですが(パーミッションかと思い777にしてみたのですがだめでした) なぜかわかる方おられましたら教えていただけないでしょうか?
ディレクトリのパーミッションは? それとdefineせずにやってみたらどうなる? というかSQLiteはわからん
$this->get('hoge') -> この矢印みたいなヤツ意味がわからないです ググルにも -> はキーワードにならないし
今はPHP4なんですが、PHP5にしたほうがいいですかね?
>>912 echo '<iframe src="kousin.php" height=0 width=0></iframe>';
こういうことか?
>929 ありがとう! もやもやが吹っ切れた
>>927 ありがとうとございます ディレクトリのパーミッションが問題だったようです
/home オーナーroot 700→777
/hotta オーナーhotta 700→777
に変更したら
home/hotta/testが見つかりません といわれなくなりました
file_exists(DB)関数でファイルを読み出すときはapacheのユーザで検索してるのでしょうか?
>>933 違う。
httpdデーモンがPHPのスクリプトを読み込んで実行しているから
apacheユーザーになっているからであって、
file_exists() だけがapacheユーザーで動くわけではない
$_GETした$KEYWORDが全角かどうかをチェックしています。 正常に動いてるんですが、時々長さが一致せずエラーになります。 サーバの負荷?mbstringのバグ?と悩んでいます。 $data = stripslashes($keyword); if (strlen($data) != mb_strlen($data) * 2) { die("引数エラー!".strlen($data).":".mb_strlen($data) * 2); }
>>934 有難うございます
ということは
何かを参照する関数とかは
すべてhttpd.confに記載されているUser欄のユーザーによって実行されるので
パーミッションはUserにあわせる必要があるということですね
937 :
934 :2006/06/22(木) 21:48:19 ID:???
自己解決しました。
939 :
909 :2006/06/23(金) 00:40:32 ID:lPdqGX0Z
したい事を書いてませんでした。
各行の[0](先頭行)は、mktime関数によって取得したタイムスタンプとして
この先頭行をソートして時間が現在に近い順(数字が小さい順?)→つまり昇順に並べ替えたいのです
よろしくお願いします。
>>911 下の方のforループが余計なのでしょうか?
私にはなぜ余計なのかがよく分かりません 簡単でいいので教えていただけませんか?
>>922 どの関数に直せばよろしかったでしょうか?
natsort関数でしょうか?
それともsoat関数でしょうか?
soat関数で試したところ
old_files[0] =
old_files[1] =
old_files[2] = 110220313,gar,argvtta,
old_files[3] = 110220329,jtr,fjhtsfg,
old_files[4] = 110220330,aaa,adoifja,
old_files[5] = 110220333,adf,agtargg,
old_files[6] = 110220335,hwr,adfgads,
old_files[7] = 110220342,arg,drfgsrg,
となり、一部が消えてしまいます。
これは、何故なのでしょうか?
940 :
909 :2006/06/23(金) 00:43:09 ID:lPdqGX0Z
natsort関数でも同様に消えてしまう部分があります。 old_files[0] = 110220330,aaa,adoifja, old_files[1] = 110220333,adf,agtargg, old_files[2] = 110220335,hwr,adfgads, old_files[3] = 110220313,gar,argvtta, old_files[4] = 110220342,arg,drfgsrg, old_files[5] = 110220329,jtr,fjhtsfg, old_files[6] = 110220343,tfe,gthrlff, old_files[7] = 消える理由が分かりません。 少し手を貸していただけたら幸いです。 よろしくお願いします。
つかforeach使えよ
>>939 バグとか以前に作り方が意味不明すぎるんだけど、
なんでわざわざ配列を1行に連結した挙句にまた配列に分解してるの?
で、消える理由だけど、データに空行が入ってて空っぽのデータがあるだけ。
それがソートされた際に先頭に出てきたり末尾に出てきたりする。
また、実際にデータが消えているわけじゃなく、本当は8件でなく9件あるのに
頭8件しか表示してないせいで後ろがちょんぎれてるだけ。
最後の表示部分は
for($i = 0; $i <= $count; $i++){
print "old_files[$i] = <!---->$old_files[$i]<!----><br><br>";
}
となってて$countの数だけ表示してるけど、この$countって
$files = file($file);
$count = count($files);
この段階で取得しちゃってて、その後ろの
// 現在のデータを足す
$old_files .= $add_data."\n";
ってのを含んでいないから。
いやぁコーディングセンス抜群だわ。 頼むから俺の職場には来ないでね^^
>>912 passthru("/usr/local/bin/php index.php");
945 :
909 :2006/06/23(金) 01:21:39 ID:lPdqGX0Z
>>942 >なんでわざわざ配列を1行に連結した挙句にまた配列に分解してるの?
こんなことしなくても、ソート処理ができるんですか!
そこを教えてもらえませんかぁ>_<
お前、もうプログラミングやめた方がいいんじゃ・・・
947 :
909 :2006/06/23(金) 01:38:45 ID:lPdqGX0Z
自分で判りやすい画面になるように少し変えてみました。 見て欲しいです。一応正しく表示が出来てるようです! <?php $file = "test_data.cgi"; $add_data = "110220327,sdt,adafgafg,"; // 今までのデータがあるファイルを呼び出す $file = "test_data.cgi"; $files = file($file); $count = count($files); // 既にあるファイルを $old_files に格納 print "<h2>ソート前のファイルデータ</h2><hr>"; for($i = 0; $i < $count; $i++){ $old_files[$i] .= $files[$i]; print "old_files[$i] = $old_files[$i]<hr>"; } /*-----------------------------------------------------*/ // 中間線 print "<br><hr>中間線<hr><br>"; /*-----------------------------------------------------*/
>>946 まぁそういうなって
>>945 for($i = 0; $i <= $count; $i++){
これでforが何回まわる?最初がゼロからってのが味噌
$count=1の場合、0,1が実行される。多くないか?
正解はどこかに書いてあった気がするけどfor($i = 0; $i <$count; $i++){
参考にしてみ。タイムスタンプの桁数に注意
<?php
$file = "test.cgi";
$data = "110220327";
$files = file($file);
$files[] = $data."\n";
sort($files);
foreach ($files as $i => $v) print "files[".$i."] = ".$v;
?>
結果
files[0] = 110220313,gar,argvtta,
files[1] = 110220327
files[2] = 110220329,jtr,fjhtsfg,
files[3] = 110220330,aaa,adoifja,
files[4] = 110220333,adf,agtargg,
files[5] = 110220335,hwr,adfgads,
files[6] = 110220342,arg,drfgsrg,
files[7] = 110220343,tfe,gthrlff,
949 :
909 :2006/06/23(金) 01:40:44 ID:lPdqGX0Z
>>947 の続きです
// 現在のデータを足す
$old_files[$i+1] = $add_data."\n";
// そのままでソート
$filename = "$file";
$somecontent = $old_files;
print "<h2>ソート後のファイルデータ</h2><hr>";
//$old_files = preg_split("/\n/", $old_files);
array_multisort($old_files, SORT_ASC);
for($i = 0; $i <= $count; $i++){
print "old_files[$i] = $old_files[$i]<hr>";
}
?>
950 :
909 :2006/06/23(金) 01:48:50 ID:lPdqGX0Z
>>948 す、すごい
勉強になりました。
すごく簡潔に書かれていて、それでいてちょっと$vが可愛いですね//▽//
ありがとうございます!
5,6行で済むのに
なんでmultisortなんだw
たぶんプログラミングとか初めてなんだろう。暖かく見守ろうぜ。
954 :
909 :2006/06/23(金) 01:56:14 ID:lPdqGX0Z
950取ったので 新しいスレを立てようと思うのですが 私でも立てられるんですか? ちょっといって見て来ます。
あー。次スレはテンプレの再検討をするんじゃなかったっけ。 事情を分かってるやつがやった方がいくね?
957 :
909 :2006/06/23(金) 02:00:26 ID:lPdqGX0Z
新しいスレ作ました! 定型文?を書くのでもう少しお待ち下さい。
958 :
909 :2006/06/23(金) 02:02:00 ID:lPdqGX0Z
>>956 え;
もう作っちゃいました。
けど、
>>2 以降はまだ書いてません。
事情の分かる方にパスした方が良いですか?
959 :
nobodyさん :2006/06/23(金) 02:03:03 ID:8iUOatGT
テンプレ作る前に、質問の嵐でスレッドが埋まる予感。質問はforの永遠ループみたいな終わりのない処理だからな。
960 :
909 :2006/06/23(金) 02:04:25 ID:lPdqGX0Z
961 :
909 :2006/06/23(金) 02:05:27 ID:lPdqGX0Z
よく見たら、スレのアドレスの一番最後の部分って タイムスタンプじゃないですか?
phpってたまーにさぁ なんで実行結果がおかしいんだろ〜。 エラーも起きないし。一体全体どうして〜〜〜〜〜〜〜ってとき if文で$a=1 とかなってんの!!!wwww 比較は$a==1だっつうの!!=2つは他の言語やりまくってると たまーにやるよね、うん。
>>961 >よく見たら、スレのアドレスの一番最後の部分って
>タイムスタンプじゃないですか?
そうですね〜(^-^)
964 :
909 :2006/06/23(金) 02:36:35 ID:lPdqGX0Z
2 :nobodyさん :2006/06/23(金) 02:15:16 ID:??? 本 ス レ は も う 無 く な り ま し た って書き込まれてましたT_T
965 :
909 :2006/06/23(金) 02:43:16 ID:lPdqGX0Z
ちなみに、
>>948 さんの構文で、元のファイルに今ソートしたばっかりの
データを上書きするときって、どこでfopenするべきですか?
foreachの前でfopenとflockをして、{}の中にあるprintの部分を書き込みに変えるような方法ですか?
>>965 スレ立て乙でつ。
2の本スレはPHP質問スレのこと。くだ質と同じレベルだということで
くだ質に一本化したという経緯
968 :
909 :2006/06/23(金) 03:16:14 ID:lPdqGX0Z
>>966 、
>>967 初めてスレ立てしました!
緊張しました;
>>967 じゃぁ、イタズラじゃないってことですよね
よかったぁ。
新しいスレのテンプレとかは事情というものを知らないので
知ってある方にお任せしたいのですが、誰かいらっしゃいますか?
>>968 今やってくれてる人がいらっしゃいますよ(^o^)♪
IDにPerlが出たら神!PHPが出たらシメジ とか言われてますけど PHPってどうしてバカにされてるんですか? PHPが他の言語に劣っている部分を教えてください。
972 :
909 :2006/06/23(金) 05:09:38 ID:lPdqGX0Z
寝ちゃってました;
また明日も来たいです。よろしくおねがいします!
>>969 親切に教えてくれてありがとうございましたぁ
梅るか、それとも残り30弱を有効に使うか・・・それが問題だ
990辺りまでいったら埋めた方が質問者のためにもなるが それまではちゃんと使ってやるのが質問スレの流儀ってもんだ。
>>974 サンクスコ。
ファイルのアップロードの質問が出てたけど、ファイルを消す関数はあるん?
unlink
サーバローカルのファイルならunlinkで消せる クライアントローカルのファイルを消せるなら大問題だ
昔書いた自分のコード見て無駄な処理やってるなーと思うことがある
>>909 ほどではないが
979 :
nobodyさん :2006/06/23(金) 13:27:30 ID:CXSPEY04
phpの内部コードがEUCのサーバでUTF8のフォームスクリプトを動かしたいです。 直接php.iniにはさわれませんし、htaccessを使うと500エラーになります。 スクリプトに直接 mb_internal_encoding("utf-8"); mb_http_input("utf-8"); mb_http_output("utf-8"); などと書いたのですが、状況は変わりません。 ini_setというのも使ってみたのですが、ダメっぽいです。 どなたか解決方法をご存じないでしょうか? サーバはラピッドサイトというところです。 スクリプトをeucに変えるというのは無しの方向でお願いします。
エラーの内容は?
981 :
nobodyさん :2006/06/23(金) 14:09:21 ID:CXSPEY04
>980 レスありがとうございます。エラーはメッセージは何も出ないようです。 mb_internal_encoding("utf-8"); と書いて、 その後echo mb_intnal_enercoding("utf-8"); とすると、 UTF-8と出力されますが、文字は全て???????になります。 単純にtextのinputを一行かいて、submitしてecho $_POST['hoge'];で表示させてみたのですが、ラピッドサイトでは化けますが、ロリポでは化けません。 phpinfoを比較すると、ロリポップはhttp_inputとoutputがpassとなっています。 mbinternal_encodingはno valueです。(でもecho mb_internal_encodingするとEUCです) mbstring.encoding_trancelationというのだけ、ロリポはoff、ラピッドはonです。
サーバの方がUTF-8に対応してないのかもね ラピッドの人に聞いてみたら? mb_convert_encodingも失敗するようなら諦めるしか
983 :
nobodyさん :2006/06/23(金) 14:30:13 ID:CXSPEY04
>982 レスどうもです。 そうですね。サーバ自体が対応しないっていうこともあり得るとしたら、そうかもしれないです。 ラピッドのサポートにはさっきメールしました。 ありがとうございました。
984 :
979 :2006/06/23(金) 15:46:40 ID:CXSPEY04
やっちゃいました.......。ラピッドのhtdocsより上の階層にユーザーが変更出来るphp.iniがありました。スクリプトに書いたものはそれで上書きされてたぽいですorz。 板汚しスマソ。逝ってきます。
sessionをDBで管理する利点ってなんですか?
俺はDBを使ってるんだぞ。どうだ、高等だろ? と威張れる利点
なるほど。勉強してみよう
>>988 sessionidを持ちまわしでって事ですか?
>>985 webサーバを分散していて、それらのセッションを共有したい時
ネットワークファイルシステム等を使うより管理が楽で、安心感がある。
(NFSで問題が出るってわけでもないが)
みんなスクリプト書いてるときはな〜んも見ないで書いてんの? それとも仕様書しこしこ作ってから書き出すの? 規模にもよるだろうけど、webアプリぐらい頭ん中で粗方作って 勢いで書いちゃえーって人のが多そうな希ガス
俺の場合仕事とかの時は もちろん仕様書とかは書く それ以外の場合は覚書みたいなメモ作ってから作る 仕事以外の時でも簡単に書いておかないと どんどん仕様変更しちゃって完成できない俺orz
掲示板とかなら何も見ずに書く
簡単な画面仕様と入力仕様は書く、 もしくは書いてもらう
そりゃまあ掲示板くらいのものならねぇwww けどそんなんばっかじゃないしね さらに質問、どんなふうな仕様書を書いてんの 最近仕様書かくのとかもろもろイヤで辞めたい病
997 :
996 :2006/06/23(金) 19:52:40 ID:???
>>996 この関数はPHPでは(存在し)ないのでしょうか? ってコトでOK?
この関数はPHPではない、つまりC言語とかJAVAなのでしょうか? っていう風にもとれるから念のため。
ちなみに三角関数系の関数は一式揃ってるよ。
使い方はマニュアル参照。
\ / \ / / ̄ ̄ ヽ, / ', / _/\/\/\/|_ \ ノ//, {0} /¨`ヽ {0} ,ミヽ / \ / \ / く l ヽ._.ノ ', ゝ \ < バーカ! > / /⌒ リ `ー'′ ' ⌒\ \ / \ (  ̄ ̄⌒ ⌒ ̄ _)  ̄|/\/\/\/ ̄ ` ̄ ̄`ヽ /´ ̄ | | −−− ‐ ノ | / ノ −−−− / ∠_ −− | f\ ノ  ̄`丶. | | ヽ__ノー─-- 、_ ) − _ . | | / / | | ,' / / / ノ | ,' \ / / | / \ /_ノ / ,ノ 〈 \ ( 〈 ヽ.__ \ \ ヽ._> \__)
良かったら教えてください
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。