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

【PHP】下らねぇ質問はここに書き込みやがれpart18

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2006/03/15(水) 19:18:21ID:yiOrS10N
PHPに関するくだらねぇ質問用スレです。
ここなら本スレで回答のないお前の下らない質問に回答があるかも知れません。

まず読め【PHP マニュアル】
http://www.php.net/manual/ja/

本スレ【PHP】質問スレッドpart33【php】
http://pc8.2ch.net/test/read.cgi/php/1140027592/

前スレ【PHP】下らねぇ質問はここに書き込みやがれpart17
http://pc8.2ch.net/test/read.cgi/php/1140786348/

過去スレは>>2-3あたり
0653nobodyさん2006/03/30(木) 16:39:19ID:???
つttp://www.vector.co.jp/vpack/filearea/win/util/text/conv/index.html
0654nobodyさん2006/03/30(木) 16:44:28ID:???
>>652
それこそphpでディレクトリさらって全て置換させろよw
0655nobodyさん2006/03/30(木) 16:54:04ID:???
>>652
> ファイル数が多いので、便利なフリーの置換(grep)ソフトなどありましたら宜しくおながいします
sed
0656nobodyさん2006/03/30(木) 17:12:35ID:???
>明確な理由はありますでしょうか?

文字数が少ない
0657nobodyさん2006/03/30(木) 17:43:57ID:???
>>652
>この2つの関数では(1)のほうが推奨になったと思いますが、
特にそういうこともなかったと思うけど?
mysql_db*がmysql_db_*になったのは名称統一性のため。

>予めデータベース指定してサーバにクエリを送信することで、実行速度面がいいとか
やってることは、データベースを切り替え(共通)た後、クエリーを送信(共通)してるだけなので
他の単体機能の関数を組みせた場合と速度面で劇的な違いはない。

>ソフトなどありましたら
自分の開発環境(OS等)に合った別板スレにて。
0658nobodyさん2006/03/30(木) 19:07:12ID:hmhd9dG6
助けて〜
アパッチ入れたのはいいけどポートの設定ができません。80ではな8080にしたいのですけど教えてください。
0659nobodyさん2006/03/30(木) 19:14:38ID:???
>>658
httpd.conf => [Listen] & [ServerName]
判ったら、スレ違いだからカエレ!
0660nobodyさん2006/03/30(木) 19:17:59ID:???
>>658
氏ね〜
0661nobodyさん2006/03/30(木) 19:30:10ID:hmhd9dG6
>>659
ありがとう。
>>658
師にます。
0662nobodyさん2006/03/31(金) 04:46:38ID:???
PHPの組み込まれた標準関数には
is_alpha()やis_digit()のような文字・文字列の英数かどうかをシェックスる関数はないのでしょうか?
0663nobodyさん2006/03/31(金) 04:58:50ID:???
>>662
ctype_alpha ctype_digit
0664nobodyさん2006/03/31(金) 05:37:58ID:???
$str=" str";//全角スペースだけど半角ね。
$len1=strlen($str);
$str=trim($str);
$len2=strlen($str);
ってすると、$len1と$len2の長さが同じになってしまいます。
単純に確保されたバイトサイズを返してるのかと思い。
$str2=trim($str);
unset($str);
$str=$str2;
unset($str2);
$len2=strlen($str);
ってやって、領域を確保しなおしても同じ結果です。
どうにかして空白スペース文きちんと減るようにしたいのですが・・・。
0665nobodyさん2006/03/31(金) 05:57:36ID:???
$str=" str";
$len1=strlen($str);
print "<br>$len1";
$str=trim($str);
$len2=strlen($str);
print "<br>$len2";

何の問題も無く
4
3
って出るんだけど?

