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

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

レス数が900を超えています。1000を超えると表示できなくなるよ。
0001nobodyさん2010/05/28(金) 16:33:44ID:???
質問者はまず>>1を良く読むこと(必須!)
過去スレ、関連スレ、FAQなどは>>2-10辺り
次スレは>>980が立てる。10分以内に立たない場合、宣言してから立てたい人が立てること。

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

◆質問用テンプレ
【OS名】CentOS
【PHPのバージョン】5.3
【連携ソフトウェア】MySQL ImageMagick
【質問内容】

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

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

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

【その他諸注意】
・SQL・正規表現・PEAR・テンプレート(Smarty等)・フレームワークは各該当スレへ
0831nobodyさん2010/07/05(月) 17:23:48ID:???
>>830
Undefined index: となってるから
$_POST["title"]と$_POST["body"]を空で送信(submit)してるでしょ
空で送信されたら未定義になる。
未定義なのにprintさせようとしてるからNoticeがでてる。

正しくはissetなどで確認してから・・・となるんだろうけど
この場合のNoticeは無視しちゃう所多いよ
0832nobodyさん2010/07/05(月) 17:39:17ID:???
>>830
http://www.php.net/manual/ja/language.types.boolean.php#language.types.boolean.casting

あとphpproの講座は使えないから他の本で勉強する事をお勧めする
0833nobodyさん2010/07/05(月) 17:41:56ID:qHUIRNCb
大角本がいいよ
0834nobodyさん2010/07/05(月) 17:48:04ID:???
ひろゆきオススメのあれか?w
0835nobodyさん2010/07/05(月) 18:26:03ID:E/YNQXWp
>>817
formで送られるデータって文字列として取得されることが保障されてるんだっけ?
それなら !== ""でよさそうだけど。

>>830
phpの内容がわからないのでどこが121行目かちょっとわからんとです。
0836nobodyさん2010/07/05(月) 21:22:59ID:???
>>831
最初のフォーム表示時じゃないの?
空で送信しても string(0) "" にならない?
0837nobodyさん2010/07/05(月) 21:59:14ID:???
入力欄が空なんじゃなくて、$_POST["title"]を送信してないって意味では
0838nobodyさん2010/07/05(月) 22:07:58ID:???
>>837
そのためのissetでしょう?
0839nobodyさん2010/07/05(月) 22:17:23ID:???
まだやってんのか。
所詮はただの配列なんだからちょこっとコード書いてみりゃ分かるだろ。
0840nobodyさん2010/07/05(月) 22:22:52ID:???
if( isset($_POST['title'][0]) )

これだけでおk、
0841nobodyさん2010/07/05(月) 22:23:16ID:???
誰も明確な回答を示さずにぐだぐだやってる感じがいいよね
0842nobodyさん2010/07/05(月) 22:37:01ID:???
その内、派閥的な論争が始まる
0843nobodyさん2010/07/05(月) 22:55:30ID:???
>>840
空送信し放題じゃん
!==か、分かりづらければisset && != とかでいい
この辺は好みだよね
0844nobodyさん2010/07/05(月) 22:59:24ID:???
>>843
> 空送信し放題じゃん
どこがw
0845nobodyさん2010/07/05(月) 23:26:29ID:???
それでおkってことは、フォームデータは文字列として取得することが
保障されているってことでいいのかしら。
ラジオボタンとかでvalue=1とかしてても勝手にint変換されたりしない、でおk?
0846nobodyさん2010/07/05(月) 23:34:50ID:???
リクエストパラメータは常に文字列ってマニュアルの何処かに書いてあったはずだからググれ
0847nobodyさん2010/07/05(月) 23:49:49ID:???
ありがとう!
0848nobodyさん2010/07/05(月) 23:54:24ID:???
>>840
[0]っていったいどういうこと?
0849nobodyさん2010/07/05(月) 23:56:22ID:???
もはやバッドノウハウ系な気が
0850nobodyさん2010/07/06(火) 00:49:38ID:???
PHPはフィールド名に[]が付いてたら配列に展開するので
文字列か配列かのどちらかになる可能性がある
コードゴルフならともかく初心者に>>840を教えてるのが居たら袋叩きにしていいぞ
0851nobodyさん2010/07/06(火) 01:07:54ID:???
コードが短ければ玄人ってわけじゃないんだし、
第三者が見てわかりやすい記述を心がけようぜ。
0852nobodyさん2010/07/06(火) 01:42:19ID:???
そんなに叩く程か?
Cのコードゴルフじゃあるまいし全然原型とどめてるじゃん。
0853nobodyさん2010/07/06(火) 02:24:13ID:???
>>852
application/x-www-form-urlencoded の title[0]=0 を受け入れるが意図した挙動じゃないだろ?
入力値を信用したコードの時点で使いものにならない
0854nobodyさん2010/07/06(火) 02:57:17ID:???
そもそも空文字列の時に[0]は\0だったりしないのかな。C的な発想で申し訳ないが。
0855nobodyさん2010/07/06(火) 08:57:03ID:???
>>835
name属性がない場合 null

