【PHP】下らねぇ質問はID出して書き込みやがれ 113
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2011/11/29(火) 19:55:27.17ID:???過去スレ、関連スレ、FAQなどは>>2-10辺り
次スレは>>980が立てる。10分以内に立たない場合、宣言してから立てたい人が立てること。
◆前スレ
【PHP】下らねぇ質問はID出して書き込みやがれ 112
http://hibari.2ch.net/test/read.cgi/php/1320005469/
◆質問用テンプレ
【OS名】CentOS
【PHPのバージョン】5.3
【連携ソフトウェア】MySQL ImageMagick
【質問内容】
◆質問する時の注意
・ スレを上げて自分のIDを表示させること。(メール欄に何も記述しない。専ブラのsageチェックを外す)
・ 己の行った操作、変更などを詳しく明記すること。
・ エラーメッセージはそのまま表記すること。「エラーが出ます」だけでは回答不可。
・ 質問者として、態度をわきまえること。
・ 事前に関連リンクの公式マニュアル、リファレンス本くらいはちゃんと目を通しておくこと。
(PHPで最良の教本はこの公式マニュアル。市販の書籍は嘘が多いので鵜呑みにしない。)
◆質問後の注意
・2回目以降は最初に質問した際のレス番号を入れて、偽者防止に必ずIDを表示させること。
・解決しなくても回答をもらった場合はお礼を言うこと。
(荒らし、煽りは除く。煽られたときも、無闇に反論せずスルーすること。)
◆回答者への注意
・誰にレスしているのか分からないと困るので、>>(アンカー)をつけて回答すること。
【その他諸注意】
・SQL・正規表現・PEAR・テンプレート(Smarty等)・フレームワークは各該当スレへ
0071nobodyさん
2011/12/02(金) 00:57:35.23ID:???2バイト目が5C等になりうることによる問題
Shift_JISでは、「ソ」「噂」など一部の字の2バイト目に、5C16(Shift_JISでは¥記号、ASCIIなどではバックスラッシュ)を使用している。
Shift_JIS - Wikipedia
0072nobodyさん
2011/12/02(金) 02:38:39.13ID:???それはわかってそうじゃん
>>69
それでいいと思う
>>70
改行コードを消そうとはしてないようだよ
>>71
それに出くわしてはなさそうだね
007452
2011/12/02(金) 08:05:15.26ID:sTn2jPiz0076nobodyさん
2011/12/02(金) 12:51:07.78ID:???44才魔法使いです
0080nobodyさん
2011/12/03(土) 09:45:28.38ID:FACCXriu0082nobodyさん
2011/12/03(土) 15:33:03.81ID:50KGadHwfunction _cleanString($string) {
$diac =
/* A */ chr(192).chr(193).chr(194).chr(195).chr(196).chr(197).
/* a */ chr(224).chr(225).chr(226).chr(227).chr(228).chr(229).
/* O */ chr(210).chr(211).chr(212).chr(213).chr(214).chr(216).
/* o */ chr(242).chr(243).chr(244).chr(245).chr(246).chr(248).
/* E */ chr(200).chr(201).chr(202).chr(203).
/* e */ chr(232).chr(233).chr(234).chr(235).
/* Cc */ chr(199).chr(231).
/* I */ chr(204).chr(205).chr(206).chr(207).
/* i */ chr(236).chr(237).chr(238).chr(239).
/* U */ chr(217).chr(218).chr(219).chr(220).
/* u */ chr(249).chr(250).chr(251).chr(252).
/* yNn */ chr(255).chr(209).chr(241);
return strtolower(strtr($string, $diac, 'AAAAAAaaaaaaOOOOOOooooooEEEEeeeeCcIIIIiiiiUUUUuuuuyNn'));
}
}
というのが外国のライブラリの中にあったのですが、何をやっているのか意味が分かりません
最後のAAA〜は何を意味しているのでしょうか?
008366
2011/12/03(土) 17:05:05.70ID:???どうにも難しいみたいですね。
\を\自体と\xの2パターンあるのが難しい理由みたいです。
結局、最初にAAの様なキーを作って
改行→AA1、タブ→AA2・・としました。
もちろん、最初に変換対象の文字にAAは無い事を調べた上で。
全パターンのキーがあってキーの作成が出来なかったら破綻しますけど・・・
0084nobodyさん
2011/12/03(土) 17:22:33.21ID:???$string 内にあるアクセント付きアルファベット($diac) を
アクセントの無いアルファベット('AAAAAA〜')に strtr して、strtolower してる
0085nobodyさん
2011/12/03(土) 17:30:37.82ID:UqIE+ehV=& ってどういう意味ですか?
0086nobodyさん
2011/12/03(土) 18:18:59.34ID:50KGadHwこれは自分たちのような日本語を使う場合でも必要な処理でしょうか?
外国だから必要なのかなと思いまして
見たことがなかったので
0087nobodyさん
2011/12/03(土) 21:52:27.47ID:AR407ZHO知っていらっしゃる方がいたら教えてほしいです。
0088nobodyさん
2011/12/03(土) 21:59:06.19ID:zvnHXPsGモニタではどのように表示されるのでしょうか?
0089nobodyさん
2011/12/03(土) 23:36:02.97ID:???作り方次第。PHP関係ない
>>87
検索して調べられないなら知らなくていいんだと思う。
>>86
いらない
>>85
http://jp2.php.net/manual/ja/language.references.whatdo.php
>>83
えー
009066
2011/12/03(土) 23:53:42.79ID:???2つのプロセスを走らせて、プロセスAで
$fp=fopen("A.txt","r+");
flock($fp,LOCK_SH);
ftruncate($fp,0);//←ここでファイルサイズが0になる
fseek($fp,0);
fwrite($fp,"あいうえお");
fclose($fp);
と言う処理をusleep(200000);で0.2秒sleepさせながら実行し
もう片方のプロセスBは
$fp=fopen("A.txt","r+");
fgets($fp);
fclose($fp);
という普通のファイル読取処理を0.1秒間隔で実行し、fopenが成功したか、fgetsが成功したかを順次表示させています
clearstatcacheは毎回しています。
プロセスAだけであればあいうえおという文章が書き込まれるのですが
プロセスBを同時に走らせるとプロセスAのfwriteで0が返ってきて書き込みに失敗し、ファイルサイズが0になってしまいます。
この原因も知りたいのですが、ファイルロックについて詳しく知りたいです。
LOCK_SH、LOCK_EXそれぞれの場合、そのロックを行い
別プロセスでfopen、fgets、fclose、filesizeの様なファイルに関係有る処理を行った場合、どうなるのが仕様なのでしょうか。
ロックされているファイルに対してプロセスBでfopenを行った場合、プロセスAでロックが解除されるまでプロセスBは待機されるのかと思ったのですが
そうはなりませんでした。
0091nobodyさん
2011/12/03(土) 23:54:04.67ID:???0092nobodyさん
2011/12/04(日) 00:03:25.67ID:???http://php.net/manual/ja/function.flock.php
まず、正しい使い方と注意事項読んでね。
でも、いろいろ検索するとこれじゃ駄目だって分かると思うよ。
0093nobodyさん
2011/12/04(日) 00:59:35.07ID:zQYW8hqE例えば、簡単な例で言えば高校数学の組み合わせで出てくるコンビネーション(C)等を表すPHP関数はマニュアルを見てもないようです
他にも、Σや微分・積分など(まぁ、微分・積分は自分は必要はないですが)
これらのような方程式などを扱うためのライブラリとか、アルゴリズムの載ったサイトとかありましたら教えていただきたいのですが
ある数式をPHPで・・・と思ったのですが、その最初の数式の方程式の所で分からなくなりまして
0094nobodyさん
2011/12/04(日) 01:15:52.07ID:???ここで聞くなら、その数式を書かなきゃ。
0096nobodyさん
2011/12/04(日) 01:48:20.62ID:zQYW8hqEまぁ、コンビネーションなどは確かにすぐではありますが、数式の例がパッと浮かびませんでして上記のようなものを適当に書いてみました
すみません
自分のやりたい数式は統計、分析系でしてΣ、条件付確率を多用します
一からそういった数式のアルゴリズムを学習して、何度の高いものに挑戦しようかと思いまして
ライブラリに関しましても、そのまま利用するよりも中身をハックしようと考えていました
単純ベイズとか、ピアソンの相関係数とかやってみたいと思っています
0100nobodyさん
2011/12/04(日) 02:41:43.64ID:???0101nobodyさん
2011/12/04(日) 03:05:45.07ID:UvLgiAdt【PHPのバージョン】5.2
Digest認証をしてるディレクトリ内にあるPHPスクリプトから、
同じディレクトリ内のページにfile_get_contentsすると失敗する。
file_get_contentsで認証できませんか?
0102nobodyさん
2011/12/04(日) 11:16:41.58ID:ZwuGc3Sg【PHPのバージョン】5.3.5
【連携ソフトウェア】MySQL
【質問内容】
海外サーバ(ローカルタイムは米国西海岸)を使っていて、
MySQLに時刻データ(日本時間)を保存するとき、どの方法がスマートですか?
データ更新時刻を保存します。
1. CURRENT_TIMESTAMPで西海岸時間を保存して、表示で日本時間を作る
2. time()でUNIX時間をINTで保存して、表示で日本時間をつくる
3. 日本時間を作ってDATETIME形式で保存
4. その他
今は3で日本時間を作ってDATETIME形式で保存するように書いてみたのですが、
UNIX時間の方が処理しやすいことが多いかと思います。
DATETIME形式だとSELECTすればそのまま読めるので便利なのは間違いないですが。
皆さんはどのようにしていますか?
0104nobodyさん
2011/12/04(日) 14:00:18.40ID:uNIlr6eZcase 1:
処理
case 1:
case 2:
処理
break;
・・・
の処理で、下の処理を先にしなければならないとき、
case 1:
case 2:
処理
case 1:
処理
break;
・・・
にすると、case2は最後まで条件文をたどることになりますよね?
回避策としては、
case 1:
case 2:
処理
case 2:
break;
case 1:
処理
break;
・・・
ぐらいしか思い浮かばないのですが、冗長な気もします。
何か良いアドバイスをください。
0106nobodyさん
2011/12/04(日) 14:26:45.63ID:ZwuGc3SgMySQLに接続のたびにタイムゾーンを変更する必要があるので、
変更をし忘れると時刻の整合性がとれず、えらいことになるので
それは避けたいところです。
0107nobodyさん
2011/12/04(日) 15:25:26.81ID:DlY6x1ss↓JSON形式?がうまく変換できません、誰か教えて!
<?php
$url = "http://capi1.cpf.yahoo.co.jp/camp/v1/list/?prop=1&uri=http%3A%2F%2Fheadlines.yahoo.co.jp%2Fhl%3Fa%3D20111203-00000051-jij-soci";
$file = file_get_contents($url);
echo json_decode($file);
?>
0108nobodyさん
2011/12/04(日) 15:30:49.25ID:???先頭の「listhandler(」と末尾の「)」を削ってからjson_decode()に渡してみては?
0109nobodyさん
2011/12/04(日) 16:16:27.90ID:DlY6x1ss0110nobodyさん
2011/12/04(日) 16:20:58.73ID:f63/zsl+オープンできないんですが。Windowsです。
0111nobodyさん
2011/12/04(日) 16:24:32.79ID:f63/zsl+ぼくがPDOを採用しなかったわけ(Shift_JISによるSQLインジェクション)
PHPのデータベース・アクセス・ライブラリPDOは、DB接続時の文字エンコーディング指定ができないため、文字エンコーディングの選択によっては、プレースホルダを使っていてもSQLインジェクション脆弱性が発生します。
http://www.tokumaru.org/d/20100701.html
phpファイルはUTF-8で保存して、設置パスに日本語が含まれないように注意(DBファイルが開けない)。
http://www.tumblr.com/tagged/pdo?before=1321315724
0113nobodyさん
2011/12/04(日) 17:12:55.32ID:???TIMESTAMPもDATEも現地時間で保存なんかしない
タイムゾーンを設定するのはクライアント側の仕事
接続する度に SET time_zone = '+9:00'; なり発行しなさい
0114104
2011/12/04(日) 17:17:45.05ID:???スレ汚しすみません
0116nobodyさん
2011/12/04(日) 18:09:00.78ID:???0117nobodyさん
2011/12/04(日) 22:01:35.78ID:???case 1:
処理A
処理B
break;
case 2:
処理A
break;
を無理やりフォールスルーで何とかしたいって話だろ。
アドバイスとしては「やめてください」。
0118nobodyさん
2011/12/04(日) 22:02:39.93ID:???部下がこれどうしますって言ってきたらやめろで終わりだけどさ。
0119nobodyさん
2011/12/04(日) 22:46:22.38ID:???既存のコードをあまり変えたくないなら>>104でもいいんでないの
0120nobodyさん
2011/12/05(月) 01:33:15.00ID:???【MySQL】下らねぇ質問はID出して書き込みやがれ 2
http://hibari.2ch.net/test/read.cgi/db/1322402682/
DB板にココをパクッたのがあったwww
0121nobodyさん
2011/12/05(月) 02:49:55.96ID:???0122nobodyさん
2011/12/05(月) 03:36:31.20ID:???0123nobodyさん
2011/12/05(月) 04:13:37.79ID:PhZ7RtX8これをエレガントにする方法ってありますか?
function __call( $name, $arguments ) {
if( method_exists( $this->obj, $name ) ){
return $this->obj->{$name}( @$arguments[0], @$arguments[1], @$arguments[2], @$arguments[3], @$arguments[4]);
}else{
parent::__call( $name, $arguments );
}
}
0124nobodyさん
2011/12/05(月) 05:20:52.70ID:???呼び出すときにそのobjがどんなメソッドと引数を持っているか
推測しないといけない設計はあまり好まず…そこは素直にクラス作りんしゃいに一票。
0125nobodyさん
2011/12/05(月) 05:52:43.56ID:Df4UWWf4ネット上のオセロの対戦サイトっぽいの作ろうと思っています。
そこで、通信のやり方が分かりません。
不特定多数の人がそのサイトにログインするまではいいのですが、対戦は1対1なので、
対戦が始まったらその二人の間でのみ通信が行われないといけないのですが、
そのような通信は一体どうやればいいのでしょうか?
オセロのプログラム、描画はJavaScriptで書いています。
0126nobodyさん
2011/12/05(月) 06:04:21.68ID:???0127nobodyさん
2011/12/05(月) 06:08:30.42ID:4I6BeXxuソートに使用するorder byやdescやascを、
バインドしてもうまく働きません。
$sort_by = "hoge"; //実際は外部から取る値
$is_desc = true; //外部から指定
$stmt=$dbh->prepare("select * from t where 1 order by :sort :which");
$stmt->bindValue(":sort", $sort_by);
if ($is_desc) {
$stmt->bindValue(":which", "desc");
} else {
$stmt->bindValue(":which", "asc");
}
$stmt->execute();
これは内部で
select * from t where 1 order by hoge desc
ではなく、
select * from t where 1 order by "hoge" "desc"
となってるからなのは分かるのですが、
こういうケースの場合はどうしたらいいのでしょうか?
よろしくお願いします。
0129nobodyさん
2011/12/05(月) 06:25:04.96ID:???サーバは送られてきたクッキーとセッションを照合しながら二人を追う
現在のゲームの進行状況をクライアント(2人)に返す
返した結果によってクライアント画面に反映する
この繰り返し
片方側からのリクエストが途絶えて
片方からのリクエストを3回連続で受け取った場合
もう片方はゲームを途中でやめた判定する
いわゆるポーリングという技法
実装が簡単だがよりリアルタイムに近づけるにはインターバルを1秒未満にしなくてはならず
ゲーム中はF5アタックをしてるようなものなのでレンタルサーバではやってはいけない
0130nobodyさん
2011/12/05(月) 06:39:35.66ID:???成る程、分かりやすいです。
送られてくるクッキーとセッションで送信者が識別できるのなら実現できそうです。
やっぱりいろいろと問題もあって、難しそうですね。
レンタルサーバーでもやり方次第でなんとかなると思ったので、いろいろ試して
みようと思います。
とにかく簡単なプロトタイプを作って動かすまではやってみます。
0131127
2011/12/05(月) 07:25:44.75ID:4I6BeXxuプリペアドステートメントは使わず、PDO::query()+PDO::quote()で行うしかないんでしょうか?
なんかベストな解決方法を知っていたらお願いします。
0132nobodyさん
2011/12/05(月) 13:11:31.92ID:???call_user_func_array(array($this->obj, $name), $arguments);
>>131
ORDER BY句は自力で組み立てて
そっから PDO#prepare() に渡す
ちなみにバインドできるのはリテラル値だけ
0133nobodyさん
2011/12/05(月) 14:23:18.46ID:???http://stackoverflow.com/questions/8343399/calling-a-function-with-explicit-parameters-vs-call-user-func-array
横からだけど
引数が5つ以上になると call_user_func_array のほうが早くなるんだな…
それより短い場合は短ければ短いほど不利で
引数が一つだけ取るようなケースだと、二倍くらい遅くなると。勉強になりました感謝。
0134nobodyさん
2011/12/05(月) 16:17:45.57ID:uI9LFaIuまずはソースを貼ります。
$_query =
"select F.seq_user, U.seq, COUNT(F.seq_user) AS total
FROM tbFavorites AS F
LEFT JOIN tbUser AS U ON F.seq_user = U.seq
group by F.seq_user
order by total desc limit 25";
if ($result = $mysqli->query($_query)) {
if ($result->num_rows > 0) {
$userranking = array();
while ($row = $result->fetch_array(MYSQLI_ASSOC)) {
$userranking[] = $row;
}
$result->close();
}
}
for($i=0;$i<25; $i++){
$_query =
"select COUNT(F.seq_user) AS total
FROM tbFavorites2 AS F
WHERE F.seq_user = ".$userranking[$i]['seq']."
limit 1";
if ($result = $mysqli->query($_query)) {
if ($result->num_rows > 0) {
$row = $result->fetch_array(MYSQLI_ASSOC);
$userranking[$i]['total']= $userranking[$i]['total'] + $row['total'];
$result->close();
}
}
}
$smarty->assign('userranking', $userranking);
0135nobodyさん
2011/12/05(月) 16:24:09.16ID:uI9LFaIutbFavorites(商品ジャンルA)、tbFavorites2(商品ジャンルB)はユーザが二つの種類の商品をお気に入り
に登録するためのtableです。
今どのユーザがたくさんお気に入り登録したかをランキング形式で出そうとしています。
しかし134のソースではジャンルAでまずランキング上位25人を出してしまっています。
本当ならジャンルAとジャンルBの合計値を出したあとに上位25人を出したいのですが
うまいやり方が思いつきません。どなたかお知恵をお貸しください。
0136nobodyさん
2011/12/05(月) 16:54:20.79ID:???全件とって自分でがんばるかどっちか
0137nobodyさん
2011/12/05(月) 16:56:30.82ID:uI9LFaIuうまくいきません。JOINとUNIONで試してみたのですが
全然期待通りの値にならないのです。。。
0138nobodyさん
2011/12/05(月) 17:43:15.14ID:???テーブル構造は?
DB板のが答え速そうだな
0139nobodyさん
2011/12/05(月) 18:24:42.35ID:???UNIONでできなかったってのが、UNION ALLでダメだったのかどうかにもよるけど。
select count(seq_user) as total from (
select seq_user from tbFavorites
union all
select seq_user from tbFavorites2
)
group by seq_user
order by total desc limit 25
あと、tbUserと結合する意味がなさそう。
0140nobodyさん
2011/12/05(月) 18:25:52.85ID:???0141nobodyさん
2011/12/05(月) 19:07:21.50ID:wb46KamGセキュリティ的に問題ないんですか?負荷も掛かるだろうし。
0142nobodyさん
2011/12/05(月) 19:08:59.07ID:???0143nobodyさん
2011/12/05(月) 21:33:08.80ID:???0144nobodyさん
2011/12/05(月) 21:48:37.75ID:FlRxYHcsマニュアル見たところ無いようなのですが
statsは全然まとめられていないながらも、あるようですが
0145nobodyさん
2011/12/05(月) 23:53:12.26ID:???¥マークはどういう時に使うのでしょうか?
例
class Model_Crud extends \Model implements \Iterator
0147nobodyさん
2011/12/06(火) 00:12:06.88ID:???0148nobodyさん
2011/12/06(火) 00:23:22.19ID:???0150nobodyさん
2011/12/06(火) 12:02:11.48ID:bGnivCFj携帯で、あるページにアクセスした時、その携帯のメーラーを立ち上げることってできるでしょうか?
どうやったらいいでしょうか
PHP5を使っています
0151nobodyさん
2011/12/06(火) 12:02:28.57ID:OdBx5Qxgありがとうございます。おかげさまでできました。
お礼が遅くなりました><
原因はgroup byがちゃんと使えてませんでした。
0153nobodyさん
2011/12/06(火) 13:09:00.01ID:???0154150
2011/12/06(火) 13:09:11.32ID:bGnivCFjレスどうもです。そういうことではないんですよ
1)リンクを踏む
2)ページAに遷移してDB処理、終わったらページBにリダイレクト
3)ページBに移動したら自動的にメーラーが立ち上がる
というのをイメージしています
ページBにリダイレクトしなくても、ページAでのDB処理が終わったあとに
何らかの方法でメーラ起動できればそれでいいんですが…
header関数とかの問題かなと思ったんですが、ヒントが見つからない状況です
0155150
2011/12/06(火) 13:10:07.14ID:bGnivCFjそんなことやりませんよw
0157nobodyさん
2011/12/06(火) 13:38:57.60ID:???0158nobodyさん
2011/12/06(火) 13:39:18.56ID:???0159nobodyさん
2011/12/06(火) 13:56:53.94ID:???メーラーが勝手に開くのは怖いしウザい
0160nobodyさん
2011/12/06(火) 14:10:13.41ID:???避けるべき実装
0161nobodyさん
2011/12/06(火) 14:12:49.28ID:16sWocHtメーラーが勝手に開くリンクからメール送ったことってほとんどないな。
0162150
2011/12/06(火) 14:19:00.41ID:bGnivCFjこんな簡単なんですか
すみませんでした、試してみます。ありがとうございました
>>159-161
ご意見どうもです
説明不足でしたが>>154の「1)リンクを踏む」のリンクに「メールを送る」と書くつもりです
多分大丈夫かと…
ありがとうございました
0164nobodyさん
2011/12/06(火) 16:56:44.79ID:???gmail しか使ってなかったり linux のクライアントだとメーラー設定してなかったり
あるのでテキスト直書きで、テキスト@hoge.com 件名は○○○で送ってください
とか併記しておいて欲しいと思う吉宗であった…
0165nobodyさん
2011/12/06(火) 20:56:46.07ID:16sWocHtURLはhoge.phpのまま変わらないというのがありますが、
これはPOSTメソッドで同じURLにPOSTして、ifなどで条件分岐して
表示を変えているんでしょうか?
この手法は一般的ですか?
トークンによるCSRF対策も問題なく動作しますか?
0167nobodyさん
2011/12/06(火) 21:00:57.91ID:16sWocHtありがとうございました。
cart1.php
↓
cart2.php
↓
cart3.php
とか書いていたのですが、ダサイので書き直します。
0168nobodyさん
2011/12/06(火) 22:44:11.20ID:QHQ8UGsv【PHPのバージョン】5.3
お世話になります。セッションについて勉強中です。
[A]というサイト上にあるログイン用のプログラムで
session_name(セッション名);
セッション名を設定した上でセッション利用
cookieにはランダム文字列のセッションIDが記録されます。
このあと、全く別サーバー・別ドメイン上にあるPHPで
echo $_COOKIE["セッション名"];
と書いてアクセスすると
[A]サイトのセッションID(ランダム文字列)が丸見えになっています。
1.悪意のある人が$_COOKIE["セッション名"];でセッションIDを抜き出す
2.偽装した上ですぐさま[A]サイトにアクセス
3.ログイン状態
となってしまうのではと想像しているのですが
何か良い対策は無いでしょうか?
セッションに対する自分の認識自体が間違っていたら面目ございません。
■ このスレッドは過去ログ倉庫に格納されています