【PHP】下らねぇ質問はID出して書き込みやがれ 93
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2010/02/15(月) 19:23:06ID:???過去スレ、関連スレ、FAQなどは>>2-10辺り
次スレは>>980が立てる。10分以内に立たない場合、宣言してから立てたい人が立てること。
◆前スレ
【PHP】下らねぇ質問はID出して書き込みやがれ 92
http://pc11.2ch.net/test/read.cgi/php/1263035502/
◆質問用テンプレ
【OS名】vine linux
【PHPのバージョン】php5.26
【連携ソフトウェア】mysql
【質問内容】
◆質問する時の注意
・ スレを上げて自分のIDを表示させること。(メール欄に何も記述しない。専ブラのsageチェックを外す)
・ 己の行った操作、変更などを詳しく明記すること。
・ エラーメッセージはそのまま表記すること。「エラーが出ます」だけでは回答不可。
・ 質問者として、態度をわきまえること。
・ 事前に関連リンクの公式マニュアル、リファレンス本くらいはちゃんと目を通しておくこと。
(PHPで最良の教本はこの公式マニュアル。市販の書籍は嘘が多いので鵜呑みにしない。)
◆質問後の注意
・2回目以降は最初に質問した際のレス番号を入れて、偽者防止に必ずIDを表示させること。
・解決しなくても回答をもらった場合はお礼を言うこと。
(荒らし、煽りは除く。煽られたときも、無闇に反論せずスルーすること。)
◆回答者への注意
・誰にレスしているのか分からないと困るので、>>(アンカー)をつけて回答すること。
【その他諸注意】
・SQL・正規表現・PEAR・テンプレート(Smarty等)・フレームワークは各該当スレへ
0262nobodyさん
2010/02/24(水) 19:08:00ID:???0263nobodyさん
2010/02/24(水) 19:51:17ID:QiKWkWLO以下の記事の信頼性はいかがばかりでしょうか?
http://www.res-system.com/weblog/item/359
Linux + Apache(prefork) + PHP4 な環境で上記記事のスクリプトは利用可能ですか?
すみませんが、ご教示ください。
0264nobodyさん
2010/02/24(水) 20:14:17ID:QiKWkWLO安全でしょうか?
----------
$retry = 0;
$fp = fopen(CSV_FILE,'a');
stream_set_write_buffer($fp, 0);
while(!flock($fp, LOCK_EX)){
$retry++;
if ($retry > 5) {
return FALSE;
}
usleep(100000); // 0.1秒待つ
}
fwrite($fp, $line);
@flock($fp, LOCK_UN);
@fclose($fp);
0266nobodyさん
2010/02/24(水) 20:33:04ID:QiKWkWLO入力:
CSV_FILE → 対象となるCSVファイル
$line → 追記したい行
戻り値:
CSV追記成功時は TRUE、失敗時は FALSE。
// CSV追記処理
function csv_write($line){
$retry = 0;
$fp = fopen(CSV_FILE,'a');
stream_set_write_buffer($fp, 0);
while(!flock($fp, LOCK_EX)){
$retry++;
if ($retry > 5) {
@fclose($fp);
return FALSE;
}
usleep(100000); // 0.1秒待つ
}
fwrite($fp, $line);
@flock($fp, LOCK_UN);
@fclose($fp);
return TRUE;
}
0267nobodyさん
2010/02/24(水) 20:54:36ID:???1回目で書き込みが成功しない場合retryしても書き込みが成功するとは思えない
file_existsで書き込み対象があるか確認
is_writableで書き込み対象が書き込み可能か確認
0268nobodyさん
2010/02/24(水) 21:12:31ID:???まあ、いいこと無いわな。
flock使わない方法使った方がいいよ。占有権とってからファイルオープンね。
0269nobodyさん
2010/02/24(水) 21:17:40ID:???マルチスレッドやる方法教えてくれよ
0270nobodyさん
2010/02/24(水) 21:19:33ID:???元々phpはマルチスレッドに対応しとらん
cURL使った擬似的なものを紹介してるとこもあるが
そのモジュールすらはいってないなら手の施しようがない
ご臨終です
0271nobodyさん
2010/02/24(水) 21:20:10ID:???0272nobodyさん
2010/02/24(水) 21:23:52ID:???ありがとうございます
0273nobodyさん
2010/02/24(水) 22:15:50ID:5FK8q+s6$u = $_POST['username'];
$p = $_POST['password'];
if ($u != '' && $p != '') {
if ($p == $users[$u]) $_SESSION['username'] = $u;
else unset($_SESSION['username']);
}
この連想配列を外部ファイルから出力させたいのですがさっぱりわかりませんorz
0276nobodyさん
2010/02/24(水) 22:39:19ID:???説明がへたくそすぎるwwwww
ようするに中身が
hoge<>geho
guest<>guest
って書いてある外部ファイルを読み込んで
↓↓↓↓↓
$users = array('hoge' => 'geho', 'guest' => 'guest');
というように連想配列に格納したいってことだろ?
本質とは違うその下の部分に突っ込みたくなるじゃないか・・・
0277nobodyさん
2010/02/24(水) 22:43:22ID:5FK8q+s6ふむふむ。
参考になります。
>>276
あ、その通りです。
スクリプトを拾って自分なりに書き換えて遊んでるのですがうまくいかなくて・・・。
0278nobodyさん
2010/02/24(水) 22:53:52ID:???$users = array();
foreach ($data as $row) {
$tmp = explode("<>", $row);
$users[$tmp[0]] = $tmp[1];
}
print_r($users);
動作は確認してないがこんな感じじゃないっすかね
0279nobodyさん
2010/02/24(水) 22:58:45ID:???0281nobodyさん
2010/02/24(水) 23:12:02ID:eGz4iYXY$obj &= new ○○();
この&=はどういう意味があるんでしょうか?
0282nobodyさん
2010/02/24(水) 23:12:49ID:???なんか超初心者っぽいな
エラーでてるならエラー書かないとエスパーは今不在だ
0284nobodyさん
2010/02/24(水) 23:17:04ID:eGz4iYXY0285nobodyさん
2010/02/24(水) 23:19:20ID:5FK8q+s6認識って違いましたねw
一行目のhoge<>gehoだけうまく読み込んでくれてないっぽいです。
エラーは出ていませんが・・・。
0287nobodyさん
2010/02/24(水) 23:22:58ID:???0288nobodyさん
2010/02/24(水) 23:23:17ID:HQ6IjQWg【OS名】Windows XP
【PHPのバージョン】PHP5.2.10 CLI
test.php
<?php
system("時間が掛かるプログラム.exe");
?>
test.phpを終了させた時、時間が掛かるプログラム.exeも終了して欲しいのですが
終了してくれません。何か終了させる方法はありますか?
0289nobodyさん
2010/02/24(水) 23:26:53ID:5FK8q+s6$users[$tmp[0]] = $tmp[1];
この辺?w
>>287
BOMってググってみたけど空白?
0291nobodyさん
2010/02/24(水) 23:54:55ID:dcz7C6Quapacheの公開用ディレクトリにphpファイルを置いてそれを直接編集しながら開発していくのが普通でしょうか?
あるいは、Java開発みたいに別の場所で編集して実行時にデプロイ、みたいなことをやるのですか?
現場でLAMP開発をされてる方はどのような流れで開発してるのでしょうか?教えてください。
0292nobodyさん
2010/02/25(木) 00:04:07ID:5FK8q+s6おお、そういう事でしたか。
んー確認してみましたが特に問題なかったですorz
0293nobodyさん
2010/02/25(木) 00:04:20ID:???終了させたときってどのタイミング?
phpが全て表示されたタイミングか
ブラウザを閉じた(他へ移動した)タイミングか
まぁたぶん後者なんだろうけど
両者に共通する点としてsystem関数使えるならプロセスをkillすればいいと思う
XP Proならtaskkillってコマンドがあるが
Homeだとないのでどっかから似たようなプログラムを探して持ってこればいいと思う
軽く探したがこんなのとか
ttp://www.vector.co.jp/soft/winnt/util/se401845.htm
後者のタイミングの場合普通ではこの処理を挟むことも不可能なので
JavaScriptのonBeforeUnloadイベントで終了時(移動時)に
ajaxかなんかで終了させてやるしかないかと思われ
0294293
2010/02/25(木) 00:06:50ID:???拡張子のとこhtmじゃなくてhtmlにすれば見れる
0296293
2010/02/25(木) 00:28:21ID:???全部忘れてちょうだい
ていうか普通にバッチ処理でいいんじゃ
0297nobodyさん
2010/02/25(木) 01:23:21ID:oCMgk6uhwhile(!mb_send_mail(/*メール*/))
ってやるのって有効ですか?
0298nobodyさん
2010/02/25(木) 01:24:46ID:???一生終わらない可能性
0299nobodyさん
2010/02/25(木) 01:47:39ID:???char c;
int n = (int)c;
というキャストは出来ますか。
文字型を-128 〜 127に変換するってことです。
0301nobodyさん
2010/02/25(木) 01:54:40ID:???http://php.net/manual/ja/language.types.type-juggling.php
0302nobodyさん
2010/02/25(木) 02:13:12ID:???0303nobodyさん
2010/02/25(木) 02:24:52ID:???0304nobodyさん
2010/02/25(木) 02:59:45ID:QIQePhl3$users = array();
foreach ($data as $row) {
$tmp = explode("<>", $row);
$users[$tmp[0]] = $tmp[1];
}
$tmp[0] = $_POST['username'];
$tmp[1] = $_POST['password'];
if ($tmp[0] != '' && $tmp[1] != '') {
if ($tmp[1] == $users[$tmp[0]]) $_SESSION['username'] = $tmp[0];
else unset($_SESSION['username']);
}
hoge<>geho
aaaa<>bbbb
1111<>2222
なぜか1111<>2222しかログインできない・・・。
何がいかないんでしょうか?
0306nobodyさん
2010/02/25(木) 03:37:54ID:???本来、区切れない部分を置換してしまうことがあります。
対処法はありますか。
ユニコード文字列みたいなのが出来ればいいですが。
一語が一つの配列入りしてれば
0307nobodyさん
2010/02/25(木) 04:29:25ID:???なんでforeachのブロックが終わったのに$tmp使ってるの?
その$tmpはforeach内のみで使うローカル変数でしょ
何やってるか理解できてないでしょ?
答え書いても分かるとは思えないけど
$data = file("ttttt.txt");
$users = array();
foreach ($data as $row) {
$tmp = explode("<>", $row);
$users[$tmp[0]] = $tmp[1];
}
この処理が終わった時点で
$usersは
$users['hoge'] = "geho";
$users['aaaa'] = "bbbb';
$users["1111"] = "2222";
こうなってるでしょ
セッション処理してるけど理解してないだろうしそこは省いて簡素化して続き書くと
if (isset($_POST['username']) && isset($_POST['password'])) {
if ($users[$_POST['username']] == $_POST['password']) {
echo "認証成功";
} else {
echo "認証失敗";
}
}
0308307
2010/02/25(木) 04:41:19ID:???ちょっと手直しする
0309nobodyさん
2010/02/25(木) 05:13:07ID:???<form method="post" action="<?php echo $_SERVER['SCRIPT_NAME']; ?>">
N<input type="text" name="username" value="">
P<input type="text" name="password" value="">
<input type="submit">
</form>
<?php
$data = file("ttttttxt");
$users = array();
foreach ($data as $row) {
$tmp = explode("<>", rtrim($row));
$users[$tmp[0]] = $tmp[1];
}
if (isset($_POST['username']) && isset($_POST['password'])) {
if ($users[$_POST['username']] == $_POST['password']) {
echo "認証成功";
} else {
echo "認証失敗";
}
}
?>
array_key_existsとか使ったほうがいいかもしれないがとりあえず簡素化したものなのでこれで
あと本番ではエスケープ忘れずに
0310309
2010/02/25(木) 05:20:07ID:???何も入れなくても認証されてしまう
isset使ってるのが原因でもあるがやっぱarray_key_exists使って
if (isset($_POST['username']) && isset($_POST['password'])) {
if (array_key_exists($_POST['username'], $users)) {
if ($users[$_POST['username']] == $_POST['password']) {
echo "認証成功";
} else {
echo "認証失敗";
}
} else {
echo "認証失敗";
}
}
まぁ書き方は色々あるのでとごまかしつつ寝ます・・・
0311nobodyさん
2010/02/25(木) 10:58:05ID:???0312288
2010/02/25(木) 13:22:24ID:???答えてくれてありがとう。
普通ならバッチ処理でいいのですが、今回はGUIを作っていまして。。
いろいろ試した結果
proc_open()で時間が掛かるプログラムを起動
proc_open()のオプションでbypass_shellをtrueにする
終了時にproc_terminate()
こんな感じでできました。
0313nobodyさん
2010/02/25(木) 14:13:12ID:???0314nobodyさん
2010/02/25(木) 14:13:44ID:5niKfpQR0316nobodyさん
2010/02/25(木) 14:32:59ID:4W7DKvAcMYSQLと接続をしようとしたところ、
Call to undefined function mysql_connect
と出て先に一向に進みません。
PHP5とMYSQLの相性の問題かと思ったのですが、
バージョン的にも問題がないようです。
他に原因として何が考えられますか?
0317nobodyさん
2010/02/25(木) 14:35:00ID:4W7DKvAcとりあえず、サーバーを再起動して見てみます。
0318nobodyさん
2010/02/25(木) 14:40:41ID:???0319nobodyさん
2010/02/25(木) 14:42:16ID:4W7DKvAcMYSQL単体だとログインが出来て、テーブルも作れます。
PHP5もphpinfo()で動作は確認しています。
やっぱり、接続中に何らかしらのトラブルが発生しているようです。
ネットワーク周りとかで、疑った方がいい設定値などありますか?
0320nobodyさん
2010/02/25(木) 14:44:51ID:4W7DKvAcmysqlが原因ですか・・・
DBサーバー関係が疎いので、色々やっているうちに、どこかの設定を間違っていじっていたかもしれません。
今から、再インストールしてみます。
ありがとうございます。
0321nobodyさん
2010/02/25(木) 14:50:22ID:???mysqlではなくphpのmysql用のモジュールが読み込めてないだけ
phpinfo()にMySQLの項目がでてこないと使えない
0322nobodyさん
2010/02/25(木) 15:12:09ID:???PHP5(2系3系)とMySQL5.xはdllの相性が悪い
5.2なら「php mysql 修正版 dll」でググレ
王道的な解決策は>>6のブログに書いてある
0323nobodyさん
2010/02/25(木) 16:07:01ID:???【PHPのバージョン】php5
環境は特に限定せず、普通のレンタル鯖等での動作を想定。
数値での++的な事をアルファベットでやりたいです。
a,b,c....と事前に配列で定義することなく、プログラム的にa,b,c....をループの中などで出力する方法はないでしょうか?
0325nobodyさん
2010/02/25(木) 16:36:52ID:???PHPからウィンドウズのアプリ(.exe)を起動するにはどんな関数を使えばいいのですか?
アプリはPHPソースと同じ場所にあります。
0327nobodyさん
2010/02/25(木) 16:39:28ID:gV6UoPDqWindowsXPにPHPを入れてるのですが
PHPからウィンドウズのアプリ(.exe)を起動するにはどんな関数を使えばいいのですか?
アプリはPHPソースと同じ場所にあります。
0328nobodyさん
2010/02/25(木) 16:39:52ID:???0329nobodyさん
2010/02/25(木) 16:51:08ID:gV6UoPDqいやそうやって書いてたんですがエラーでて(´・ω・`)
っておもってたんですがスペルマミスでしたwwwwwwwwwwwwwwwwwサーセンwwww
そして直して再度やってみたら、なんかブラウザが読み込み中のままで
サーバー側でアプリが起動してないんですが
他に何か気をつける点があったら教えてください
0330nobodyさん
2010/02/25(木) 17:02:02ID:???0331nobodyさん
2010/02/25(木) 17:02:30ID:???0332nobodyさん
2010/02/25(木) 17:10:15ID:gV6UoPDqえっと普通のWinアプリなのでGUI的な感じですが・・・
>>331
ログどこにありますかログ。みてみます
0333nobodyさん
2010/02/25(木) 17:24:18ID:???`〜` は文字出力して戻ってくるのが前提のコマンドだ。
もしサーバー側で実行が成功してるなら
そのphp、つまりhttpdの実行ユーザーで実行されている
デスクトップがそのユーザーのものじゃないからそのままじゃ出ないだろう
サービスの設定でデスクトップとの対話を許可するとかやれば出るかもしれない
実行してphpkら切り離すのは、、、&使えたっけ?forkしてexecとかか
0334nobodyさん
2010/02/25(木) 17:31:33ID:gV6UoPDqすごいありがとうございます。
確かに画面には出ていませんでした。。。
んでタスクマネージャみてみたらボタン押した回数分起動してましたww
すみません、サービスの設定はどうやってやるのですか?><
んで、サイトに書いてるようにexecやったらphpが抜けてこないっぽいので
切り離すやりかたを><
0335nobodyさん
2010/02/25(木) 17:34:16ID:???Apacheのプロパティ出してログオンのとこにあるデスクトップ〜をチェック
0336nobodyさん
2010/02/25(木) 17:56:54ID:gV6UoPDqできました!!!
タスクトレイのアイコン右クリのサービスでもOKでした。
おかげでアプリは見事に表示されました!!
で、これやっぱりアプリ終了させるまでexecで止まってるみたいですね。
アプリは起動されたら一連の動作を終えたら終了するようにするので
これはこれでOKかなとおもいました。
いろいろありがとうございました。
ほんと助かりました。。。
0337nobodyさん
2010/02/25(木) 19:13:45ID:???htmlspecialcharsは表示のタイミングで使うものなので
受け取った値をどう使うかによる
表示するのなら(そのタイミングで)使うべき
内部で処理するために使うだけならいらない
0338nobodyさん
2010/02/26(金) 00:44:43ID:???0339nobodyさん
2010/02/26(金) 01:11:20ID:???0340nobodyさん
2010/02/26(金) 02:35:11ID:L4Bq0Atmrtrimを使わないといけないのは分かりましたが理解が出来ない・・・。
>>307
なんとなくでしか分かってないですorz
issetで書いた方がいいのでしょうか・・・?
>>310
一つ一つ理解して頑張っていきたいと思います・・・。
これで動きました。
ありがとうございます。
0341nobodyさん
2010/02/26(金) 03:25:21ID:???0342nobodyさん
2010/02/26(金) 07:56:53ID:???http://jp.php.net/manual/ja/function.file.php
注意: FILE_IGNORE_NEW_LINES を指定しない限り、 配列に取り込まれた各行は行末文字も含みます。
行末文字を取り除きたい場合には rtrim() を使用する必要があります。
fileで配列に入った1行ずつの最後には改行が入ってるよってこと。
だからexplodeした最後の配列の中は
"geho[行末文字]"になっていて比較する"geho"とは違う文字列となってしまう。
こういうときは自分なら
hoge<>geho<>
aaaa<>bbbb<>
1111<>2222<>
と余分に<>を付けとく
0343nobodyさん
2010/02/26(金) 11:11:53ID:AdOXrMqO昨日execがどーのとかって騒いでた基地外ですがまた質問させてください。
昨日の件はうまくいって感謝しています。んで、それの続きなんですが
echo "処理中";
exec('hoge.exe')
echo "<img src='hoge.jpg'>";
てな具合でボタンを押したらhoge.exeを起動してhoge.exeがhoge.jpgを作成して
作成したらhoge.exeは終了するのでhoge.jpgを表示するってストーリーなのですが
hoge.exeはjpgを作成するまでやや時間がかかるので、
ボタンを押したら"処理中"の文字を表示してからhoge.exeを起動したいのですが
何故か、hoge.exeが終了してから"処理中"が表示されてしまいます・・・
これどうしたら、先に処理中って文字を表示させることができますか?
0344nobodyさん
2010/02/26(金) 11:14:02ID:???0345nobodyさん
2010/02/26(金) 11:31:14ID:AdOXrMqOでけましたありがとう。
ob_flush( );
flush( );
と両方しないとダメなんですね。
0346nobodyさん
2010/02/26(金) 12:23:06ID:OgECULN1動画アップローダを作成しています。
動画・タイトルどちらが欠けてもエラーが出る様にしています。
しかしタイトルを未入力で、動画だけをアップした時、
何故かエラーが出ずphpがそのまま実行されて確認画面まで来てしまいます。
(動画も結局アップされていません)
これはphp.iniで設定された容量制限である100MBをオーバーしてしている場合のみで、
軽い動画ならうまく動作する様ですが…。
■up.html
<form action="up.php" method="POST" enctype="multipart/form-data">
動画 <input name="video" type="file"><br>
タイトル <input name="videotitle" type="text" size="30" value=""><br>
<input type="submit" name="up" value="アップする"></form>
■up.php
<?php
if (isset($_POST["up"])) {
$path = "./"
$video = $_FILES["video"]["name"];
$videotitle = $_POST["videotitle"];
if (!isset($videotitle)) {
error;//エラー処理(元のアップローダ画面に飛ばす)
exit();}
if (move_uploaded_file($_FILES['video']['tmp_name'],$path.$video) == false) {
error;//エラー処理(元のアップローダ画面に飛ばす)
exit();}
//確認画面処理〜
}?>
php.iniのファイルサイズ制限が効いていないのかと思い
直接ファイルサイズ if ($_FILES["video"]["size"] > 1000000) {〜} 等でチェックしましたが、
やはり大きい動画をアップするとこのエラーはスルーされてそのまま確認画面まで来てしまいます。
どこが間違っているのでしょうか?
0347nobodyさん
2010/02/26(金) 12:35:10ID:???if ($videotitle == "") {
0348nobodyさん
2010/02/26(金) 12:35:36ID:L4Bq0Atmふむふむ。
file関数をバカにしてました・・・。
勉強になります。
0349346
2010/02/26(金) 13:40:42ID:OgECULN1やってみましたが、やはり動画のアップがされた後確認画面が出ます。
仮に値を入れても、動画ファイルの容量が大きいと空の状態の確認画面が出て来てしまいます。
0350nobodyさん
2010/02/26(金) 13:51:38ID:???他にpostサイズの制限とかメモリ制限の設定があるから確認してみたら
$_FILES["video"]["error"]もご確認くださいませ
0351nobodyさん
2010/02/26(金) 13:55:57ID:???そうすると、いきなり確認画面になるね。
0352346
2010/02/26(金) 14:04:45ID:OgECULN1$_FILES["video"]["error"]確認しましたが空でした。
>>351
ネットで検索した所
「php.iniで設定したpost_max_sizeの値を超えると、該当の変数の値が消えてしまう」
というのがあったので、
「post_max_sizeを超える=動画をアップしていない状態」になるという事は何となく分かりました。
となると動画の容量がデカイ状態と動画ファイルを指定していない状態を同一の処理にするしか
無いという事でしょうか。
0353nobodyさん
2010/02/26(金) 14:05:06ID:???0355346
2010/02/26(金) 14:15:28ID:???post_max_sizeあるいはupload_max_sizeを超えなければいける様です。
色々探してて次の様な記述見つけたのでとりあえずの対応策打っておきます。
>・php.ini で post_max_size > upload_max_size にしておかないと、
>スクリプト自体が強制終了して、$_FILES[...]['error'] を見てエラーメッセージを出せないので注意。
>・アップロード form において、hidden input の MAX_FILE_SIZE は
>type="file" な input より手前に書かないと適用されないので注意。
ありがとうございました。お騒がせしました。
0356nobodyさん
2010/02/26(金) 17:13:48ID:pmFXcZ0U単にmagicfileで検索しても名探偵コナンばっか出てくるし(苦笑)、それを検索から除去しても良く分かりませんでした
0357nobodyさん
2010/02/26(金) 17:23:35ID:???0359nobodyさん
2010/02/27(土) 14:37:21ID:96it23LZといわれるゆえんは何?
クラスも持ってるしクラスオブジェクトもつくれるしオブジェクト指向言語と呼ばれる資格は
十二分に兼ね備えていると思うんだが(´・ω・`)
0360nobodyさん
2010/02/27(土) 14:52:54ID:???普通CといったらC++はささないけど
PHPといったらPHP3もPHP5もさすし名称的な問題もあるのかなぁと
今の状態はまだまだなんちゃってオブジェクト指向
オブジェクト指向としての機能が弱かったり足りなかったり
0361nobodyさん
2010/02/27(土) 14:59:17ID:???でも相対的な程度の違いであって
オブジェクト指向かそうでないかと言われれば「YES」になる
■ このスレッドは過去ログ倉庫に格納されています