実は提示してるコードだけじゃない?
06666642006/03/31(金) 06:01:26ID:???
すみません・・・。勘違いでした・・・。
その上の部分のコードが悪さしてました。
スレ汚しスマソ・・・
0667nobodyさん2006/03/31(金) 06:03:41ID:???
そうか、素直だから許してやる
0668nobodyさんNGNG
ファイルのアップロードについてなんですが、
register_globalsをオフにしたら「$_FILES〜」に値が代入されなくなりました。
register_globalsがオンなら動作するんですが、オフのままではアップロードは不可能なんでしょうか?
PHPのバージョンは4.23です。
0669nobodyさん2006/03/31(金) 08:00:28ID:???
>>657
マニュアル読め
mysql_db_query
この関数は廃止予定です。使用しないでください。かわりに mysql_select_db() あるいは mysql_query() を使用してください。
0670nobodyさん2006/03/31(金) 08:18:37ID:???
>>668
そんな話は聞いたことがない
お前のスクリプトのバグ
0671nobodyさん2006/03/31(金) 08:47:54ID:???
>>634
ファイルを生成せずにってどうやるの?
0672nobodyさん2006/03/31(金) 09:41:19ID:???
>>671
hogehoge.html.phpに出力されるhtmlタグが
<img src="hogeimage.php">
になってればokでは
0673nobodyさん2006/03/31(金) 10:50:46ID:???
ややこしいんですけど
$array=array("a","b","c");等の配列があり
この配列の前2つの値が"a"と"b"ならtrueを返すにはどうしたらよいでしょうか?
array("a","c","e")は偽 array("a","b","d")は真
0674nobodyさん2006/03/31(金) 10:59:42ID:???
reset($a);
return list($k,$v) = each($a) && $v='a' && list($k,$v) = $each($b) && $v='b';
0675nobodyさん2006/03/31(金) 11:35:31ID:???
>>674
ありがとうございました。
0676nobodyさん2006/03/31(金) 12:54:04ID:???
>>662
is_numeric()
0677nobodyさん2006/03/31(金) 13:37:51ID:3Hv4iuAG
質問です。
PHPで、サーバ上にあるファイルを操作するプログラムを書いているのですが、
その際ファイルそれぞれにユニークなIDを取得したく考えています。

例えば「test.jpg」というファイルがあれば、"test.jpg101250byte2005/03/04"あたりでMD5を取るという手もありますが、
更新日やファイル名が変更されても同じファイルからは同じIDを取りたいのですが、
何かいい方法はないでしょうか?

環境はLinux上のPHP4.4.1です。よろしくお願いします。
0678nobodyさん2006/03/31(金) 13:54:21ID:???
>>677
具のハッシュを取るんじゃだめなの?
0679nobodyさん2006/03/31(金) 14:12:31ID:???
>>677
md5_file("./test.jpg")
0680nobodyさん2006/03/31(金) 15:27:56ID:???
おまいら join() と implode() どっち派?
俺は昔 Perl やってたんで join() なんだが
0681nobodyさん2006/03/31(金) 15:30:50ID:???
>>680
join()
0682nobodyさん2006/03/31(金) 15:32:32ID:???
>>680
implode()
0683nobodyさん2006/03/31(金) 15:51:51ID:???
explodeもよく使うからそれに対応してimplodeの方
joinだとsplitだよね
joinの方がタイプ数は少ないんだけどね
0684nobodyさん2006/03/31(金) 17:31:44ID:???
>>683
分かってて言ってるんだと思うけど、 split() と explode() は同じようで違うじゃん。
正規表現を使用しないなら explode() のほうが高速
0685nobodyさん2006/03/31(金) 17:50:26ID:???
そういやsplitとpreg_splitで単純な正規表現を使った場合ではどっちが速いんだろ。
$arr = split(" *, *", $str);
程度でもpreg_splitの方が速かったりするのか?
0686nobodyさん2006/03/31(金) 17:59:27ID:???
(" *. *")<ぅぅぅ
0687nobodyさん2006/03/31(金) 19:50:42ID:???
いいだしっぺの法則
0688nobodyさん2006/03/31(金) 19:55:41ID:???
きめぇwww
0689nobodyさん2006/03/31(金) 21:57:55ID:???
すごい初歩的な質問ですが
SQLインジェクションというのを気にして
mysql_real_escape_stringで入力値をエスケープしようと
mojaviのfilterで単純に