name属性があって入力がない場合 ""

よって

if( isset($_POST['hogehoge'] ) && $_POST['hogehoge'] !== "")
{

}

じゃねーのかい!
0856nobodyさん2010/07/06(火) 10:38:17ID:???
こんな基本的なところで何騒いでいるんだ・・・
0857nobodyさん2010/07/06(火) 11:22:03ID:1Cm5WNj+
よくフレームワークやMVCのコードを書く時、URLが
http://(ドメイン)/(コントローラー)/(アクション)
という形になっているのを見かけます。

例)掲示板に投稿
http://hoge.com/bbs/entry

それで思ったのですが、アクション(メソッド)が指定されているURLに
直アクセスされた場合、どうするのでしょうか?
POSTのデータが送られてきたか否かで判断して、直アクセスの場合は
元のページにリダイレクトする、とかそう言う事をしているのでしょうか?
アクションを直接GETとしてURLに含めるのは、セキュリティ的に疑問です。
0858nobodyさん2010/07/06(火) 11:32:45ID:???
セキュリティ的にGETでだめならPOSTでもだめだろ。
0859nobodyさん2010/07/06(火) 11:39:40ID:???
そもそも、アドレス関係ない話じゃん。
08608572010/07/06(火) 12:07:00ID:1Cm5WNj+
>>858
GETだとフォームを介さなくてもアクセスできるから
POSTより緩いと思うんですよね

>>859
857に書いたようなURLがformのactionにしていされていたら
検索エンジンのクローラーに取得される可能性があります。
そうなると、セキュリティ的にまずいと思うんですよ。
0861nobodyさん2010/07/06(火) 12:18:29ID:???
セキュリティの問題でクローラーがどうのとか、そこが変なんだよ。
0862nobodyさん2010/07/06(火) 12:25:44ID:???
cakephpかなんかで適当にサンプル作って、ソース見ればいいよ。
あっさり解決するから。
08638572010/07/06(火) 13:34:39ID:???
わかりました。そうします。
0864nobodyさん2010/07/06(火) 13:51:27ID:???
>>860
せ…、セッ

いや、なんでもない。
0865nobodyさん2010/07/06(火) 21:14:40ID:???
セキュリティがまずいっていうか、クローラーやトレンドマイクロからスパム投稿される
0866nobodyさん2010/07/07(水) 00:12:26ID:???
キャプチャでもおいとけば?
0867nobodyさん2010/07/07(水) 00:32:00ID:???
置けばどうなるの?
0868nobodyさん2010/07/08(木) 08:59:00ID:Tsw8WKYJ
【PHPのバージョン】5.2 above
【質問内容】
PHP で文字列を組み上げるのに、Ruby でいうところの #{} 的な
インラインテンプレートみたいなのってないでしょうか?
sprintf と + で処理の実現自体は可能なんですが、なんかごちゃごちゃしてしまうので
もうちょっとエレガントな記法ってないのかなと思って質問する次第です。
よろしくお願いします。
0869nobodyさん2010/07/08(木) 09:53:28ID:???
つSmarty
08708682010/07/08(木) 10:05:54ID:???
あぁ、Smarty 使ってるプロジェクトならいちおそれありなのかなぁ。
ただ、それだけのために Smarty 組み込んだところで、余計可読性下げそうでちょっと勘弁。
ありがとうございました。
0871nobodyさん2010/07/08(木) 10:51:51ID:???
可読性が下がることはないと思うけどな。
まあ、自分でテンプレート処理書いちまえばいいんだと思うけど。
実際は "This is a {$pen}";ですむんじゃねーの?
08728682010/07/08(木) 11:04:41ID:???
m9(・∀・) ソレダ
単純に "{$var}" で展開されたのね・・・万事解決です、本当にありがとうございました。
ってかくと感謝してなさそうに見えて不思議ですが、ほんとに助かりました。ありがとう。
0873nobodyさん2010/07/08(木) 11:07:30ID:???
Rubyの#{}が何なのか分からなかったのはオレだけ
08748682010/07/08(木) 11:31:52ID:???
この手の記述って便利なんだけど、ググれないのが困るんですよね。
0875nobodyさん2010/07/08(木) 18:18:32ID:???
.htaccessの話なのですが、
アクセス規制用に以下の部分を別ファイルにしたいのです。

