【PHP】質問スレッドpart17【php】
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
04/05/17 17:14ID:AT+bUkag・新規質問の方は上げてください。age進行でお願いします。
・質問する際には環境も明記。
・正しい日本語で分かりやすく。
・レスがつかないからって逆切れする厨お断り。
・解決しなくてもこたえてもらったら礼を。
■本家
http://www.php.net/
■日本 PHP ユーザ会
http://www.php.gr.jp/
■PHP マニュアル
http://www.php.net/manual/ja/
■PEAR マニュアル
http://pear.php.net/manual/ja/
過去スレ, 関連スレ等>>2-4
抜けているものがあったら補足願います
0140nobodyさん
04/05/22 14:18ID:???作成中のスクリプトには
error_reporting(E_ALL);
これを最初に入れろ。これだけでエラーはずいぶん探しやすくなる。
上記のならUndefined variable : con とNOTICEエラーが出るし。
0141nobodyさん
04/05/22 14:22ID:???nullの判定ができなくなる
0142141
04/05/22 14:23ID:???簡単なデバッグ作業として入れろってことか
早とちりスマソ・・・
0143nobodyさん
04/05/22 14:28ID:???DB接続>処理A>DBからの戻り値をセット>DB切断
・
別処理
・
DB接続>処理B>DBからの戻り値をセット>DB切断
・
別処理
・
DB接続>処理C>DBからの戻り値をセット>DB切断
この方法と
DB接続>処理A>DBからの戻り値をセット
・
別処理
・
DB接続>処理B>DBからの戻り値をセット
・
別処理
・
DB接続>処理C>DBからの戻り値をセット>DB切断
この場合、どちらがベストなんでしょうか?
0144nobodyさん
04/05/22 14:30ID:???上と下の処理の違いで下の処理では
DB接続>処理A>DBからの戻り値をセット
^^^^^^^
これはナシとみなしてください。
0145nobodyさん
04/05/22 14:36ID:???両方試して時間測ってみろ
何でも人に聞いてばかりだと進歩しねえぞ
0146nobodyさん
04/05/22 14:50ID:???PHPが処理中にユーザがブラウザを閉じて処理を強制的に終了する
これを多用された時、サーバの負担及びDBの安全性はどうなるのか?という疑問が出たから質問したのです。処理速度はダントツに下の方法なのは当たり前です。
ここで質問したかったのは「安全策と処理のバランス」です。
0147nobodyさん
04/05/22 14:56ID:???ていうか、スレ違い
0148nobodyさん
04/05/22 15:06ID:???一応訊いとくけど、上のパターンも下のパターンも
共にひとつのPHPプロセスに処理がまとまってる前提だよな?
単純にはDBのコネクションにはコスト(PCの何らかの資産を使うということ)
が掛かるから頻繁に接続/切断はしない方が良い。それは接続/切断をしない
作りをするとともに、接続を継続しても支障の無い環境も整備するということ。
PHPでは下のような作りをする必要はまず無いが、システムによっては下の
パターンにならざるを得ないケースもある。145に言うとおり自分の頭で
考えられないときは、自分の手で試すことも重要。他人を余り信用はするな。
0149nobodyさん
04/05/22 15:18ID:???仮に一回の処理毎にPHPレベルで切断しても
処理してる途中に切られる可能性もあるわけで
よっぽどクリティカルなシステムでもない限り
そこまで気にしなくていいんじゃないかと
0150nobodyさん
04/05/22 15:21ID:???PHPのプロセスは、HTTPコネクションと連動して動いている訳ではない。
特に切断・終了のタイミングの点で。
データベースのロックの解除処理だけは気をつけろ。
0151150
04/05/22 15:25ID:???ユーザがブラウザでアクセスしてる/してないかが
HTTPコネクションとは必ずしも連動してない。
0153茶番 ◆4JCPHWjCgk
04/05/22 22:27ID:hmZH94bq0155茶番 ◆4JCPHWjCgk
04/05/22 22:38ID:hmZH94bqどうもありがとうございます。
0157Parse error
04/05/22 23:51ID:???えと、bbsに書き込みした方のサイトを「HP」という字ではなく、
home.gif なんかのアイコンにしようと思い、弄くっております。
// フォーマット
if($url) $url = "<a href=\"http://$url\" target=\"_blank\">".HP."</a>";
となっておりましたので、「HP」の所に
<img src="home.gif" width="11" height="17">
と入れましたら、鯖に解析してやらねぇと言われました・・・ (´Д`;)
ぬーんと思い
<img src=\"cup_ra.gif\" width=\"11\" height=\"17\">
などと斬新な事もしてみましたが、やっぱり鯖に ( ´,_ゝ`)プ と言われ・・・
こんな幼稚園質問で申し訳ありませんが、ご教授頂けないものかとお願いに上がりました。
一々ご面倒とも思いますので、参考場所の手引きでも頂ければ幸いなのですが・・・
宜しくお願いいたします。
0158nobodyさん
04/05/22 23:55ID:???つまらんネタまじりじゃなくどうやったかズバリ書けばいいだろうが。
0159nobodyさん
04/05/22 23:58ID:???0160nobodyさん
04/05/22 23:58ID:???if($url) $url = "<a href=\"http://$url\" target=\"_blank\"><img src=\"home.gif\" width=\"11\" height=\"17\"></a>";
0161Parse error
04/05/23 00:08ID:???微妙に惜しい・・・ 座布団半分って感じだったのですね・・・
さっそくやってみます! o(´ω`*) ありがとうございました!
>158
ごめんなさい。 素だった・・・
0162nobodyさん
04/05/23 02:35ID:???0164nobodyさん
04/05/23 03:22ID:XXLnBAc7http://fol.axisz.jp/php/ を HTML4.0 Transitional としてチェックしました。
192個のエラーがありました。このHTMLは -161点です。タグが 18種類 257組使われています。文字コードは Shift JIS のようです。
0165nobodyさん
04/05/23 03:54ID:???0166nobodyさん
04/05/23 04:51ID:???Results
Address: http://fol.axisz.jp/php/
Encoding: shift_jis (detect automatically)
Doctype: HTML 4.0 Transitional (detect automatically)
Errors: 67
http://validator.w3.org/check?uri=http%3A%2F%2Ffol.axisz.jp%2Fphp%2F&charset=shift_jis+%28Japanese%2C+Win%2FMac%29
0167nobodyさん
04/05/23 04:56ID:???http://pc5.2ch.net/test/read.cgi/php/1079460638/
0168nobodyさん
04/05/23 05:29ID:???ファイルの中身を上から順に読んで条件Bに一致するデータを変数xに格納して表示、
ファイルの中身を上から順に読んで条件Cに一致するデータを変数xに格納して表示、
と複数回ループさせるのと、
ファイルの中身を上から順に読んで条件Aに一致するデータを変数aに格納、
条件Bに一致するデータを変数bに格納、
条件Cに一致するデータを変数cに格納、
最後に変数を順に表示
と一回のループで一度にやってしまうのとどっちが処理は速いのでしょうか。
ちなみに読み込むファイルは150行程度、条件は10個程度で変数は1条件あたり30個くらい使うのですが・・・
0171nobodyさん
04/05/23 15:25ID:???インデント幅を 2から 4に変更したいんですが、どうすればいいんでしょうか?
pearのコーディング規約とかも 4 にしなさいみたいなこと書いてあったのに
デフォルトはなんで2になってるんだろう。
「emacs php-mode インデント 幅」でググるとなぜか xyzzyの情報ばかり...
0172171
04/05/23 15:33ID:???に
(defun php-mode-hook ()
(setq tab-width 4
c-basic-offset 4
c-hanging-comment-ender-p nil
indent-tabs-mode
(not
(and (string-match "/\\(PEAR\\|pear\\)/" (buffer-file-name))
(string-match "\.php$" (buffer-file-name))))))
って書いてあるけど、これって書き方の例だよね?
これをそのまま .xemacs.el に書いてもダメだた。
0173nobodyさん
04/05/23 16:56ID:???PHPに関連してるようでスレ違いじゃねえか?
なぜemacsスレで聞かない?
0174nobodyさん
04/05/23 19:03ID:???http://validator.w3.org/check?uri=http%3A%2F%2Fyahoo.co.jp&charset=euc-jp+%28Japanese%2C+Unix%29
0175nobodyさん
04/05/23 20:13ID:???1位〜4位まで1回ずつとったモノであれば配列$resにも1,2,3,4と入るのですが
1位を2回他が2位、3位だとすると配列$resの値が1,2,3となってしまいます。
これが嫌なので配列$resの中に、1から4の中で入っていない数値があった場合に
その順位を$resに、$countに0を入れたいのですが中々うまくゆきません。
どなたかアドバイスお願いします。
何の参考にもなりませんが、スクリプトはこんな感じで書いてしまいました。。
for($i = 1; $i < 5; $i++){
if (in_array($i, $res)== false){
$res[] = $i;
$count[] = 0;
}
}
0176nobodyさん
04/05/23 21:05ID:???画像を作り、その画像をデータベースに
保存しようとしているのですが、
スクリプト上で作った画像の
バイナリデータの取得方法がわかりません。
現在は一度ファイルに書き出して、
それを読み込んでいますが
なんかむなしさを感じます。
いい方法が在れば教えてください。
0177nobodyさん
04/05/23 21:17ID:???順位1〜4と、その順位を取った回数と
"その"というところで関連があるのに
何故2次元配列や順位を添字に使った配列にしないのだ?
現状のやり方だと
>1位を2回他が2位、3位だとすると配列$resの値が
期待する$resは{2,1,1,0}か?
データベースから順位の回数を取得するのはどうやっている?
SQLでcountか?
0179175
04/05/23 22:52ID:???一度ファイルに出力しなきゃだめなのね。。。
0180nobodyさん
04/05/23 22:58ID:???disk_id | shop_id | price | result
--------+---------+-------+--------
D151 | shopC | 1720 | 4
D151 | shopB | 1680 | 3
D151 | shopA | 1620 | 2
D151 | shopD | 1590 | 1
D152 | shopA | 2120 | 4
SQLは
select result, count(result) from disk_DB where shop id = shopA group by result;
てかんじです。
0181nobodyさん
04/05/23 23:34ID:???0182nobodyさん
04/05/23 23:45ID:???0183nobodyさん
04/05/23 23:48ID:???出力制御関数ってバイナリセーフじゃなかったか?
PHPを使うならやって当然だろうから、既に試しているかも知れんが・・・
ob_start()
(例えば)imagepng($image_res)
ob_get_contents()→DBに登録
ob_end_clean()
とかでできんのかな?
>>179
レス番合ってる?
0184nobodyさん
04/05/24 00:05ID:???やっぱり先日の分か。
板違いなので付け加えなかったんだが、そもそもresultをDBに入力するのがおかしい。
priceが変わるとresultも変えなきゃならんので、resultは相関サブクエリで済ますべきだろ。
disk_DB(disk_id,shop_id,price)
SELECT *,(SELECT count(*) AS result FROM disk_DB WHERE disk_id=T1.disk_id AND price<= T1.price) FROM disk_DB AS T1;
で、count値を0にしたい件だが、resultが必ず1から4までどこかにはある。というのであれば、
disk_DB(disk_id,shop_id,price,result) ※SQLが長くなるのでとりあえずresult有りで
SELECT DISTINCT result,COALESCE(T1.cnt,0)AS count FROM disk_DB
LEFT JOIN (SELECT result,count(result)as cnt FROM disk_id WHERE shop_id='shopA' GROUP BY result)AS T1 USING(result);
こんなん浮かびましたw
>>180の例だけだと
result | count
-----+------
1 | 0
2 | 1
3 | 0
4 | 1
0185184
04/05/24 00:13ID:???resultというのがpriceの価格順という意味ならサブクエリで済ますべきと思っているので、
resultが別の意味であるなら、入力(カラム)は必要です。
0186_
04/05/24 00:46ID:???( ゚Д゚) ポカーン
そういう事聞いてるんじゃないだろう。
まぁ >>182 は質問の作り方が悪かったな。
PHP-users にでも投げてみたら?
0187nobodyさん
04/05/24 00:58ID:???ベリーサンクスコ!あと板違いすいません。
作成当初のスタンスはDBに不足点があってもPHPで補えるだろうなと思っていたんですが、実はDBの設計て
とても重要だったんだということを思い知りました。
184さんの意見を参考にDB設計から見直す必要あり、と感じた今日この頃。
てかSQL文なげーw
0188nobodyさん
04/05/24 01:49ID:XP231UgD「0」を文字として認識させることは出来るのでしょうか?
つまり、
-----
if("0"=="000"){} //これをfalse
if("0"=="0"){} //これをTrue
-----
な感じです。
0193nobodyさん
04/05/24 02:23ID:???0194nobodyさん
04/05/24 02:45ID:???俺も簡易的にイメタグやテーブル使ったりするな。
テーブルはブラウザで見え方が違うので厄介ではあるが。
JpGraphは色々あって便利なんだけど、
改造しようとソースに手を出すと嵌るので、
欲しいグラフの種類が少なくて固定できる
(値じゃなくて形がね)のなら、自分で作った方が楽。
HotScriptにもいくつか転がってる。
0195nobodyさん
04/05/24 19:04ID:nTbKpLsJPHP4.3.6からPDFlibのバージョンが5.03(PDF 1.4)にアップグレードしていますが、
以前は、
$enc = mb_internal_encoding();
$txt = chr(254).chr(255).mb_convert_encoding("日本語のしおり","UTF-16",$enc);
pdf_add_bookmark($pdf, $txt, 0, 0);
というコードで日本語のしおりが表示できたのですが、PDFlibが新しくなってからは、
Fatal error: PDFlib error: [2602] PDF_add_bookmark: Code page '932' not supported
というエラーで落ちてしまうようになりました。
Dosプロンプトで作成しているので、usモードにして再作成してみましたが、
状況は変わりませんでした。
対処法をご存知の方、ご教授願えませんでしょうか?
0196gh
04/05/24 20:17ID:???file_get_contents 関数と
file_put_contents 関数は
読み込み・書き出しの時ファイルロックしているのでしょうか?
0197nobodyさん
04/05/24 22:44ID:XP231UgD配列に項目名が入っています。
-----
$array = array("食べ物", "野菜", "ワイルド系", "キャベツ");
-----
で、これを
-----
$array = array(">食べ物", ">>野菜", ">>>ワイルド系", ">>>>キャベツ");
-----
と、項目名の前に、「>」を"配列番号+1"個付加したいのですが、
どのようにすればいいのでしょう。
0198nobodyさん
04/05/24 22:54ID:???項目名の前に、「>」を"配列番号+1"個付加するようなスクリプトを書いてください。
制御構造を使っても、配列関数を使っても、好きな方法で構いません。
0199nobodyさん
04/05/24 23:04ID:???for ( $i=0; $i<count($arr); $i++ ) {
$arr[$i] = str_repeat('>', $i+1).$arr[$i];
}
print_r($arr);
0200nobodyさん
04/05/24 23:31ID:???ありがとうございます。
>>198さん
str_repeatという存在を知りませんでした。
というか、PHP関数の全てを把握し切れていません。
やはり、覚えるしかないのでしょうか?(そんな気がする)
0201nobodyさん
04/05/24 23:39ID:???別に、str_repeat使わずとも簡単に出来るし、
あれだけ整備されたマニュアルが提供されているのだから、
経験積めば意図する関数があるかどうか雰囲気的にわかる。
0203カポコン
04/05/25 02:21ID:???スクリプトじゃない。本物ならこう書くだろう。
<?php
$slash = "<";
$str = $slash;
$arr = array("食べ物", "野菜", "ワイルド系", "キャベツ");
foreach($arr as $key => $value):
$arr[$key] = $str.$value;
$str .= $slash;
endforeach;
print_r($arr);
?>
この方がPHPらしくないか?
つーか高速だし分かりやすい。
経験よりも才能。いじょ。
0204nobodyさん
04/05/25 02:31ID:???PHPで配列を扱う場合はfor < while <foreach の順で速く動作する。
更に関数を使わず文字列結合の演算のみで処理を終わらせている点。
点数付けると100点満点だわ。
しかも最後に大事なのは才能っていってる部分が
カポコンファンの漏れにはたまらない。
これならstr_repeatがサポートされてないPHP3でも動作する罠、
さすがは神。ところで神様とこのHP最近更新滞ってるから
こんなところでパンピー相手せずに速く更新きぼんして下さい!
0205nobodyさん
04/05/25 02:32ID:???0206nobodyさん
04/05/25 02:50ID:???でもカポコンが頭がいいのはPHP理解した人間になら分かる。
※関数を使うプログラムより関数を使わないプログラムの方が優秀である。
これ定説ね。天才かどうかは微妙だけど。早速HP見てきます。
0207nobodyさん
04/05/25 02:55ID:???for($i=0;$i<count($arr);$i++){
$leftarrow.='>';
$arr[$i]=$leftarrow.$arr[$i];
}
print_r($arr);
0208カポコン
04/05/25 02:57ID:???はいはい才能乏しいですよ。
じゃー僕以上のスクリプト書いてもらえます?
自分には才能以外の要素は無いんで。
199にアドバイス付け加えるんなら、テストに使うなら
print_rよりvar_dumpを使う事をオススメしとこう!
0209207
04/05/25 02:57ID:???0210nobodyさん
04/05/25 03:02ID:???<?php
$leftarrow = '>';
$str = $leftarrow;
$arr = array("食べ物", "野菜", "ワイルド系", "キャベツ");
foreach($arr as $key => $value):
$arr[$key] = $str.$value;
$str .= $leftarrow;
endforeach;
var_dump($arr);
?>
0213nobodyさん
04/05/25 03:28ID:???ないと断言しておく
0214nobodyさん
04/05/25 03:34ID:???0215nobodyさん
04/05/25 05:45ID:???質問どうぞ
0216nobodyさん
04/05/25 08:39ID:???反論は要らないんでカボコンさんとやらは巣に戻って下さい
0217nobodyさん
04/05/25 09:17ID:???0218404.HDML ◆StMXML.EXE
04/05/25 09:19ID:???>PHPで配列を扱う場合はfor < while <foreach の順で速く動作する。
これってマジですか?
0219nobodyさん
04/05/25 09:47ID:???whileはループ時に条件判定
foreachはループ時に要素内のポインタ移動
下に行く程ループ時の処理が軽いって事じゃねーの?
0220404.HDML ◆StMXML.EXE
04/05/25 10:00ID:???成程、そういう事なのですね。今までwhile優先で時々for、という感じでこの2点のみを
使ってて、正味foreachの存在自体を忘れてました。。
0221nobodyさん
04/05/25 11:06ID:???つーか、連想配列の場合だとforeachを使わんと何かと面倒じゃね。
0222nobodyさん
04/05/25 11:30ID:???0223nobodyさん
04/05/25 11:32ID:???0224nobodyさん
04/05/25 11:33ID:???俺はCからプログラミング覚えたからfor使ってる。
0225404.HDML ◆StMXML.EXE
04/05/25 11:55ID:???while(list($name,$value) = each($array));
当方、いつもこんな書き方ばかりしてたんですよ。
whileに較べてforは遅い、とだけ小耳に入れた時に「じゃぁforeachも遅いのかな?」と
勝手に思い込んでいた節が有りまして。
0226nobodyさん
04/05/25 12:06ID:???俺はCの標準関数っぽいのが揃ってたからPHPを使い出したという経緯があるから
Cライクな記述をしてる
0228nobodyさん
04/05/25 12:19ID:???気になるやつはPHPのソース追うなり
ベンチ取るなり気の済むまでやってくれ
重箱の隅穿り返すような論議は他で頼む
0229nobodyさん
04/05/25 12:30ID:???ttp://jp.php.net/manual/ja/function.str-repeat.php
確かにstr_repeat()はPHP3では動作せんから、>>203はPHP3でも動くかと思ったけど
ttp://jp.php.net/manual/ja/control-structures.foreach.php
・・・・これ釣(ry
0230nobodyさん
04/05/25 12:35ID:???いいじゃねぇかYO
処理速度(効率)やコードの見易さなど、、
十人十色いろいろあって宗教じみた話になるかも知れんが、
他の人のやり方を聞くのも、たまにはあっていい。
0231nobodyさん
04/05/25 13:27ID:???複数人が関わる開発じゃなければ自分に合った書き方がベスト
0232nobodyさん
04/05/25 14:42ID:???公式ページのマニュアルかなにかに書いてあったような気がする。
だから俺は for で回してる。
0233nobodyさん
04/05/25 14:56ID:???str_repeatが採用された細かいバージョンをキボン。
0234nobodyさん
04/05/25 14:56ID:???好きに書けばいい
0236nobodyさん
04/05/25 15:11ID:???>whileはループ時に条件判定
>foreachはループ時に要素内のポインタ移動
で処理が進むならforeach文の方が速いだろ。
配列扱うのにループのたびに初期化なんてしてたら効率悪すぎ。
0237nobodyさん
04/05/25 15:15ID:???試してみると大分違う。
require_once 'Benchmark/Timer.php';
$leftarrow = '>';
$str1 = $str2 = $str3 = $leftarrow;
$arr1 = $arr2 = $arr3 = array();
for ($i = 0; $i < 2000; ++$i) {
$arr1[] = 'a' . str_pad($i, 5, '0', STR_PAD_LEFT);
$arr2[] = 'a' . str_pad($i, 5, '0', STR_PAD_LEFT);
$arr3[] = 'a' . str_pad($i, 5, '0', STR_PAD_LEFT);
}
$timer =& new Benchmark_Timer();
$timer->start();
$timer->setMarker("Benchmark for 'foreach'");
foreach ($arr1 as $key => $value) {
$arr1[$key] = $str1.$value;
$str1 .= $leftarrow;
}
$timer->setMarker("Benchmark for 'for'");
$max = count($arr2);
for ($i = 0; $i < $max; ++$i) {
$arr2[$i] = $str2.$arr2[$i];
$str2 .= $leftarrow;
}
0238nobodyさん
04/05/25 15:15ID:???$timer->setMarker("Benchmark for 'while--list-each'");
while (list($key, $value) = each($arr3)) {
$arr3[$key] = $str3.$value;
$str3 .= $leftarrow;
}
$timer->stop();
echo $timer->getOutput();
結果
--------------------------------------------------------------
marker time index ex time perct
--------------------------------------------------------------
Start 1085465264.67439000 - 0.00%
--------------------------------------------------------------
'foreach' 1085465264.67453300 0.00014281272888184 0.01%
--------------------------------------------------------------
'for' 1085465264.70273000 0.028197050094604 2.24%
--------------------------------------------------------------
'while--list-each' 1085465265.05475400 0.35202407836914 27.93%
--------------------------------------------------------------
Stop 1085465265.93488100 0.880126953125 69.82%
--------------------------------------------------------------
total - 1.2604908943176
0239nobodyさん
04/05/25 15:19ID:???--------------------------------------------------------------
ずれてたので
marker time index ex time perct
--------------------------------------------------------------
Start 1085465264.67439000 - 0.00%
--------------------------------------------------------------
'foreach' 1085465264.67453300 0.00014281272888184 0.01%
--------------------------------------------------------------
'for' 1085465264.70273000 0.028197050094604 2.24%
--------------------------------------------------------------
'while--list-each' 1085465265.05475400 0.35202407836914 27.93%
--------------------------------------------------------------
Stop 1085465265.93488100 0.880126953125 69.82%
--------------------------------------------------------------
total - 1.2604908943176 100.00%
--------------------------------------------------------------
■ このスレッドは過去ログ倉庫に格納されています