foreach($param as $key => $val)
{
$param[$key] = htmlspecialchars($param[$key]);
$param[$key] = mysql_real_escape_string($param[$key]);
}

という処理を入力値全部が通るようにして安心してたのですが
改行のあるデータ(掲示板記事など)では改行コードが
\r\nという文字列になってしまいます。
だからエスケープなんだといわれればそれまでなんですが
上の処理に改行コードだけは通すように書けますか?
よろしくお願いします。
0690nobodyさん2006/03/31(金) 22:08:34ID:???
書けますか?と問われれば、
書けますよ、と答える。

そもそもhtmlspecialcharsを通しておきながら、\r\nを残す意味は?
0691nobodyさん2006/03/31(金) 22:30:36ID:???
>>689
あらかじめ改行を自分で決めたマジックキャラに置換しておくか、
表示する時に戻せばいいだけじゃね?
0692nobodyさん2006/03/31(金) 23:03:20ID:???
>>690
すいません、どういうふうに書きますか?
教えてください。

>そもそもhtmlspecialcharsを通しておきながら、\r\nを残す意味は?

htmlspecialcharsはhtmlタグをエスケープするだけじゃないですか?
mysql_real_escape_stringを通して\r\nを残す意味は
mysqlに収めるデータは他のシステムでも使えるように(web以外)
素の状態で収めておきたいからです。

>>691
表示はsmartyでやっています。
表示部はテンプレートで{$data.ddetail|nl2br}というように
nl2br修飾子を使って表示しています。
できれば表示部はこのままで行いたいと考えていますので
データベース入力前に素の形で突っ込めるような方向で考えてるわけです。

要は今までSQLインジェクションを気にしてなかったものに
mysql_real_escape_stringを採用した改造を行っていて
なるべく労力を減らそうとしています。
06936892006/03/31(金) 23:06:56ID:???
試しに
$param[$key] = ereg_replace("\\r\\n", "\r\n", $param[$key]);
とか書いて戻そうとしましたが何の反応もありませんでした。
0694nobodyさん2006/03/32(土) 00:42:56ID:???
3/32
0695nobodyさん2006/03/32(土) 02:12:58ID:???
どうやっても新年度に突入したくないみたいだなw
0696nobodyさん2006/03/32(土) 02:37:49ID:???
エイプリルフールは中止ですか
0697nobodyさん2006/03/32(土) 07:16:06ID:???
FFTを行いたいのですが、ライブラリか何かありませんか?
0698nobodyさん2006/03/32(土) 07:20:56ID:???
あ、なるほど、エイプリルフールだから
わざと「3/32」にしてるのね。
2chのバグかと思った。
0699nobodyさん2006/03/32(土) 07:31:10ID:???
>>698
こういうバグはわざとじゃなきゃ出せないと思う
0700nobodyさん2006/03/32(土) 07:42:21ID:???
速報Headlineは4/1だったりしてるし、わざとやってるね。
http://headline.2ch.net/bbynews/

http://www.2ch.net/
にも説明あるし
0701nobodyさん2006/03/32(土) 09:46:13ID:???
つか、わざわざ口に出して確認しないと、
この程度のネタの確証もてないレベルのヤツは2chくんなよ。
0702nobodyさん2006/03/32(土) 10:11:27ID:???
エイプリルフールだから>>701みたいな発言も納得出来るな
0703nobodyさん2006/03/32(土) 14:04:29ID:???
スレ違いしねよ
0704nobodyさん2006/03/32(土) 15:20:28ID:yVRxItMU
ファイルの行数を取得する方法は何かありますでしょうか?
0705nobodyさん2006/03/32(土) 15:27:40ID:???
$linenum = count(file($FILENAME));
07066892006/03/32(土) 15:32:38ID:???
ereg_replaceじゃなくstr_replaceなら思うようにいけました。
アドバイスいただいた方ありがとうございました。

$param[$key] = ereg_replace("\\r\\n", "\r\n", $param[$key]);
             ↓
