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

【PHP】ID出さんでも質問OKなスレ【初心者歓迎】2

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2009/09/10(木) 22:52:33ID:???
まず読む→【PHP マニュアル】http://www.php.net/manual/ja/
PHPで最良の教本はこの公式マニュアル。市販の書籍は嘘が多いので鵜呑みにしない。
過去スレ、関連スレ、FAQなどは>>2-10辺り

姉妹スレ
【PHP】下らねぇ質問はID出して書き込みやがれ 80
http://pc11.2ch.net/test/read.cgi/php/1233479457/
0237nobodyさん2009/09/25(金) 18:48:53ID:???
>>233
<?php

if ( ○○==0 ) {
echo "not found";
} else {
?>
<font>TEST</font>

ズラ〜〜っと

<?
}
?>

</html>
0238nobodyさん2009/09/25(金) 18:52:04ID:???
>>235
display_errorsが0ってことはエラーが表示されてない設定になってると思うお
php.iniを書き換えればいいお
02392262009/09/25(金) 19:08:16ID:JtFu9Epk
>>238
くだらない質問につきあっていただきありがとうございます。
php.iniを
display_errors = On
error_reporting = E_ALL & ~E_NOTICE
に変更してみましたが、変化は見られませんでした。
変更するところ間違ってるのかな。よく分からなくなってきた。
0240nobodyさん2009/09/25(金) 19:12:18ID:???
>>237
きめえ
0241nobodyさん2009/09/25(金) 19:22:17ID:???
>>239
apache再起動はしたかお?
02422262009/09/25(金) 19:32:14ID:JtFu9Epk
>>241
2回ほど再起動しました。
う〜ん・・・
02432262009/09/25(金) 19:34:04ID:JtFu9Epk
>>241
すいません。
一応サーバごと再起動してみたらうまいこといきました。
ログを見るとどうやらapache様が挙動不審になってたようです。
設定を修正して見れるようになりました。
Webは普通に動いてたのでピンポイントでおかしくなってたようです。
こんなくだらない事にながながとつきあっていただき本当にありがとうございました。
0244sage2009/09/25(金) 20:36:02ID:???
古いファイルを判定して削除したいんですが、なにぶん初心者なもので良い方法を思いつきません。
date("Ymd H:i:s.", filemtime($file))
をwihleで回して更新日を取得する事が出来るようにはなったのですが
これをどのようにすればよいのでしょうか?
ヒントをいただけないでしょうか
0245nobodyさん2009/09/25(金) 20:38:26ID:???
現在の時間とファイルの作成時間の差を取る
その差が、削除したい差以上であれば、削除

てな感じでよくない?
0246nobodyさん2009/09/25(金) 20:40:26ID:???
古いファイルの判定基準が曖昧だな
更新日って一度そのファイルが作成されたら更新はもうされないの?

とりあえず3ヶ月更新なかったものを削除とすると
取得した更新日と現在日時の差で90日分あいていたら
そのファイルにたいしてunlinkかけるとかでいいんでない?
0247sage2009/09/25(金) 20:43:14ID:???
例えば5個ファイルがあったとして新しい3つのファイルを手元に残して
残りの2個は削除したいという意味です。
説明不足申し訳ない。
0248nobodyさん2009/09/25(金) 20:44:07ID:???
更新日時でソートして上から3つのファイル名に対して削除かける

