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

【PHP】下らねぇ質問はID出して書き込みやがれ 84

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2009/04/27(月) 21:39:11ID:???
質問者はまず>>1を良く読むこと(必須!)
過去スレ、関連スレ、FAQなどは>>2-10辺り
次スレは>>980が立てる。10分以内に立たない場合、宣言してから立てたい人が立てること。

◆前スレ
【PHP】下らねぇ質問はID出して書き込みやがれ 83
http://pc11.2ch.net/test/read.cgi/php/1238958898/

◆質問用テンプレ
【OS名】vine linux
【PHPのバージョン】php5.26
【連携ソフトウェア】mysql
【質問内容】

◆質問する時の注意
・ スレを上げて自分のIDを表示させること。(メール欄に何も記述しない。専ブラのsageチェックを外す)
・ 己の行った操作、変更などを詳しく明記すること。
・ エラーメッセージはそのまま表記すること。「エラーが出ます」だけでは回答不可。
・ 質問者として、態度をわきまえること。
・ 事前に関連リンクの公式マニュアル、リファレンス本くらいはちゃんと目を通しておくこと。
(PHPで最良の教本はこの公式マニュアル。市販の書籍は嘘が多いので鵜呑みにしない。)

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

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

【その他諸注意】
・SQL・正規表現・PEAR・テンプレート(Smarty等)・フレームワークは各該当スレへ
0002nobodyさん2009/04/27(月) 21:40:06ID:???
■過去ログ
【PHP】下らねぇ質問はID出して書き込みやがれ 82
http://pc11.2ch.net/test/read.cgi/php/1236532468/
【PHP】下らねぇ質問はID出して書き込みやがれ 81
http://pc11.2ch.net/test/read.cgi/php/1234958956/
【PHP】下らねぇ質問はID出して書き込みやがれ 80
http://pc11.2ch.net/test/read.cgi/php/1233479457/
【PHP】下らねぇ質問はID出して書き込みやがれ 79
http://pc11.2ch.net/test/read.cgi/php/1231850905/
【PHP】下らねぇ質問はID出して書き込みやがれ 78
http://pc11.2ch.net/test/read.cgi/php/1230026935/
【PHP】下らねぇ質問はID出して書き込みやがれ 77
http://pc11.2ch.net/test/read.cgi/php/1228667259/
【PHP】下らねぇ質問はID出して書き込みやがれ 76
http://pc11.2ch.net/test/read.cgi/php/1226517332/
【PHP】下らねぇ質問はID出して書き込みやがれ 75
http://pc11.2ch.net/test/read.cgi/php/1224168721/
【PHP】下らねぇ質問はID出して書き込みやがれ 74
http://pc11.2ch.net/test/read.cgi/php/1221909788/
【PHP】下らねぇ質問はここに書き込みやがれ 73
http://pc11.2ch.net/test/read.cgi/php/1220440493/
【PHP】下らねぇ質問はここに書き込みやがれ 72
http://pc11.2ch.net/test/read.cgi/php/1218855685/
0003nobodyさん2009/04/27(月) 21:41:27ID:???
関連リンク
■本家マニュアル   http://www.php.net/manual/ja/
■日本PHPユーザ会 http://www.php.gr.jp/
■PEARマニュアル  http://pear.php.net/manual/ja/
■メーリングリスト   http://ns1.php.gr.jp/mailman/listinfo/
■ZFマニュアル    http://framework.zend.com/manual/ja/
■Smartyマニュアル  http://www.smarty.net/manual/ja/

(以下英語)
■Zend本家      http://www.zend.com/
■Zend Framework  http://framework.zend.com/
■php | architect   http://www.phparch.com/
■Smarty       http://www.smarty.net
■Smartyマニュアル http://smarty.php.net/manual/en/
■PECL本家(英語) http://pecl.php.net/
0004nobodyさん2009/04/27(月) 21:43:26ID:???
【簡易FAQ】
1.文字コードは何を使えばいいの?
 →1.UTF-8 2.EUC-JP のどちらか。迷うようなやつはShift_JISは使っちゃダメ。
2. このスレに書き込むときに自分のサイト名を晒したくない
 → http://example.com/が例文などのために予約されている。hogehoge.comは使っちゃダメ。
3. ブラウザに何も表示されないんだけど・・・
 → Apacheの設定を見直せ。ファイルの拡張子は何にしてて、その拡張子でPHPを呼ぶようになっているか?
4. 記号の意味がわからないけどググりようがない
 → 「@」 エラー表示を抑制、「->」 オブジェクトのメンバにアクセス、「::」 静的なメソッド呼び出し、
  「==」は暗黙の型変換をしてゆるい比較、「===」は型情報も含めた厳密な比較