deny from 192.168.0.11
deny from 192.168.0.12
deny from 192.168.0.13
deny from 192.168.0.14

みたいな感じで。

httpd.confを触れるなら  include ファイルパス
で、できるのですが。。。。

.htaccessではできないんどえしょうか?
0876nobodyさん2010/07/08(木) 18:22:36ID:???
なぜここで聞く
0877nobodyさん2010/07/08(木) 18:28:08ID:???
>>876
apache スレ言ってきます。
0878nobodyさん2010/07/08(木) 22:38:14ID:lGIUgqyl
勉強中の初心者です。PHP+MYsqlで質問です。
DB名を、配列に取得して、プルダウンメニューで選択するようにしたいのですが
ボックスに表示する部分なのですが
mysql_list_dbsを使ってmysql_fetch_arrayでいけますか?
0879nobodyさん2010/07/09(金) 03:37:15ID:xzt7gYmY
同じくPHP + MYSQLについて。
ユーザー定義関数内でデータベースを扱う場合、
各関数内に

//MySQLに接続
$con=mysql_connect(DB_SERVER, DB_USER, DB_PASS);

//データベース選択
mysql_select_db(DB_NAME,$con);

として一々データベースに接続しているのですが、
パフォーマンスは悪くならないのでしょうか?
みなさんがどうしてるか知りたいのです。
もし一々接続しなくてもいける方法、
もっとパフォーマンスが良くなる方法などがあればご教授ください。
0880nobodyさん2010/07/09(金) 04:23:31ID:???
クラスにしてプロパティに入れておく
0881nobodyさん2010/07/09(金) 08:47:02ID:???
>>879
インターフェース作ればいいんじゃね?
0882nobodyさん2010/07/09(金) 17:23:12ID:7d5uHpFB
PHPにインターフェイスは実装されていません
0883nobodyさん2010/07/09(金) 17:29:30ID:???
てことはこれは幻覚か
http://php.net/manual/ja/language.oop5.interfaces.php
0884nobodyさん2010/07/09(金) 17:42:25ID:???
>>883
お前php.netハッキングしただろ
0885nobodyさん2010/07/09(金) 21:53:07ID:???
>>879
同じ引数で接続する場合は既存の接続を再利用してくれるが
USE `database` を毎回発行するのは無駄なので、
リソースをどこかにプールしておくべき

function get_connection() {
  static $c;
  if (!$c) {
    $c = mysql_connect(DB_SERVER, DB_USER, DB_PASS);
    mysql_select_db(DB_NAME,$con);
  }
  return $c;
}
0886名無しさん@そうだ選挙に行こう2010/07/10(土) 04:56:21ID:WdQ5SbfS
今まで問題なく動いていたシステムが鯖移転で一点不具合でてまして、にっちもさっちもな状態なので助言いただきたく思ってます。
外部へのコネクションが極端に時間がかかるのです。
普通のテキストを読み込むだけで10〜20秒程度要します。

厳密には関係ないかもですが、ネットワーク帯域自体は細いわけではなくサイトは瞬時に表示されます。
ただのこの外部へのコネクション時は非常に時間がかかるんです。

PearのHTTP_Clientを使って接続しているのですが、何か情ありませんでしょうか?
0887名無しさん@そうだ選挙に行こう2010/07/10(土) 04:58:08ID:WdQ5SbfS
忘れてました。
PHPは5.1,6です。
0888名無しさん@そうだ選挙に行こう2010/07/10(土) 05:37:00ID:4d57FSnB
<?php
$fruit = array("Apple" => "りんご", "Orange" => "みかん",
"Grape" => "ぶどう");

で例えばAppleの中にある文字が本当にりんごだった場合のみ
処理を続行するようなことってできますか?

もしAppleに「みかん」が入っていたら処理を中断するような感じにしたいんですけど
0889名無しさん@そうだ選挙に行こう2010/07/10(土) 06:07:03ID:WdQ5SbfS
>>888
if ($fruit['Apple'] === 'りんご') {
echo 'Appleはりんごだよー';
}
else {
echo '中断するよ';
}



887です。
原因はDNS周りにありそうです。汚しましてすいませんでした。
0890名無しさん@そうだ選挙に行こう2010/07/10(土) 12:37:46ID:2QvhDB/5
PHP掲示板で、携帯とJaneとPCに対応しているやつはありませんか。
0891名無しさん@そうだ選挙に行こう2010/07/10(土) 12:41:51ID:2QvhDB/5
このへんがよさげなんですが。PHPかJaneに対応していないんですが。