てな感じでよくない?
0249nobodyさん2009/09/25(金) 20:59:34ID:???
>>247
ファイルを作成するときに同時にファイル名を記録するtxtを用意して
それをもとにして削除しな
0250sage2009/09/25(金) 21:18:20ID:???
>>248->>249
while (false !== ($file = readdir($dir))) {
$filetaime[] = date("Ymd H:i:s.", filemtime($file));
$filetime[] = sort($filetime);

unlink($file[$i]);

というのを思いついたのですが、ファイル名と時間が連動してないですね。
きっとアホなことしてると思われてるんでしょうけど、複数の変数を連動させるような事はできますか?
0251nobodyさん2009/09/25(金) 21:26:04ID:???
全部取ってからでないとソートできないっしょが?
02522492009/09/25(金) 21:41:52ID:???
$new_file = "hoge.txt"; //新しいファイル名
touch($new_file); //新しいファイルを作成する
file_put_contents("log.txt", $new_file."\n", FILE_APPEND | LOCK_EX); //新しいファイル名をログファイル(log.txt)に追記
$list = file("log.txt"); //ログを配列に読む
$tmp_log = ""; //新しいログ
for ($i = count($list) - 1; $i >= 0; $i--) { //後ろから回す
 if ($i > 5) {
  unlink($list[$i]); //ファイル削除
 } else {
  $tmp_log .= $list[$i]."\n";
 }
}
file_put_contents("log.txt", $tmp_log, LOCK_EX);

動作確認もしてないし細かいとこが違ってるかもしれんけど
イメージとしてはこんなかんじのことをいった
02532522009/09/25(金) 21:48:57ID:???
追記の仕様を勘違いしてた&for文とif文の条件がめちゃくちゃだったw
眠くて頭が回らない・・・
0254nobodyさん2009/09/25(金) 21:49:56ID:???
途中で送信してしまった
252は忘れてちょうだい・・・
0255nobodyさん2009/09/25(金) 23:10:04ID:???
ISBNコード 書名 価格 出版社
0-0000-0001-2 ガリの穴 25,000円 山田のおばさん

コレをあなたのデータベースに登録してみて下さい
0256nobodyさん2009/09/25(金) 23:22:36ID:???
したよ
0257nobodyさん2009/09/25(金) 23:26:38ID:xPOnPJfW
いつもログファイルに書き込みするときは
fopenしてLOCK_EXしてfputsで書いてLOCK_UNしてfloseしてるんだけど
やっぱりfile_put_contents1行で書いたほうがいいものなんかね?
0258nobodyさん2009/09/25(金) 23:45:05ID:???
いいって何が?
0259nobodyさん2009/09/25(金) 23:45:29ID:???
>>255
俺もしたけど、まさかコレをデータベース登録したおかげでこの俺に彼女が出来る事になったとは・・・
0260nobodyさん2009/09/25(金) 23:46:22ID:???
>>257
ロックされないじゃん
0261sage2009/09/26(土) 00:07:25ID:???
>>260
file_put_contentsでもパイプでLOCK_EXすればいいんじゃないの?
file_put_contents($file, "hogehoge", FILE_APPEND | LOCK_EX);
こんな感じ。
0262nobodyさん2009/09/26(土) 00:21:08ID:???
パイプて
0263sage2009/09/26(土) 00:24:43ID:???
これはロックされているのか?
0264nobodyさん2009/09/26(土) 00:39:16ID:???
>>261
> FILE_APPEND | LOCK_EX
これは有効なのか?

マニュアルを見ると、

フラグを組み合わせる際には、論理 OR (|) 演算子で連結します。
FILE_APPENDはLOCK_EX と同時には使用できません。

と読めるのだが...。

「追記はアトミックに行われるためロックは不要」とあるので、
FILE_APPENDの指定だけでログ追記するのに問題はなさそうではあるが。
0265sage2009/09/26(土) 00:50:03ID:???
横からで悪いがロックしなくても同時書き込みが発生しても大丈夫ということか?
0266nobodyさん2009/09/26(土) 01:35:35ID:???
>>265
アトミック(=不可分の)とあるので、一連の操作が邪魔されることがないということなんだろうね。
マニュアルを信じるならば。

古い版のマニュアルでは、
file_put_contents($file, $person, FILE_APPEND | LOCK_EX);
という例が載っているが、
http://bugs.php.net/bug.php?id=49329
で修正されたようだ。
0267sage2009/09/26(土) 01:40:05ID:???
マニュアルを信じるならfopenでわざわざLOCKとか使わなくても
file_put_contentsの1行で済むというわけか。
0268nobodyさん2009/09/26(土) 01:42:11ID:???
FILE_APPENDの場合についてはそのように読めるな。
0269nobodyさん2009/09/26(土) 05:54:34ID:???
php でバッチやるならタイムアウトにならないように注意ね
0270nobodyさん2009/09/26(土) 17:49:56ID:???
PHPでは、
配列ってシングルクオート入れないと、
正式にはダメみたいだね。
0271nobodyさん2009/09/26(土) 18:27:03ID:???
配列に入れる?
正式?
0272nobodyさん2009/09/26(土) 18:36:08ID:???
anArray['keyString'] の話か?
0273nobodyさん2009/09/26(土) 18:45:59ID:???
>>272
それそれ

シングルクオート抜いたら、
Noticeが出やがる。
0274nobodyさん2009/09/26(土) 19:13:58ID:???
何を今更感てんこもりだな・・・
0275nobodyさん2009/09/26(土) 19:41:50ID:???
つ$anArray[1]
0276nobodyさん2009/09/26(土) 19:47:01ID:???
>>275
数字だったら、Noticeが出ないってこと?
0277nobodyさん2009/09/26(土) 19:48:22ID:???
つ$anArray[$key]
0278nobodyさん2009/09/26(土) 19:51:12ID:???
define('keyString', 'manuke'); とかあったらバグの元だろうに
0279nobodyさん2009/09/26(土) 20:05:45ID:???
>>277
変数でもNoticeが出ないってこと?
0280nobodyさん2009/09/27(日) 00:01:22ID:???
$anArray[keyString]
定数keyStringを先に探して、なければ文字列'keyString'とみなす。
クオートで囲わなくても動くかもしれないが、それはたまたまだってこと。

>>278はこれを説明している


$anArray[1]
1番の要素。
1は番号であって文字列ではないのでクオートで囲わない。


これで判るかい?
0281nobodyさん2009/09/27(日) 00:05:28ID:???
2番目の要素だよ
0282nobodyさん2009/09/27(日) 00:07:26ID:???
>>281
2番目とは限らないし、そもそも「1番目」ではなく「1番」と書いているだろ
ちゃんと読め
0283nobodyさん2009/09/27(日) 00:27:37ID:???
http://ja.wiktionary.org/wiki/%e7%95%aa
意義
1. 順序だてたものの中で順序が到来すること。
02842822009/09/27(日) 00:55:21ID:???
ん?
1番と書いてるんだから最初の要素のつもりだろ、っていう意味かな?
背番号1番=1番目の打者ではない、という説明で判ってもらえるだろうか
0285nobodyさん2009/09/27(日) 00:58:56ID:???
もっと具体的に説明した方がいいと思うよ。
ほのめかすような書き方だと2chでは攻撃されたと思う人が多いから。
02862332009/09/27(日) 02:01:49ID:???
>>234
>>236
お礼遅れて申し訳ありません。
解決しました!ありがとうございます!
0287nobodyさん2009/09/27(日) 02:44:45ID:???
PHPの配列は、数値であっても番号と言うよりただのキーだから、
何番目というのはあまり意味が無い。

$ar[2]=2 ;
$ar[0]=0 ;
$ar[1]=1 ;
print_r($ar) ;

結果

Array
(
[2] => 2
[0] => 0
[1] => 1
)
0288nobodyさん2009/09/27(日) 02:57:34ID:???
ただのキーだから「何番」というのもおかしい
0289nobodyさん2009/09/27(日) 08:28:17ID:???
>>288
foreach の出力の順とかあるでしょ
0290nobodyさん2009/09/27(日) 08:57:46ID:???
foreachの順番は配列の内部順番。  配列のソート関数はソレを並び替えるもの。 
0291nobodyさん2009/09/27(日) 11:03:35ID:???
>>288
別におかしくないだろ
0292nobodyさん2009/09/27(日) 12:17:21ID:???
ん?どういうこと?
順序が関係ないって上で言ってるのに矛盾してるぞ?
0293nobodyさん2009/09/27(日) 12:59:06ID:???
>>292
背番号の説明で理解できなかったか?
0294nobodyさん2009/09/27(日) 13:06:15ID:???
>>289や>>290でしてる順番の話と背番号の話がどう関連?
0295nobodyさん2009/09/27(日) 15:07:31ID:???
>>294
あー、それは俺が書いたんじゃないから知らん。

ID表示ないんだからアンカー付けてくれよ。
0296nobodyさん2009/09/27(日) 19:31:27ID:???
勉強しようと思って参考書買って来たけど
外れ引いたっぽ・・・orz
0297nobodyさん2009/09/27(日) 19:38:36ID:???
アマゾンで書評がついていない本は
買わないほうがいい
0298nobodyさん2009/09/27(日) 19:40:51ID:???
外れだと理解できるだけの勉強はできたってことだろう
0299sage2009/09/28(月) 10:47:22ID:???
$file=fopen($filename, "a");
flock($file, LOCK_EX);
fputs($file, $hoge."\n");
flock($file, LOCK_UN);
fclose($file);
こういうの使い回してるんですが、これってもっとシンプルには出来ないでしょうか?
0300nobodyさん2009/09/28(月) 11:33:09ID:???
どういう意味でシンプルといってるのかがわからんが
コードを単に短くしたいのならfile_put_contents()使えばいい
file_existsやis_readableなどチェック機構を組み込んだ関数を作るのもよい
0301sage2009/09/28(月) 11:37:10ID:???
上にも出てるけどfile_put_contentsでもロックされてるっぽいから
いちいちfopenとかfcloseしなくてもfile_put_contentsで充分なんじゃないかな
0302nobodyさん2009/09/28(月) 11:46:48ID:???
>>301
されてるっぽいとかあいまいな回答なんていらねえんだよ
しっかり検証してから回答してね
0303sage2009/09/28(月) 11:52:15ID:???
じゃあLOCKされてるから大丈夫と書けばそのまま信じるのかな
0304nobodyさん2009/09/28(月) 11:56:28ID:???
検証するためにデッドロックがおきえる環境を意図的に作るほうが難しい
0305sage2009/09/28(月) 12:11:34ID:???
いまどきのサーバーやPCで同時書き込みとかが発生するくらいの処理数ってかなりのもんだと思う。
負荷ツールで負荷かけてもデッドロックが起きる前に別の問題で落ちそうだし
そういう環境作るのってけっこう難しいな
0306nobodyさん2009/09/28(月) 12:15:08ID:???
>>304
abじゃないようのjava製のソフト使えばできます
0307sage2009/09/28(月) 18:54:01ID:???
hoge.txtテキストの中身をクリアにしたいとき
touch("hoge.txt")
とするのはアリですか?
なにか他にクリア方法が思いつかないのですが、代替案とか普通はこうするだろってのがあったら教えてください。
0308nobodyさん2009/09/28(月) 19:00:13ID:???
truncate?
0309sage2009/09/28(月) 19:17:12ID:???
file_put_contents($file , "")
でもクリア出来るんじゃね?
0310sage2009/09/28(月) 21:28:13ID:???
mktimeでファイルの更新日を比較したりしてるんですが、これは扱える数字の限界とかありますか?
2000年問題みたいに扱える桁数の制限から使えなくなったり変な値を返したりすることが出てくるでしょうか?
0311nobodyさん2009/09/28(月) 22:39:08ID:???
>>310
環境は?

2038年問題で検索してみて。
0312nobodyさん2009/09/28(月) 23:54:52ID:???
>>310
どうせそこまで同じコード書いてないから心配する必要ないよ
0313sage2009/09/29(火) 07:46:18ID:???
>>310
環境はCentOS5.3のPHPは5.1.6です。
検索してみましたが30年近く先の話なので気にしなくてもよさそうですね

>>312
確かに気にしなくてもよさそうです
0314nobodyさん2009/09/29(火) 10:10:17ID:???
>>313
まぁそんなにシビアなシステムでないならいいんだが

「2038年にコード使って無いから関係無い」というのは間違い

日付の計算した時に2038年1月19日を超えたらおかしくなる。
2004年にATMで誤動作をおこしたのもコレ(内部で2倍にしていたため)
だからコーディングの仕方、運用の仕方では今すぐ起こる問題。

例えば、開始日・終了日などを設ける場合に、
「終了日は(事実上無期限で)決まってないから3000年にしとけ」とかした場合に
当日が終了日を超えているかどうかチェックしたりするとおかしくなる。

頭の片隅にでも2038年の事は入れておいた方が良いよ
0315nobodyさん2009/09/29(火) 10:56:12ID:???
2038年になってりゃパソコン側でも改良してるから間違いではないな
0316sage2009/09/29(火) 11:30:05ID:???
その頃にはおれ定年でもういね〜よ
03173142009/09/29(火) 11:35:18ID:???
なんだよ釣りかよ、マジメに回答した俺が馬鹿だった。
0318nobodyさん2009/09/29(火) 11:36:40ID:???
たいして参考にならないから気にしなくてもいいよ
0319sage2009/09/29(火) 11:46:08ID:???
あれって2039年になるとどういう値を返すわけ?
0320nobodyさん2009/09/29(火) 11:47:19ID:???
>>317
他スレでも2038年については何度も話題になってるんだよ

毎度、2038年まで後30年もあるから問題無いっていう本質を理解できていない馬鹿がでてくる
0321sage2009/09/29(火) 11:53:11ID:???
>>319
0とかになるんじゃないの?
と適当に言ってみる。
0322nobodyさん2009/09/29(火) 11:53:56ID:???
何この自演
0323nobodyさん2009/09/29(火) 11:59:56ID:???
>>319=321
お前は何をやってるんだw
wikipediaのアニメーションgifでも眺めてろよ

http://ja.wikipedia.org/wiki/2038%E5%B9%B4%E5%95%8F%E9%A1%8C
0324nobodyさん2009/09/29(火) 12:29:04ID:???
ぶっちゃけそこまでレス汚すほどの問題でもない
解決策もあるし既に過去スレで回答もでてる

http://phpspot.org/blog/archives/2007/02/php2038.html
0325nobodyさん2009/09/29(火) 12:33:47ID:???
年月日だけなのか時分秒まで含めるのかで変わってくるな。

>>321
CentOS使ってるなら64bit版使えば気にしなくていい
0326nobodyさん2009/09/29(火) 13:17:25ID:???
PearなんかじゃなくてPHPのDatetimeオブジェクト使いなよ
http://www.php.net/manual/ja/book.datetime.php
0327nobodyさん2009/09/29(火) 13:22:14ID:???
Datetimeは5.3以降じゃないとつかえないのが辛い
0328nobodyさん2009/09/29(火) 13:24:04ID:???
え?5.2だよ
0329nobodyさん2009/09/29(火) 13:34:13ID:???
>>328
失礼!
RHEL5がphp5.1.6なので、それで使えないのが辛い
0330nobodyさん2009/09/29(火) 13:36:12ID:???
自分で入れればいいのに
0331nobodyさん2009/09/29(火) 13:59:42ID:???
>>330
サポート受けられなくなる
0332nobodyさん2009/09/29(火) 14:00:30ID:???
サポート受けてるのか
0333nobodyさん2009/09/29(火) 14:11:50ID:???
>>332
ちゃんと書くと、
RHELをH/Wベンダ経由で800ライセンス買っている
redhatのサポートもH/Wベンダ経由で受けているが、
redhat networkで落とせるパッケージ以外のモノを入れるとサポートが受けられなくなる。

うちは大部分がjavaのシステムだけど、一部phpを使ってる(余談だがpythonも使ってる)
そのphpのためにサポートで揉めるのは勘弁。

スレ汚しスマンかった。
0334nobodyさん2009/09/29(火) 14:19:54ID:???
PHPカンファレンスではPHP5.2使っている人が一番多かった記憶がある。
OSバンドルは5.1みたいなので、みな自分でインストールしてるって事かな?
0335nobodyさん2009/09/29(火) 14:25:29ID:yA+gFAaj
CSVを読み込んで 列順序を変更した上で表示したいです。

項目例の1行目を非表示(2行目からのデータ部分のみ)にして表示したいのですが

どのように記載すればよいのでしょうか?

for( $i=0 ; $i<count( $data ) ; $i++ ) {
print "$shop[$i],$priceA[$i],価格:$priceB[$i] $place[$i]<br>\n";
}

現在の表示部分はこのような感じです。
初心者な質問ですが
ご教授お願いいたします。
0336nobodyさん2009/09/29(火) 14:30:25ID:???
linux使う奴でPHPを自分で入れない奴なんているのか
■ このスレッドは過去ログ倉庫に格納されています