5. echo "$arr['hoge']['fuga']"; と書いたらエラーになった
 → {おっぱい括弧}でくくって"{$arr['hoge']['fuga']}"にする
6. 一定時間ごとに自動的に何かしたいんだけど
 → cronかタスクスケジューラを使え。
7.extractって危険なの?
 →変数上書き&初期化忘れなどで危険。楽だからという理由だけで安易に使わない。
8. include/requireに「〜.php?a=b&c=d」のようなパラメータをつけたい
 → URL呼び出しなら可能だけど、普通のファイル呼び出しではできません
9.include/requireでURLを指定しても何も起きない
 → .phpの拡張子のファイルをURLで呼び出すと、1度PHPプログラムとして実行された結果になる。
0005nobodyさん2009/04/27(月) 21:44:07ID:???
10. そもそもインストールの時点でうまくいかない
 → 確認すべきはPHPのconfigureの引数、php.iniの内容と置き場所、
  Webサーバの設定(Apacheならhttpd.conf)、起動&再起動あたり
11. SQLの質問はどこで?
 → データベース板に誘導されるのが嫌ならPHPにうまく関連させて質問する
12. 文字列のなかに、英字のみとか数字のみとか記号が入っちゃいやんとかはどうしたらいいの?
 → ctype_〜()が手軽。複雑なパターンはpreg_〜()あたりで正規表現を使う。
13. $a1, $a2, $a3 ... のような変数名をうまく扱いたい
 → 可変変数で実現できるけど、むしろ配列を使って$a[1], $a[2], $a[3]等とするのがベター
14. echoとprintってどう違うの?
 → よく議論される話題であるが基本的に両者とも同じ。 以下ちょっとした議論。
  http://www.faqts.com/knowledge_base/view.phtml/aid/1/fid/40
15. クッキーの情報をユーザから隠したい
 → セッション使え。ただしクッキーとセッションは仕組みが違うから同じように扱うな
16. strip_tags()で削除しないタグを複数指定したい
 → strip_tags($html, '<a><p><font>'); // htmlspecialchars()も検討すべし
17. CSVやTSVのファイルをスマートに扱いたい
 → まずはfgetcsv()。ただし日本語を含むと正常に動作しない場合があるので注意だ。
18. 値渡しと参照渡し(「&」を使う)のパフォーマンスの違い
 → C言語じゃないので、パフォーマンス目的で使いわけたらダメ。参照渡しにすると逆に遅くなったりする
  参照渡しは引数に戻り値を設定したり引数を関数内で変更するなど、正しい目的に使うこと