0ch PHP
http://script.s16.xrea.com/2ch/php/

Sch BBS
http://www.sanadake.info/sch/bbs/

0ch BBS
http://0ch.mine.nu/
0892名無しさん@そうだ選挙に行こう2010/07/10(土) 14:58:38ID:g8ZkkqTi
文字列の末尾に指定文字が含まれているか
調べるにはどうすればいいのでしょうか?

$text = 'testName';
$type = 'Name';
if (strstr($text, $type)) {
echo $text."に".$type ."は含まれています";
}

とするれば一応出来るのですが、「末尾が$typeである」
という条件を加えたいと思います。やり方を教えてください。
0893名無しさん@そうだ選挙に行こう2010/07/10(土) 15:01:24ID:2QvhDB/5
正規表現使っとけ。
PHP5とかからだと、文字列の後方検索に対応していたはずだけど。
多くで動くようにするなら、正規表現。
0894名無しさん@そうだ選挙に行こう2010/07/10(土) 15:10:36ID:g8ZkkqTi
ありがとうございます。自信ないけど、こんな感じですかね?
if(preg_match("/(.*)+" . $type . "$/", $text, $array)){
echo $text."に".$type ."は含まれています";
}
0895名無しさん@そうだ選挙に行こう2010/07/10(土) 15:15:33ID:2QvhDB/5
たぶんそんなかんじ。聞くより動作みたほうがいいでしょ。
0896名無しさん@そうだ選挙に行こう2010/07/10(土) 15:21:46ID:g8ZkkqTi
動作はするのですが、
もし別の条件で通ったり通らなかったり無いか自信が無くて・・・
とりあえずこれでいきます。
0897名無しさん@そうだ選挙に行こう2010/07/10(土) 16:01:10ID:???
こんなのでわざわざ正規表現使う必要ないだろ

if( substr( $text, 0-strlen($type)) === $type )
08987942010/07/10(土) 17:45:08ID:9rtjPRpZ
.= ってどういう意味ですか?
0899名無しさん@そうだ選挙に行こう2010/07/10(土) 17:57:03ID:???
$title = "baka";
$title .= "test";
echo $title; //bakatest
09007942010/07/10(土) 18:18:52ID:9rtjPRpZ
ありがとう!
0901名無しさん@そうだ選挙に行こう2010/07/10(土) 22:32:13ID:0jjmMoFC
「elseif」と「else if」、どっち使ってます?
ちなみにPHPのネストの上限ってあります?
後者が内部的にはネスト扱いとなるなら、関係あるのかなーと思って。
0902名無しさん@そうだ選挙に行こう2010/07/10(土) 23:11:38ID:o7F/R3R5
http://jp.php.net/manual/ja/control-structures.if.php
09039012010/07/10(土) 23:44:49ID:0jjmMoFC
>>902
なるほど〜。どうもです。
インタプリタ的には前者を使った方が優しいかな。
0904名無しさん@そうだ選挙に行こう2010/07/11(日) 01:19:52ID:C1oKqEx5
クラスが継承されているか否か調べる関数か、書き方があれば教えてください
0905名無しさん@そうだ選挙に行こう2010/07/11(日) 02:54:27ID:???
>>904
function is_class_extended($base) {
    foreach (get_declared_classes() as $super) {
        $class = new ReflectionClass($super);
        while ($class = $class->getParentClass()) {
            if ($class->getName() === $base) {
                return true;
            }
        }
    }
    return false;
}

echo 'Exception is extended? ', var_export(is_class_extended('Exception'), true), PHP_EOL;
echo 'stdClass is extended? ', var_export(is_class_extended('stdClass'), true), PHP_EOL;
0906名無しさん@そうだ選挙に行こう2010/07/11(日) 08:03:31ID:???
get_parent_class($object)
0907名無しさん@そうだ選挙に行こう2010/07/11(日) 11:42:10ID:???
class_parents($object)
0908名無しさん@そうだ選挙に行こう2010/07/11(日) 19:08:50ID:aH0kYx2z
preg_match関数で正規表現の複数指定方法について
./aaaディレクトリ内においてディレクトリ名がbbb/
さらにその中のccc/までたどり着くには
どういった記述がよろしいのでしょうか
0909nobodyさん2010/07/12(月) 10:44:20ID:???
日本語でおk
0910nobodyさん2010/07/12(月) 18:29:55ID:2AUEyQFR
>>908
正規表現で投票してみればいいさ。
0911nobodyさん2010/07/12(月) 20:09:58ID:o18xCfm1
$sql = "SELECT user.name,category.name FROM user INNER JOIN category USING(category_id)";
$res = mysql_query($sql);
while($row = mysql_fetch_array($res,MYSQL_ASSOC)){
print_r($row);
}