$param[$key] = str_replace("\\r\\n", "\r\n", $param[$key]);
0707nobodyさん2006/03/32(土) 16:32:51ID:???
Win限定スクリプト?
誰も突っ込まないね。
0708nobodyさん2006/03/32(土) 16:41:00ID:???
ファイルの指定する文字が含まれた行を取得する方法はありますかね…。
0709nobodyさん2006/03/32(土) 16:51:36ID:???
ファイルのは抜きですすいません。
0710nobodyさん2006/03/32(土) 18:11:42ID:???
関係ないけど、PHPのロゴが犬になってて一瞬不正アクセスされた思ってめちゃ焦ったよ
0711nobodyさん2006/03/32(土) 23:07:17ID:???
>>710
毎年お馴染み
0712nobodyさん2006/03/32(土) 23:43:46ID:???
掲示板作って、ログはファイルに書き込んでたんだけど、
最新の書き込み以外全部消えちまった。
ファイルロックもちゃんとしてたつもりなんだけど、
できてなかったって子とかな?それか他に考えられる原因ってある?
wで開いてたんだけど。
下らん質問でゴメン。
0713nobodyさん2006/03/32(土) 23:53:29ID:???
>>712
読み込み、書き込み、ファイルロック関係のソースを全部晒してみろ。
0714nobodyさん2006/03/32(土) 23:59:55ID:???
DBを使えば解決
07157122006/04/02(日) 00:07:25ID:???
//書き込み
flock($fp,2);
foreach($lis as $li) fputs($fp, $li);
flock($fp,LOCK_UN);
fclose($fp);

読み込みはfile()使って二次元配列に入れて
ページ処理入れつつfor文で繰り返し表示してます。

>>714
実は今までDBでしかやったことなくて今回ファイルで初めて作ってみました。
DBでもちゃんとしないと壊れちゃうことあるんじゃないの?
0716nobodyさん2006/04/02(日) 00:23:15ID:???
>>712>>715
wで開いたってことは、それまでの書き込み+新規書き込みの両方を
まとめてファイルにwriteしてたんだろ?
それで最新以外は消えちゃった、って言うんなら書き込みじゃなく
元ファイルの読み込みに失敗してるんだよ。
07177122006/04/02(日) 00:27:44ID:???
>>716
>wで開いたってことは、それまでの書き込み+新規書き込みの両方を
>まとめてファイルにwriteしてたんだろ?
そうです。説明不足でスミマセン。
なるほど。その線で調べてみます。
でも何度テストしてみても再現できないんだよなぁ・・・。
ありがとう。
0718nobodyさん2006/04/02(日) 00:35:08ID:???
>>715
$fp2ってどっから出てきたんだ。しかも第二引数なしのflockって…???
とりあえず、読み込みと書き込みの部分をfopenのとこから全部見せなきゃ
これで原因分かるやつは神がかってると思うぞ

DBでは普通に作れば壊れないが、下手な作り方すれば壊れるものが作れるかもな。
07197122006/04/02(日) 00:40:55ID:???
>>718
$fp2じゃなくって$fp,2だよ。コンマ入ってる。
2はLOCK_EXと同意。

今ログもう一度確認したら最終書き込みの人の
$_SERVER["REMOTE_ADDR"]で取得したはずのIPアドレスがない・・・。
何か関係あるんでしょうか。
0720nobodyさん2006/04/02(日) 01:47:28ID:???
そんな断片情報で分かってたまるか
0721nobodyさん2006/04/02(日) 01:54:05ID:???
単に処理の途中で変数消しちゃってるだけじゃないのか
0722nobodyさん2006/04/02(日) 01:55:06ID:???
まぁ、DB使ってて「ちゃんとやらないと」データ壊すような人だし。
0723nobodyさん2006/04/02(日) 02:34:52ID:???
phpとmysqlでちょっとしたシステムを頼まれたんだけど、最悪DBの中身が漏れて困る様なものではない&外からの悪意のある操作でDBが消えても困らない、ってもんだったら、入力値のチェックって不要?
表からは数百件程度の商品を検索とソート。
裏側からは画像とデータ登録の管理画面(登録、削除、修正、一覧)って構成なんだけど。
仕事ではないんで勉強をかねてやってみるんだけど、自分の技術じゃそこまで手に負えない。
お金をもらってその対策までするなら、最初からなんかあっても困らない作りにしておくのも悪くないかなとおもって。