19. ファイル入出力関数(fopen等)でリモートファイル(http://〜とか)を扱う際の限界
 → fsockopen()でソケット通信 or PEARのHTTP系 or CURLで解決
  必要ならHTTPをはじめとする各種プロトコル(どんなデータを送受信するか)はRFCなどで調べる
20. PHPからPOSTリクエストしたい
 →19.を参照
21. 画像処理一般 or GDの限界
 → ImageMagick(PECLのやつ or シェルから実行)
22. 画像・音・動画はファイルで保存?DBに保存?
 → 好きにしてください
0006nobodyさん2009/04/27(月) 21:47:13ID:???
姉妹スレ。IDをどーしても出したくない人はこちら。

【PHP】ID出さなくても質問OKなスレ【初心者歓迎】
http://pc11.2ch.net/test/read.cgi/php/1233590976/
0007nobodyさん2009/04/27(月) 21:58:17ID:???
http://pc11.2ch.net/test/read.cgi/php/1238958898/1000
さんくす!
0008nobodyさん2009/04/27(月) 22:11:17ID:ngOdqG7u
$a = (ほにゃら) ? false : true;
if文だと思うんですがマニュアルでこのことについて書かれている箇所に誘導してもらえないでしょうか
00099782009/04/27(月) 22:18:38ID:skcV1wh3
お礼が遅くなってすいません。ありがとうございました
0010nobodyさん2009/04/27(月) 22:22:21ID:???
>>8
三項演算子
ttp://php.benscom.com/manual/ja/language.operators.comparison.php
0011nobodyさん2009/04/27(月) 22:36:38ID:ngOdqG7u
>>10
ありがとうございます。
マニュアルの例のように結果によって同じ変数に別な値を入れるときは
if分よりこの書き方の方がすっきりしますね。
使い分けてみることにします。
0012nobodyさん2009/04/28(火) 00:04:52ID:hPvdrkqO
"kcaptcha"と呼ばれる画像認証ソフトを使おうと思い同梱されていた例題ファイルを見てみたところ

<?php
session_start();
?>
<form action="" method="post">
<p>Enter text shown below:</p>
<p><img src="index.php/?<?php echo session_name()?>=<?php echo session_id()?>"></p>
<p><input type="text" name="keystring"></p>
<p><input type="submit" value="Check"></p>
</form>
<?php
if(count($_POST)>0){
if(isset($_SESSION['captcha_keystring']) && $_SESSION['captcha_keystring'] == $_POST['keystring']){
echo "Correct";
}else{
echo "Wrong";
}
}
unset($_SESSION['captcha_keystring']);
?>

一番最後に unset($_SESSION['captcha_keystring']); とセッション変数をアンセットしてありました。
ページの先頭には session_start(); が宣言されているのでページのリロード時には必ずセッションは
初期化されるわけですが、それでもあえて最後にセッションをアンセットしなければならない理由はなんでしょうか?
0013nobodyさん2009/04/28(火) 00:12:44ID:???
>>12
>ページの先頭には session_start(); が宣言されているので
>ページのリロード時には必ずセッションは初期化されるわけですが

まずここの解釈が間違ってる。session_startのリファレンスをよく読んでごらん。
0014nobodyさん2009/04/28(火) 10:54:03ID:???
毎度初期化されて茶セッションの意味ないじゃん
0015nobodyさん2009/04/28(火) 14:28:24ID:PkQXIDSH
【PHPのバージョン】php5.26  【連携ソフトウェア】Apache
入力されたマルチバイト文字列(SJIS)を、配列ではなく、予め用意した変数に、
一文字ずつ分割して格納したく思っています。例えば、
$koe = "ありがとう";
なら、
$ichi ="あ";  $ni ="り";  $san ="が";
$yon ="と";  $go ="う";  $roku ="";  $nana ="";
という風に変換する関数を設定したいのです。 具体的に、どういう処理をすればよいのでしょうか?
どうかご助力、お願いいたします。
0016nobodyさん2009/04/28(火) 14:33:27ID:???
foreachかforでまわしながら連想配列で代入してからextract($array)
SJISはちょっとイヤンな感じだからUTFにしたら?
0017nobodyさん2009/04/28(火) 15:22:47ID:???
utf8ならlist($ichi, ...) = preg_split("//u", ..)みたいな感じでおkと思われる
0018nobodyさん2009/04/28(火) 15:25:45ID:???
つmb_split
0019nobodyさん2009/04/28(火) 15:28:01ID:???
// mb_substrとか使えなかったっけ?

$array = array("ichi", "ni", "san", "shi", "go");
$string = "ありがとう";

$count = 0;
foreach ($array as $key => $value) {
$array[$key] = mb_substr($string, $i, 1, "Shift_JIS");
++$count;
}
0020192009/04/28(火) 15:31:09ID:???
ごめん間違えた
$array[$key] = mb_substr($string, $i, 1, "Shift_JIS");
これは
${$key} = mb_substr($string, $i, 1, "Shift_JIS");
にしてくれ
0021nobodyさん2009/04/28(火) 15:39:37ID:???
まだ訂正すべき点があるようだが
0022192009/04/28(火) 15:40:57ID:???
うん、もう気づいたけどめんどくさいからいいや
0023nobodyさん2009/04/28(火) 16:53:54ID:7p1vmHWL
昨日質問したのですが、最後の方で流されたので、
再度質問させていただきます。

CSSファイルの特定のスタイルを取得したいと思います。

$css = 'a:link{background-color:#ffffff;color:#003399;}';
preg_match('/a:link{.*?color:#(.*?);/is',$css,$style);

とし、「color:#003399」の「003399」だけ取得したいのですが、
background-colorの方を取得してしまいます。
どういう正規表現を書けばいいのでしょうか?コードの指摘をお願いします。
0024122009/04/28(火) 20:19:52ID:hPvdrkqO
>>13-14
2回目以降のsession_start()はセッション変数の取り込みに奔走するんですね。
それでしたらわざわざ最後にunsetでセッション変数を破棄しなくても、
再度session_start()が実行されれば最新の$_SESSION['captcha_keystring']が
読み込まれて特に問題なく動作するような気がするんですが・・・
0025nobodyさん2009/04/28(火) 20:38:49ID:???
>>23
条件がよくわからんがa:linkに指定されたcolor値で#000000の形式のみを取得ってこと?

/a:link[^\}]*[^\-]color\s*:\s*#(\w{6})/is
0026nobodyさん2009/04/28(火) 20:50:55ID:???
>>24
お前は何を言ってるんだ
0027232009/04/28(火) 22:10:29ID:7p1vmHWL
>>25
こういう書き方するんですね。勉強になりました。ありがとうございました。
0028nobodyさん2009/04/28(火) 22:20:22ID:???
>>24
とりあえず例題で動かしてから、自分でunset外して動作を見てごらん。
ソース眺めて悩むよりそっちの方が早いよ。
0029122009/04/28(火) 23:31:23ID:hPvdrkqO
>>28
↓のようにコメントアウトして実行してみました
//unset($_SESSION['captcha_keystring']);