とした時に、nameの部分が被って配列に代入されます。
フィールド名の指定を「user.name, category.name AS cate_name」
みたいに変更する以外に方法はないのでしょうか?
0912nobodyさん2010/07/12(月) 21:29:01ID:r9oprwp5
mysqli、PDOとか使えば、SQLの段階でasるのは避けられるけど、
結局bind時に変数名がかぶるから、asった方がいいと思う。
0913nobodyさん2010/07/12(月) 23:47:53ID:???
>904
その実装方法は地雷だからやめた方がいい。
「必要なメソッドが実装されているか」だけを検査すべき。
スマートにやるならインターフェイスを使う。
0914nobodyさん2010/07/13(火) 00:07:54ID:???
>>913
クラスが継承されている場合、継承元のクラスファイルを読み込む
ような仕様がしたいのですが、これも地雷になるのでしょうか?
0915nobodyさん2010/07/13(火) 00:43:05ID:lEQMzPMj
タマゴが先かニワトリが先か。
0916nobodyさん2010/07/13(火) 00:51:22ID:???
ニワトリが居ないと卵は産まれない
0917nobodyさん2010/07/13(火) 01:02:31ID:???
>914
その場合、親クラスは絶対に読み込み済。だから読み込む必要などない。
やってみればすぐ分かるが、親クラスを読み込んでいない状態で子クラスは宣言できない。
0918nobodyさん2010/07/13(火) 03:29:43ID:???
>>914
クラス定義する時にどのファイルが必要か判ってるんだから
require_once 基底クラス を書いておくか、
オートローディングを使うのが定石
http://www.php.net/manual/ja/language.oop5.autoload.php

A.php
<?php class A {}

B.php
<?php require_once 'A.php'; class B extends A {}

C.php
<?php require_once 'B.php'; new B();
09199042010/07/13(火) 10:11:14ID:???
>>917-918
ありがとうございます。

クラス定義する時、どのファイルが必要か分からないようにしたいんです。
フレームワークのように、柔軟に作ったファイルが読み込まれるような。

オートローディングは使っているのですが、
PHP4に対応させたい場合、どうすればいいかと思いまして。

また、918さんのような書き方もB.phpを各ファイルに書かなくてはいけず、
効率が悪いと思います。
0920nobodyさん2010/07/13(火) 10:26:14ID:???
なんだ、オートローディングのPHP4対応の話と言えば早かったのかもね。
俺も困ったけど諦めた。
0921nobodyさん2010/07/13(火) 10:32:32ID:???
もういいかげんPHP4は捨てていいと思うが
09229042010/07/13(火) 10:35:05ID:???
万が一の事を考えて想定していたのですが、
捨てても良いかもしれませんね。Class定義しにくいし。
オートローディングでやります。
0923nobodyさん2010/07/13(火) 20:22:51ID:hmJ3ix43

xmlのエレメントを再帰的に配列に格納したいと思いますが、
いい案が思い浮かびません。

xsltのように捜索してテンプレートにマッチさせ値を取得できればと思っています。
xpathを利用しても、取り出す要素は固定化してるし。

何かいい方法はありませんでしょうか。

0924nobodyさん2010/07/13(火) 20:51:27ID:???
require_once 'Zend/Json.php';
$array = Zend_Json::decode(Zend_Json::fromXml($xml, true));
09259232010/07/13(火) 22:32:14ID:hmJ3ix43
924さん、ありがとうございます。

さすがに、アトリビュートも取得する方法はありませんでしょうか。
一応取得時にarrayでなく、objectも指定しましたがアトリビュートの値までは
取得できませんでした。

0926nobodyさん2010/07/13(火) 23:06:59ID:???
false にすれば @attributes でのるはずです。
09279232010/07/14(水) 01:19:28ID:ez+KFUZ4
すごい!載りました。

ありがとうございました。

0928nobodyさん2010/07/14(水) 08:49:45ID:XR87xhsM
<?php
$b = '$a = "あいうえお"';

var_dump($b);

$aの変数を取り出す方法はありませんでしょうか。

0929nobodyさん2010/07/14(水) 09:37:02ID:???
何がしたいかよくわからんが、

$b = $a.'="あいうえお"';

じゃないのか?
シングルクォートで囲んでたら文字列扱いされるよ
0930nobodyさん2010/07/14(水) 09:42:02ID:XR87xhsM
文字列をphpのコードとして実行させたいです。

レス数が900を超えています。1000を超えると表示できなくなるよ。