もし入力値に対しての対策をするとしたら$_POSTと$_GETでのありえる(許せる)値をスクリプトの頭でチェックしてNGならエラーにしちゃうって処理でOK?
0724nobodyさん2006/04/02(日) 02:40:33ID:???
入力データをSQLに入れるときに全部mysql_escape_string()しとくだけで最低限は十分。
0725nobodyさん2006/04/02(日) 03:13:05ID:???
>>719
PHPのバージョンが4とか言うなよ
0726nobodyさん2006/04/02(日) 09:54:30ID:???
>>723
最低限、SQLインジェクション、クロスサイトスクリプティングの
対策はしたほうがいいような。
0727nobodyさん2006/04/02(日) 13:03:49ID:???
test.txtに

バナナ
りんご
みかん

が入っていたとして、これを$fruit[]に代入していきたいのですが、
どのようにすればいいのでしょうか?fopenでtest.txtを開いても
一行ずつ配列にいれる方法がわかりません。。
0728nobodyさん2006/04/02(日) 13:39:10ID:???
PHPのリファレンス本読めばサンプルコードが沢山書いてあるのに
0729nobodyさん2006/04/02(日) 13:54:46ID:???
>>727
あのね、これで一撃なんですよ。
$fruit = file(〜);
0730nobodyさん2006/04/02(日) 14:24:51ID:???
$a=123456789123456789123456789;
echo $a*$a;

みたいな事をすると
1.52415787807E+052などと省略(?)されて困っています
とりあえずphp.iniのそれっぽい値(precision = 12)を変更してみたのですが
17桁目辺りから00000000000000000000となってしまい、正しい値が得られません
へるぷみー
0731nobodyさん2006/04/02(日) 14:48:41ID:???
>>730
整数の扱える範囲(たいていのプラットフォームでは32ビット)を超えたものは浮動小数点数として扱われる。
そんな馬鹿でかい整数で演算する必要があるなら多倍長整数演算をサポートするライブラリ(bcmathやpearのMath_Integer)を使う。
0732nobodyさん2006/04/02(日) 15:31:55ID:???
>>723
そういう最低限のところは癖にしとかんと、他で墓穴ほるぞ
0733nobodyさん2006/04/02(日) 15:47:17ID:???
どこまでが最低限なんだか…
0734nobodyさん2006/04/02(日) 17:19:56ID:???
回答者が最低限だと思ったらじゃないかな。
0735nobodyさん2006/04/02(日) 17:24:15ID:???
>>731
ありがとう!サム!
0736nobodyさん2006/04/02(日) 18:47:09ID:???
$sql = "INSERT INTO TABLENAME (NUM, NAME) ";
$sql .= "VALUES ($rec['num'], '$rec['name']')";
の'$rec['name']'(文字列)をどのように書けばいいでしょうか。
上記だと通らないし、'{$rec['name']}'だと'が引っかかります。
'{$rec[name]}'もparse errorです。
DBはFirebirdで文字列は'でくくる固定のようです。
0737nobodyさん2006/04/02(日) 18:52:59ID:???
>>736
'$rec[name]'
または
'{$rec['name']}'

何でわざわざ都合の悪い組み合わせでだけ試そうとするのかその神経が理解できない。
0738nobodyさん2006/04/02(日) 18:55:10ID:???
$rec[num], $rec[name]
じゃ、ダメなんか

っていうかSQLがおかしいんじゃね、それ
firebird触ったことないから分からんけど

DBエラーならエラーを全部張ってみそ
とにかくエラーが出てるんならエラーを張ってみては
0739nobodyさん2006/04/02(日) 18:58:54ID:???
nameがvarcharなんでそ
0740nobodyさん2006/04/02(日) 18:59:28ID:???
>>738
firebirdに限らず、文字列をクオートしないで渡せるDBなんてあるのかよ。
07417382006/04/02(日) 18:59:59ID:???
やべ、かぶった

