【PHP】下らねぇ質問はここに書き込みやがれ 32
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2006/11/06(月) 22:07:16ID:???まず読め→【PHP マニュアル】http://www.php.net/manual/ja/
PHPで最良の教本はこの公式マニュアル。市販の書籍は嘘が多いので鵜呑みにしない。
過去スレ、関連スレ、FAQなどは>>2-10辺り
【前スレ】
【PHP】下らねぇ質問はここに書き込みやがれ 31
http://pc8.2ch.net/test/read.cgi/php/1161733546/
◆質問する時の注意
・ 自分のIDを表示させること。(メール欄に何も記述しない)
・ サーバーのOS、WebサーバーとPHPの種類やバージョン等を明記すること。
・ 己の行った操作、変更などを詳しく明記すること。
・ エラーメッセージはそのまま表記すること。「エラーが出ます」だけでは回答不可。
・ 質問者として、態度をわきまえること。
・ 事前に公式マニュアル、リファレンス本くらいはちゃんと目を通しておくこと。
◆質問後の注意
・偽者防止に必ずIDを表示させること。(メール欄に何も記述しない)
・2回目以降は最初に質問した際のレス番号を名前欄に入れること。
・解決しなくても回答をもらった場合はお礼を言うこと。
(荒らし、煽りは除く。煽られたときも、無闇に反論せずスルーすること。)
◆回答者への注意
・誰にレスしているのか分からないと困るので、>>(アンカー)をつけて回答すること。
【その他諸注意】
・正規表現・PEAR・テンプレート(Smarty等)・フレームワークはそれぞれの該当スレへ
・SQLについての質問はデータベース板(PCカテゴリ)の各スレで
・速さについては自分でベンチをとってここに書け(違う環境の人も調べてくれるかも)
0284sage
2006/11/10(金) 16:26:30ID:1a5fPov5実際には不正な文字列じゃないかもうちょとチェックするので
あまり同じ関数の使い回しはしないんじゃないかなあ。
Javascriptになるけど、こんなの書いたりもしてました。
画面遷移なしでも多少チェックしたいときもあるし。
※ソースは適当です。
<input type=text name=userid value="">
<input type=text name=pass value="">
<input type=submit onclick="javascript:nullcheck(this); return false;">
function nullcheck(obj)
{
obj=obj.forms[0];
for(var i in obj.elements.length)
{
if(obj.elements[i].type != "text") continue;
if(!obj.elements[i].value)
{
alert(obj.elements[i].name + "が入力されていません。");
return false;
}
}
0285nobodyさん
2006/11/10(金) 16:28:44ID:1a5fPov50286nobodyさん
2006/11/10(金) 16:50:59ID:???function err($txt) {
echo $txt;
echo "</BODY></HTML>";//この辺はスクリプトによって変える
exit;
}
if ($name == "") err("名前がない");
if ($mail == "") err("メールがない");
if (is_numeric($num)) err("NUMBERは数字で入れれ");
みたいにする。
0287nobodyさん
2006/11/10(金) 16:52:04ID:???0288286
2006/11/10(金) 16:52:24ID:???if (!is_numeric($num)) err("NUMBERは数字で入れれ");
だった。
0289278
2006/11/10(金) 17:46:15ID:???返答が遅れてすみません。
foreachを使う方法だと、表示位置が指定出来ませんよね?
テーブル(<table>)の表などで使用する場合、不適切だと
感じられるのですが、どうなのでしょうか?
0292nobodyさん
2006/11/10(金) 18:46:42ID:???なら $var[$key] = (empty($_REQUEST[$key]) ? "$key空" : $...; とでも
0293nobodyさん
2006/11/10(金) 19:06:10ID:???テーブル表示ループの中でデータのチェックやってんだよ。
典型的なコードとデザインが分離できてない素人設計。
0294278
2006/11/10(金) 19:17:03ID:???<table border="1">
<?
$param_list = array($name,$age,$sex,$address,$comment); //パラメータ名の一覧
foreach($param_list as $param) {
if($param == ""){
echo"<td>";
echo"$paramが空です";
echo"</td>";
}else{
echo"<td>";
echo $param;
echo"</td>";
}}
?>
</table>
ただこの場合、フォームから受け取ったarrayの値が空の場合は表示されなくなります。
素人設計ですが、向上心を持ってやっていきますので、再度アドバイスお願いします。
0295nobodyさん
2006/11/10(金) 19:31:32ID:???まず表示部分でそんなチェックすんな。
事前にチェックを済ませて結果を変数に格納し
自由なレイアウトで表示できるようにしろ。
0296nobodyさん
2006/11/10(金) 20:15:25ID:???> if($param == ""){
$paramは必ず中身がないんだから
> echo"$paramが空です";
$paramを表示できるわけないじゃん。
>>280でパラメータ「名」の一覧を使えって言ってるのに
なんでデータ値そのものをリスト化しようとしたりするの?
あと$nameとか$ageとか、ひょっとしてregister_globalsをONにしてんのか?
$_GETか$_POSTか$_REQUEST使えって。
0298nobodyさん
2006/11/11(土) 12:54:56ID:mWra3uS0どういうふうに組むのでしょうか?
0299nobodyさん
2006/11/11(土) 13:48:21ID:???パラレルロックってこれ?>ttp://sajiro.net/hpa/
これだとしたらこの作者が自分のプログラムに名付けた勝手な造語じゃない?
作り方は考えた本人に聞けばいいよ。
個人のオリジナルロジックなんて知らんがな。
0300298
2006/11/11(土) 13:58:29ID:mWra3uS0壊れにくいロックを作ってどんな仕組みでしょうか、奥が深いですね。
たとえばググルとよくみかける二重ロックはどうなんでしょうか?
ファイルをロックする前に、ロックファイルを別に用意して、
そのロックファイルが存在してたら別の処理にさせるという仕組みでした。
0301nobodyさん
2006/11/11(土) 14:04:13ID:???0302298
2006/11/11(土) 14:12:22ID:mWra3uS0fcloseだけで十分でしょうか?
0303nobodyさん
2006/11/11(土) 14:13:06ID:???難しい。
アクセスが多いサイトほど、いろいろ起きるし。
0304nobodyさん
2006/11/11(土) 14:24:57ID:???微妙に意味不明 >二重ロック
それって単なるロックファイル使ったプロセスロックじゃないの?
>>302
十分なわけないじゃん。
「壊れにくい」じゃ意味ないから「壊れない」ロックを使えってことじゃ?
強力なロック機構が欲しければRDBMS使うのが1番かと思うけど。
>>303
RDBMS使わないにしても、ロックディレクトリを使ったプロセスロックで
壊れた試しって俺は無いんだけど。
途中での切断・移動って一定時間過ぎたロックを強制削除、じゃダメなのか?
どっちかというと「壊れない」かつ「アクセスを漏らさず処理できる」が難しい。
単純なロックだとアクセス過多になると大量のタイムアウトを出してしまって
アクセスカウンターとかは本来の数を記録できなくなる。
そういう意味で、キューに溜めたクエリーを順次処理するRDBMSが1番。
まぁ、これも待ち受けの最大数があるんでそれ超えるとダメだけど、
そこは色々とチューニングでカバーできるし。
0305nobodyさん
2006/11/11(土) 14:59:07ID:???でも書き込んでる途中で電源が切れると壊れる。
MySQLのマニュアルにも不意に電源が切れた場合、
壊れる可能性があることは明記されている。
0306nobodyさん
2006/11/11(土) 15:08:40ID:???0307nobodyさん
2006/11/11(土) 15:18:25ID:???ロックの頑丈さをためすコードってないの?
0308nobodyさん
2006/11/11(土) 15:24:28ID:???並行で走らせたプロセスで同時アクセスさせないといけないから
単なるコードでは難しいよ。WindowsとUNIXとでやり方変わるし。
ApacheBenchとか使ってアクセスかけた方が手っ取り早い。
でもロックの頑丈さを確認するだけなら、ロックの判定やON/OFF処理に
片っ端からsleep()入れてって、アトミックじゃない処理の部分を
間隔広げてやるだけで簡単にテストできるよ。
0309nobodyさん
2006/11/11(土) 15:41:13ID:???>途中での切断や移動などを考えると
http://www.php.net/manual/ja/function.ignore-user-abort.php
考えずにすみますよ。
0310nobodyさん
2006/11/11(土) 15:51:18ID:UxXI6HSfmb_send_mailの第5引数が設定できません。
環境はレン鯖でPHP4.4.4でSafeModeがONです。
何か良い方法ありましたら宜しくお願いします。
0311nobodyさん
2006/11/11(土) 16:04:19ID:U7uBumak0312nobodyさん
2006/11/11(土) 16:08:00ID:???やんわり動作してるアプリではアルゴリズムが全て
0313nobodyさん
2006/11/11(土) 16:10:17ID:???0316310
2006/11/11(土) 16:27:02ID:UxXI6HSfmb_send_mail() [function.mb-send-mail]: SAFE MODE Restriction in effect. The fifth parameter is disabled in SAFE MODE
PHPバージョンUPやSafeModeの設定変更はレン鯖で無理なのですが、代替案はありますでしょうか?
0318nobodyさん
2006/11/11(土) 16:55:41ID:???0319nobodyさん
2006/11/11(土) 16:56:46ID:???0320310
2006/11/11(土) 17:30:37ID:UxXI6HSfありがとうございます。PEAR :: Mail_mimeDecode Mail_Mimeってのを調べてみます。
またはCGIとして動作させるか、Perlでsendmail使う方法などになりますかね・・・
0321nobodyさん
2006/11/11(土) 17:44:36ID:???毎秒二万回って凄いなあ。目がくらむ
0322nobodyさん
2006/11/11(土) 17:52:33ID:???1991,1,タイトル1,サブタイトル1
1991,2,タイトル2,サブタイトル2
1991,3,タイトル3,サブタイトル3
1992,3,タイトルA,サブタイトルA
1992,5,タイトルB,サブタイトルB
1992,7,タイトルC,サブタイトルC
1993,10,タイトル5,サブタイトル1
とあるデータをTable整形して出力させたいので、↓にしたのですが
<table border="1">
<?php
$fp = fopen("test.csv", "r");
while ($data = fgetcsv($fp, 10000)) {
print "<tr>";
foreach ($data as $d) {
print "<td>$d</td>";
}
print "</tr>\n";
}
?>
</table>
これを次のように、同じ年のところはrowspanでつなげて出力したいのですがどうやったらいけますでしょうか?
<tr><td rowspan="3">1991</td><td>1</td><td>タイトル1</td><td>サブタイトル1</td></tr>
<tr><td>2</td><td>タイトル2</td><td>サブタイトル2</td></tr>
<tr><td>3</td><td>タイトル3</td><td>サブタイトル3</td></tr>
<tr><td rowspan="3">1992</td><td>3</td><td>タイトルA</td><td>サブタイトルA</td></tr>
<tr><td>5</td><td>タイトルB</td><td>サブタイトルB</td></tr>
<tr><td>7</td><td>タイトルC</td><td>サブタイトルC</td></tr>
<tr><td>1993</td><td>10</td><td>タイトル5</td><td>サブタイトル1</td></tr>
0323nobodyさん
2006/11/11(土) 18:16:06ID:???変数のスコープはどうなるんでしょうか?
参考になるような記事などありますか?
0325nobodyさん
2006/11/11(土) 18:24:42ID:mWra3uS00326nobodyさん
2006/11/11(土) 18:24:44ID:???次に別の年が出てくるまで出力を変数にバッファリングしといて、
連ケツ不要ならそのまま出力、必要ならRowspan出力してから
バッファを持ってくる、とか。
0330nobodyさん
2006/11/11(土) 18:49:13ID:???0331nobodyさん
2006/11/11(土) 19:58:37ID:???最初はこのスレの質問の意味さえ全くわからなかったが、今では少しは理解できるようになった
あと三ヶ月まじめに勉強して模範的回答できるようになるから、おまいら待ってな
0333nobodyさん
2006/11/11(土) 21:09:32ID:mWra3uS0データが作られてから24時間後に削除することはphpだけはできないですよね?
0335nobodyさん
2006/11/11(土) 21:22:52ID:???WebアプリケーションとしてのPHPからだと24時間後に必ず削除することはできない。
アクセスごとに24時間以上経っているデータを削除させることはできるので、
この方法で十分であれば選択肢の一つにはなる。(PHPのセッションではこの方法で期限切れセッションファイルを消している)
また、CLI版限定ではあるもののPHPで作られたcronもあったりする。
0337nobodyさん
2006/11/11(土) 21:31:24ID:???接続が維持されるのは保障されるんだよね?
session.gc_maxlifetimeを過ぎた場合は指定した確立で
セッションの初期化時に削除される。
※クッキーはブラウザを閉じるまで有効とした場合
0338nobodyさん
2006/11/11(土) 22:09:52ID:???てきとーだけどこんな感じ?
<table border="1">
<?php
$fp = fopen("test.csv", "r");
$year = ""; $rows = array();
while ($data = fgetcsv($fp, 10000)) {
$next_year = array_shift($data);
if ($year != $next_year) {
print_year($year, $rows);
$year = $next_year; $rows = array();
}
$rows[] = $data;
}
print_rows($year, $rows);
function print_year($year, $rows) {
$rowspan = count($rows);
foreach ($rows as $i => $data) {
echo "<tr>\n";
if ($i == 0) print "<td rowspan=\"$rowspan\">$year</td>\n";
echo "<td>", implode("</td><td>", $data), "</td>\n";
echo "</tr>\n";
}
}
?>
</table>
0339338
2006/11/11(土) 22:15:25ID:???whileから抜けた後
× print_rows($year, $rows);
○ print_year($year, $rows);
まあコメント欄に直接書いただけで、動作確認してないから、どっちにしろ動くかどうかわからんけど。
0340322
2006/11/11(土) 22:53:29ID:???ありがとう〜〜〜
頂いたソースだと
$next_year = array_shift($data); の行に
parse error, unexpected '@' エラーがでてしまいましたが。
とっかかりが見えそうな気がしてきました
0341nobodyさん
2006/11/11(土) 23:02:33ID:qWd4Y1Xfよろしければ、お教え願えないでしょうか?
配列 $value の内容-----
Array ( [0] => ツール [1] => データベース [2] => IEEE1394 [3] => カメラ
[4] => インターフェイス [5] => アプリケーション [6] => パソコン [7] => Java)
$encode = mb_convert_encoding($value[4],"UTF-8","Shift_JIS");
$url_encode =urlencode($encode);
$html="http://thesaurus.weblio.jp/content/$url_encode";
$html2=file_get_contents($html);
$utf=mb_convert_encoding($html2,"Shift_JIS","UTF-8");
$str="$utf";
$word = array();
while(1){
$kensaku2=preg_match('/title="([^"]*)" class=crosslink/', $str, $match);
if($kensaku2 == FALSE){
break;
}else {
$match_result = $match[1];
array_push($word, $match_result);}
$pos = strpos($str, $match_result);
$str = substr($str, $pos+$kensaku2);
}
$unique=array_unique($word);
$array=array_values($unique);
print_r($array);
それで、実行結果は、$value[4]を指定して,URLに格納しているので
Array ( [0] => interface [1] => いんたーふぇいす [2] => インタフェイス
[3] => インタフェース [4] => インターフェース )となります。
そこで、なにがしたいのかと言いますと、プログラムの最初で、$value[4]として
いますが、ループさせて、$value[0]〜[7]の分の結果を得たいのです。
これがどうもうまくいかなくて。。。長くなってしまいましたが、何卒。
0342nobodyさん
2006/11/11(土) 23:20:18ID:???foreach($value as $val) {
$encode = mb_convert_encoding($val,"UTF-8","Shift_JIS");
$url_encode =urlencode($encode);
$html="http://thesaurus.weblio.jp/content/$url_encode";
$html2=file_get_contents($html);
$utf=mb_convert_encoding($html2,"Shift_JIS","UTF-8");
$str="$utf";
$word = array();
while(1){
$kensaku2=preg_match('/title="([^"]*)" class=crosslink/', $str, $match);
if($kensaku2 == FALSE){
break;
}else {
$match_result = $match[1];
array_push($word, $match_result);}
$pos = strpos($str, $match_result);
$str = substr($str, $pos+$kensaku2);
}
$unique=array_unique($word);
$array=array_values($unique);
print_r($array);
}
じゃダメ?
0344nobodyさん
2006/11/11(土) 23:42:34ID:qWd4Y1Xf全然OKです。ホントありがとうございます。
>>343
なんででしょ。色々と試したんですけどねぇ。。。
きっと検討違いなことをやってたんでしょうな。
0345nobodyさん
2006/11/11(土) 23:55:07ID:???$url_encode =urlencode($encode);
$html="http://thesaurus.weblio.jp/content/$url_encode";
$html2=file_get_contents($html);
は
$html=file_get_contents("http://thesaurus.weblio.jp/content/".urlencode(mb_convert_encoding($val,"UTF-8","Shift_JIS")));とか省略してしまえば?他にもあるけど。
0346nobodyさん
2006/11/12(日) 00:07:53ID:AeUA6O/W確かに、そのほうが簡略化して記述できますね。
でも、未熟なせいか、習慣になっているせいか、分けて記述していくほうが
見やすいんですよね。
こういうのって、熟練者は省略して書くものなんですか?それとも、人に
よりきりなんでしょうか?
0347nobodyさん
2006/11/12(日) 00:14:00ID:???個人的には
$utf=mb_convert_encoding($html2,"Shift_JIS","UTF-8");
$str="$utf";
と
$unique=array_unique($word);
$array=array_values($unique);
はいくらなんでも無駄じゃ?って思ったけど、
>>345の指摘してる場所はむしろそのままの方がいいと感じた。
基準としては読みやすさの他、
・そこに他の処理を加える可能性はあるか
・バグったときに一部を外したいと思ったとき外しやすいか
辺りも踏まえると明確にしやすいです。
その意味では>>345の修正は後で面倒なことになりやすい。
0348345(341)
2006/11/12(日) 00:23:34ID:AeUA6O/Wなるほど。アドバイスありがとうございます。
$str="$utf"; に関しては、こうしないと処理が通らなくなってしまったので、
見た目むだな感じがしますが、仕方ないかと思って。
0349nobodyさん
2006/11/12(日) 00:28:30ID:???そこでのフローがどうなってるのか読み取りづらい
ここに貼る分にはいいけど実際には、クエリを投げる部分と検索語を
チェックする部分(とエラー処理)は関数化してループをスッキリさせたほうがいい
0350nobodyさん
2006/11/12(日) 00:34:18ID:???でもループ処理も書けないような人にそれはまだムリな気はする。
0351nobodyさん
2006/11/12(日) 03:15:02ID:???フォーム処理なども、$_POST["hoge"]ではなく$hogeなどにしています。
0353nobodyさん
2006/11/12(日) 03:24:42ID:???と言うことは、フォームから値を受け取る時は常に
$_POST["hoge"]か$_GET["hoge"]にしておかなくてはいけないのでしょうか?
正直、$hogeというような書き方の方が便利なので、ほぼすべてこの書き方です。
ただ、セキュリティに問題あると言われると不安だし・・・
0354nobodyさん
2006/11/12(日) 05:09:11ID:???なんとも思わないならそのままでいいんじゃない?
0355nobodyさん
2006/11/12(日) 05:10:56ID:???> $_POST["hoge"]か$_GET["hoge"]にしておかなくてはいけないのでしょうか?
基本的にはそう。まぁ、最初に$hogeに代入しちゃえば済む話だけど。
extract()を使う手もある。
個人的には$_GETや$_POSTはスーパーグローバルなんでかえって使いやすいけどね。
$hogeの方が使いやすいって言うってことはまともに関数化もしてないんじゃないの?
入力データとシステムで生成したデータは区別することを常に意識した方がいい、ってのもある。
register_globalsは特定のバージョンのPHPでは設定をONにしちゃうだけで
プログラムが何であれ攻撃を食らうセキュリティホールがある。
けど最新のはそこまで酷くないから、グローバル変数を使うときは
ちゃんと初期化をしてから使う、という原則を守ればそれほど危険ではない。
ただ、PHP6では無くなっちゃうのは確かっぽい。
0356nobodyさん
2006/11/12(日) 06:42:49ID:???$hoge = $_GET['hoge'];
と書くだけで初期化し忘れた$fugaがへんなことになるのが防げるんなら
安いもんなんでは。
個人的には初期化し忘れた変数を参照できるのが
おかしいような気がするのでスーパーグローバルはセキュリティが・・・
ていう話はなんか変な気がするんだけど。
0357nobodyさん
2006/11/12(日) 07:01:45ID:???でも面倒くさくてregister_globalsをONにしたいって人が、全部の入力変数をissetで
チェックできるかっつーとそれもムリがある気はするけど。
0359nobodyさん
2006/11/12(日) 08:03:53ID:a0k5e3E0何を質問していいのかわからないので
質問したくなる話をふってもらえませんか?
0360nobodyさん
2006/11/12(日) 08:31:23ID:???0361nobodyさん
2006/11/12(日) 08:47:52ID:a0k5e3E0ログインしたときに「新着メールが一件届いています」って表示したいのですが
メールを開封するこの表示を消すようにしたいです。
これはPHPだけで完了できるでしょうか?
0362nobodyさん
2006/11/12(日) 10:18:38ID:???意味わからん。
0363nobodyさん
2006/11/12(日) 10:38:03ID:???だとオモワレ
0364nobodyさん
2006/11/12(日) 11:17:06ID:AtVKFDXlNot supported in multithreaded Web servers - use extension statements in your php.ini
とワーニングが出てしまいます。
php.iniはenable_dl = Onになっています。
サーバーはApache/2.0.55 (Win32)
PHPは4.4.2です。
他に何かチェックする項目はあるでしょうか?
0365nobodyさん
2006/11/12(日) 11:33:37ID:???エラーメッセージの通りだよ
マルチスレッドのwebサーバではdlはサポートされてない
win上でのapacheでdlは使えないからphp.iniに書いてねってこと
0366nobodyさん
2006/11/12(日) 12:01:39ID:???そうすると一日100件書込みがあるとファイルが100個できてしまうわけで
一ヶ月で3000ファイル作ることになります。
これはサーバ、とくにHDDに悪いでしょうか?
0367nobodyさん
2006/11/12(日) 12:09:47ID:???かなり遅くなるよ。
0368nobodyさん
2006/11/12(日) 12:59:26ID:???Unix系だとi-node数の上限が決まってるから、ファイル作りすぎると上限に達して動かなくなる。
それに>367も言ってるが、ファイル数が増えると読み込みが遅くなる。
0369nobodyさん
2006/11/12(日) 13:14:55ID:GywZkAAcMovable Typeみたいに、毎回HTMLファイルを作成してそこにアクセスするようにするのと、毎回PHPスクリプトを実行してDBからデータをひっぱってくるのどちらがいいのでしょうか?
やはりデータが増えれば増えるほど、PHP→DBからひっぱるだと効率が悪くなるんですかね。
0371369
2006/11/12(日) 13:33:19ID:GywZkAAcそうですか。 PHP→DBの方が作るのが簡単だから……と思っていたけれどやっぱり落とし穴があるんですね。
データが増えれば増えるほど書き出すHTMLが増えるからMTみたいに「再構築中です」ってなる時間が長くなってしまうんですよね……
いろいろ考えて見ます。 ありがとうございました。
0373nobodyさん
2006/11/12(日) 13:46:55ID:6O05V0pAなにかヒントをいただけませんか?
参考ネタは下記のサイトの左側のオンライン状況です。
ttp://xoopsrss.com/
0378nobodyさん
2006/11/12(日) 14:48:08ID:???3000くらいなら速度も気にするほど遅くはならないと思うが、
万超えると微妙になってくるからディレクトリ分けた方がいいだろうね。
0380nobodyさん
2006/11/12(日) 14:56:23ID:Cz0hhElV0381nobodyさん
2006/11/12(日) 15:00:27ID:???0382nobodyさん
2006/11/12(日) 15:02:06ID:???■ このスレッドは過去ログ倉庫に格納されています