結果は・・・、なぜか、というか予想通り何の問題もなく正常に動作しました。

やはり最後のセッション変数のunsetは不要だったんでしょうか。
あるいは古いブラウザでの互換性を重視しておまじない的に書いたんでしょうか。
0030nobodyさん2009/04/28(火) 23:51:01ID:???
>>29
そこで「なぜか」で止まっちゃダメだ。
$_SESSION['captcha_keystring']には、どの時点でどんな値が入っていたのか追ってみよう。
0031122009/04/29(水) 03:02:23ID:I34g5E5l
>>30
$_SESSION['captcha_keystring']にはアンセットされる直前までは
現在表示されてるものよりひとつ前のCaptchaの数字が格納されていました。

ただアンセットしてもしなくても次にsession_start()されるときに次のCaptchaの数字が
上書きされるようです。

う〜む・・・、なぜわざわざアンセットしているんでしょう( ´・ω・)・・・
0032nobodyさん2009/04/29(水) 03:41:14ID:???
複数回実行するときのためにアンセットしてんじゃないの?
0033nobodyさん2009/04/29(水) 05:05:58ID:???
顔文字とか真面目に質問する気あんの?
0034nobodyさん2009/04/29(水) 05:39:51ID:???
認証に使うライブラリなら、一度認証に使用したらさっさと廃棄しないと危険だからじゃないの。
0035nobodyさん2009/04/29(水) 05:46:01ID:???
つーかそもそもCaptchaって何かわかってんだろうか
0036nobodyさん2009/04/29(水) 06:00:07ID:???
>>31
>次にsession_start()されるときに次のCaptchaの数字が上書きされるようです。

違う。$_SESSION['captcha_keystring']をセットしてるのは誰かよーく調べてみなさい。
0037nobodyさん2009/04/29(水) 06:20:53ID:???
提示されたコードばかり見てて全体のフロー、つまり裏でKeystringが発行されてるとこが見えてないんじゃないかな
unset() はキーを発行する処理に対応してるから、そっちの実装を見ないと処理の流れは分からない

新規/リロードなら再発行、ポストなら検証までスルーって実装にすれば unset() いらなくなるかな
0038nobodyさん2009/04/29(水) 06:30:11ID:???
これ、「表示されているアルファベットを入力してください」とか、いうヤツでしょ。たぶん。
unsetしなかったら、同じキーで何度でも使えちゃうじゃん。
アカウント取り放題とか、メール出し放題とか。

キー値はサーバ側に保存しなきゃならんのだし、unsetまたはそれと同等な処理しなくて
良いパターンってないと思うけど。
0039nobodyさん2009/04/29(水) 06:43:06ID:???
バリデーションに成功すればキーは破棄出来るわけだから同じキーが2度以上使われる可能性は排除できるよ

発行と検証の2フェーズあって、検証中でなければ前回の残りがあったとしてもそれを破棄して再発行すればいいわけ
検証中で無いことは empty($_POST["key..]) && !isset($_SESSION['key..]) で判別可能

unset() をクライアントスクリプト側に任せているのは、例えば3回まではトライ可能、といった
キーを無効にするタイミングを選択できるようにしたいとかそういうことじゃないかと予想
0040nobodyさん2009/04/29(水) 06:45:38ID:???
うっぷす!
× empty($_POST["key..]) && !isset($_SESSION['key..])
○ empty($_POST["key..])
再発行条件が empty($_POST["key..]) && isset($_SESSION['key..]) かなw
0041nobodyさん2009/04/29(水) 06:53:22ID:???
シンプルで不足分はユーザが書く小さなライブラリ > 柔軟なAPIがありクライアントのコード量が少なく高機能で汎用性が高く大きなライブラリ
0042nobodyさん2009/04/29(水) 07:00:53ID:???
>>38
いや、機械と人間の識別に使うもの。
これだけだと、人間ならアカウント取り放題、メールし放題、コメントし放題だよ。
後半はその通り。
0043nobodyさん2009/04/29(水) 07:07:51ID:???
>>42
多分、この認証ライブラリの動作を完全に勘違いしてると思う。
自分はもう面倒なんで、これ以上言わんが。
0044nobodyさん2009/04/29(水) 07:37:23ID:sqsMUdXV
Prepared statementって扱うの難しいですね・・・
オブジェクト指向とかさっぱりだし
ぶっちゃけ mysql_real_escape_stringで十分と思ってたら
えらい目に会いますか?
■ このスレッドは過去ログ倉庫に格納されています