しかもSQL文は大丈夫か
postgreばっかなんで方言が身についてた
0742nobodyさん2006/04/02(日) 19:00:44ID:???
>>736
それ、name側じゃなくnum側がエラーになってるだろう。
07437232006/04/02(日) 19:04:30ID:???
たとえば、ソートひとつするんでも
$_GET['orderby']
って変数を使ったりします。
こんな感じで一つ一つに対してチェックをしなくちゃならんのですよね?
$_GET
$_POST
をまとめてチェックとか出来たらいいのに。

ところで、小さなサイトでつついたところで面白いものが出て来そうもないところに対して、実際に、sqlインジェクションをするために$_GETや$_POSTで変な値を入れるってよくあることなんでしょうか?
0744nobodyさん2006/04/02(日) 19:05:31ID:???
>>743
$_REQUEST
07457232006/04/02(日) 19:09:21ID:???
>>744
なるほど、$_REQUESTに対して、最悪入っていてはまずい文字列が入っていたらクエリ実行せずにたたき落とすって感じ?
case文のdefaultに飛ばすとか。
0746nobodyさん2006/04/02(日) 19:10:57ID:???
>>743
foreachで回すかarray_mapとかで配列を一括チェックしちゃえば?
0747nobodyさん2006/04/02(日) 19:37:05ID:???
しかし最初に全部のクエリにその手の処理をしちゃうと、
変なところでバグが出たりする(してはならないクエリも処理しちゃったり)
かと言って必要な場所で毎回必要な処理をするのも、
万一忘れたら話にならんし・・・難しいね
07487232006/04/02(日) 19:42:09ID:???
>>746
まずい値をスクリプトの側で補正したり、値に対して個別のエラーメッセージを出したりしようとしなければそんなに大変じゃない気がして来た。
よく考えたら、そんなイタズラをする相手に対してそんな丁寧なインターフェイスを用意する必要なんてないもんな。
ループでまわして、問題があれば$errflag++して、ループがおわったところで$errflag>0だったらcaseのdefaultに飛ばす。
って感じでいいのかな。
この辺の入力値をまとめた配列に対してまとめて処理するってあたりは、ネットでさがしてもあんまり情報ない希ガス。どういうわけか。
一概にこうすればいい、って書きにくいものなのかもしれないけど。
07497232006/04/02(日) 19:46:16ID:???
>>747
>>748を書いてる間にレスがあったみたいですね。
たしかにそうですね。
それぞれの変数について、sqlに突っ込む直前にっていうのが正しいのかもしれないけど、自分のようなスパゲッティソース書く奴にはとても手に負えないことになってしまいそうです。
やっぱり無理そうな気がして来たorz
0750nobodyさん2006/04/02(日) 19:47:14ID:dnNED4Rv
php4での質問です。
ボタンを押した後、画面に文字を表示させ、1秒待った後に該当のURLを表示する
という処理をしたいのですが、ボタンを押したあとのfunction内で

echo '<html><head>';
echo '<META HTTP-EQUIV="refresh\" content="1;URL=指定のアドレス">';
echo '</head><body>処理中です。</body></html>';

のようにすれば簡単に実現できます。
しかしこの場合、FireFoxなどのブラウザではRefererが取得できません。

header ("Location:指定のURL");

を用いればRefererを取得できるのですが今度は文字を表示できません。
具体的には次のようにしていますが文字が表示されません。

echo '<html><head>';
echo '</head><body>処理中です。</body></html>';
header ("Location:指定のURL",microtime(1000));

何か良い方法はないでしょうか?
0751nobodyさん2006/04/02(日) 20:09:50ID:???
sleep
07527502006/04/02(日) 20:20:21ID:???
>>751

echo '<html><head>';
echo '</head><body>処理中です。</body></html>';
sleep(1);
header ("Location:指定のURL");

で試してみましたが文字は表示されないようです。
(1秒待ってリダイレクトされます)
■ このスレッドは過去ログ倉庫に格納されています