【PHP】下らねぇ質問はここに書き込みやがれ [転載禁止]©2ch.net
1 :
デフォルトの名無しさん:
2 :
デフォルトの名無しさん:2014/12/16(火) 23:57:45.49 ID:if+akcCT
Webprogにスレあるのに重複か
重複の糞スレ終了
◆質問用テンプレ
【OS名】CentOS
【PHPのバージョン】5.5
【連携ソフトウェア】MySQL ImageMagick
【質問内容】
◆質問する時の注意
・ 己の行った操作、変更などを詳しく明記すること。
・ エラーメッセージはそのまま表記すること。「エラーが出ます」だけでは回答不可。
・ 質問者として、態度をわきまえること。
・ 事前に関連リンクの公式マニュアル、リファレンス本くらいはちゃんと目を通しておくこと。
◆質問後の注意
・解決しなくても回答をもらった場合はお礼を言うこと。
(荒らし、煽りは除く。煽られたときも、無闇に反論せずスルーすること。)
◆回答者への注意
・誰にレスしているのか分からないと困るので、>>(アンカー)をつけて回答すること。
【その他諸注意】
・SQL・正規表現・PEAR・テンプレート(Smarty等)・フレームワークは各該当スレへ
おつ
cliスレだろ?
あのレスの内容の90%はまったくPHPと関係のないスレのことか
IDなしだと荒らされるので避難してきました
お前のことなんて興味ないし
質問スレでオナニー披露しないでいいから
20代前半から中盤に限ってこういう権利関係に疎い奴がいるもんだ
IDが出ると見やすくていいね
荒らす奴もNGしやすいし、何より質問者の成りすましが出来なくなるからね。良かったw
荒らしは頑張って書き込むたびにID変えてね!
巣に帰れよ
>>9 前もその人のURL貼られてたな。宣伝か何か?
いつものキチガイキタ━━━━(゚∀゚)━━━━!!
昔話おじさんキター
天丼キター!でもその天丼腐ってる!!
おいどうしたキチガイ?
WebProgみたいに恥ずかしい連投しろよ?
コメントについて、# 記号があまり使われていないのは
何か理由があるのですか?
24 :
デフォルトの名無しさん:2014/12/21(日) 12:46:31.09 ID:oet6k+Aq
25 :
デフォルトの名無しさん:2014/12/21(日) 12:47:09.85 ID:oet6k+Aq
(続きです)ZenCartは、カートに商品を入れる→配送方法を選択して送料を決める→カートの商品と送料を合計するという流れです。
送料はshippingモジュールというPHPファイルで決定していて、プラグインを適用すると、デフォルトで入っているzone_rates.phpのクローンを作ることができます。
zone_ratesとは国別送料のことなんですが、クローンをつくることで、デフォルトの状態では1つしか設定できなかった国別送料の選択肢を増やせるのです。
ちなみにオリジナルの「zone_rates.php」に加え「zone_rates_1.php」から「zone_rates_4.php」というかたちで4つ追加できます。
私の意図としてはEMS、書留、普通から選んでもらおうとしたのです。
ここまでは何てことない作業でした。吐き出す文字や、それぞれの送料の設定も何の問題もなくできました。
問題はこのあとで、いざカートで送料を適用しようとすると、クローンで作成した送料が合計金額に反映されません。
クローンで作成したどれを選択しても、オリジナルであるzone_rates.phpで決定した金額が合計されてしまうのです。
試しに送料の選択肢にデフォルトで入っている固定送料を選んでみたのですが、この場合はうまく反映されます。
つまり、
「デフォルトで入っている他の送料のPHPファイル」+「オリジナルのzone_rates.php」の組み合わせ→○問題なし。どちらを選んでもきちんと合計に反映される。
「オリジナルのzone_rates.php」+「クローンであるzone_rates_#.php」→×クローンのどれを選択しても「オリジナルのzone_rates.php」での送料が合計に反映される。
「デフォルトで入っている他の送料のPHPファイル」+「オリジナルのzone_rates.php」+「クローンであるzone_rates_#.php」→×デフォルト分とオリジナルは反映されるけど、クローン分は選択できても反映されない。
ここからは推測です。
26 :
デフォルトの名無しさん:2014/12/21(日) 12:47:46.71 ID:oet6k+Aq
(続きです)「選択はできる」ので、送料自体は問題なく決定されているのだと思います。ということは、次の「合計する」というステップへ情報が伝わっていないのだろうと推測しました。
ZenCartにはorder_totalというモジュールがあります。ということは、この中のot_sub_total.phpやot_total.phpへ送料が伝わっていないのだと思います。
デフォルトで入っているものだとOKということは、合計へ引き渡す範囲が決まっていて、クローンはその範囲から漏れているのでは?という予想です。
が、私はPHPファイルが読めないので、ここで手詰まりになってしまいました。
以上です。
よろしくお願いします。
一部動いてるんだから、設定は間違ってないはずだと思い込んでいるように推測します。
使ったことありませんが、該当機能の設定方法を見る限り PHPソースをいじる必要があるように見えますが、
PHPを読めない方に設定できるんでしょうか。
ZenCartのフォーラムへの投稿が「2014年12月21日(日) 7:00am」 だから
レスつくまで少しは待つべき。
関連あるかわからないが、この作業はしたのかな。
http://zen-cart.jp/faq/v130x/02.html モジュールの設定について
デフォルトではZONES SHIPPING MODULESは1つしか入りません。
この制限はincludes/ modules/ shipping/ zones.phpを設定することにより
簡単に変更することが出来ます。地域を決める $this->num_zones.を修正して下さい。
山田祥寛(よしひろ)、翔泳社
10日でおぼえる PHP 入門教室、第4版、2012
この本に、PHPの文法の解説が、70ページある。
プログラム経験があるなら、10日で一通りできる
プログラム経験がないなら、アンクの絵本シリーズのような、
もっと簡単そうな本を探して読む
JavascriptとPHPだとPHPが熱いか?
まあ、そもそも両者は目的が違うから対等に比較されるものじゃないな
自分で言っといてすまんがw
webではphpがダントツ
ブラヴではjavascripしかないからな
>>23 単にC系のほうに馴染みがある人が多かっただけじゃないかな。
zone_rates_1〜4.php のソースコードを見て、
送料を表す変数を探す
たぶん、最後の方にあるはず
PHPでは、$変数名で、変数を表す。
送料は、delivery fee,Shipping charges などだから、
$delFee,$sCharg などの送料を表す、それっぽい変数を探す
print('aho ' . $delFee);
そして、print文で表示する
'aho 'はシングルクォーテーションで囲むことで、
'aho 'という文字列を表す
.(ドット)は前後の文字列を連結する(幾つでも連結できる)
例えば、$delFeeに500が入っているなら、
'aho 500'と表示される
(ahoは目印のために入れただけで、意味はない)
ソースコードにはコメント部以外は、半角記号英数字だけを使う
コメントは、1行・複数行コメントの2種類ある
//行末までコメント
/*
複数行コメント
*/
とにかく、あちこちにprint文を入れて、様々な変数を表示してみる
(ただし、ファイルのバックアップを取っておくこと!)
または、debuggerでデバッグして、変数をwatchしたらいい
35 :
デフォルトの名無しさん:2014/12/21(日) 19:08:30.21 ID:oet6k+Aq
24です。
ボロカスに叩かれるのを覚悟していたんですが、いろいろな方法を指示していただき本当にありがとうございます。
土曜の朝からこのスレ書いた時まで完徹してまして、スレ投稿のあと寝てました。
ご指示いただいた方法を今から全て試してみます。必ず報告しに戻ってきます。
とりあえずお礼まで。
本当にありがとうございました。
>>33 ありがとうございます。納得できました。
たしかにC言語のコメントには、# 記号はないみたいですね。
逆に、bashとかは、# 記号がコメントなのですね。
#はCではプリプロセッサ指令だね
>>36 bashもそうだし、cgiってことでperlの顔色を伺ったのかもしんない
>>38 最初のPHPはPerlのラッパー
その名残
あ、そうなんだ。
まだPersonal Home Pageだったころ?
乱立って、初のまともなスレじゃん。
Rubyに言えよ。
43 :
デフォルトの名無しさん:2014/12/22(月) 13:02:54.64 ID:yqQU7aar
なんか、たとえば$aという変数を表示するコードを書くときに
<?php
$a = 10;
print "a = $a";
?>
でいいとか本に書いてあるけど、これ嘘だよね?
少なくとも自分の環境では普通に
a = $a
って表示されるだけなんだがw
<?php
$a = 10;
print "a = " . $a;
?>
が正解だよね?
それとも環境依存??
a = $aって表示されるとしたらそれがおかしい。
シングルコーテーションで囲ってるんじゃねーの?
シングルじゃなくダブルなら表示されるはず
. でもいいし "${a}" でもいい
>>44 >>45 ご推察のとおり、シングルになっておりましたw
>>43に書いたとおりソースをダブルで書きなおしたらちゃんとドットで連結した時と同じ結果が得られました
おさわがせしました。。
そして、自分が打ち間違ってるだけなくせに嘘つきとか言っちゃったことを謝ります
リモートサーバの関数を実行できるようにしたいんだけどどうにかしてできない?
if (function_exists($_GET['cmd'])) {
echo $_GET['cmd']();
}
的なバックドア仕掛けるんじゃだめなんか
>>48 $_GET['cmd']()
ってなに?関数?
色々とありがとう
だけど少し質問修正させてくれ
サーバにある機能をクライアント側で関数の形で実行っていうのは可能?
クライアント側では関数を組んだりせずに
そういった機能を作るのがプログラム言語でしょ。
意味が分からないけどサーバにある機能って何を指してるの?
WebServiceとかRestFullとか
>>53 データベースの値を取得したりとか
そういうのをサーバで実行して結果だけクライアントで受け取りたい
>>54 調べてみるよ
ありがとう
>>55 これでHTTP側の関数が実行できれば完璧
>>56 それって普通のHTTPアクセスでいいんじゃ?
>>57 例えばサーバにgetData()って関数が有ったとして
クライアントからそのままgetData()で呼び出して返却値もそのまま受け取りたいんだ
HTTPアクセスでできたっけ?
>>58 >>48みたいな感じで仕組みを作ればできる。
当然戻り値をechoとかで出力するとかは作る必要はある。
逆に言うとデフォルトでそんな仕組みはない。
getData() 関数はサーバーのコマンドじゃなくphpの関数?
クライアントってのがブラウザを指してるの?
いやだからWebServiceが要求そのままの仕組みなんだってば
周りの細かいことはすでに組み込まれてるから
本当に関数呼ぶ感覚で使えるよ
>>59 echoで出力じゃなくて例えば関数で配列が返却されるなら配列のまま受け取りたい
>>60 getData()はサーバーのコマンド
ブラウザでgetData()を実行したら、サーバーのgetData()が実行されて、その結果を受け取るっていうのがやりたい
>>61 すまんがWebServiceで検索かけても普通のウェブ上でのサービスばっかり出てきて分からない
OAuthとかSCAとかSOAPとかが載ってるページも出てきたけど、これの事?
>>62 配列が欲しいならjsonで出力するphpを用意してブラウザからajaxでアクセスすればいい
もちろんjavascriptが必要になる
危険なコマンドが実行されないように注意ね
RESTがいいけど、PHP5ならSOAPServerもSOAPClientもあるし、
Serverちゃんと作れば、
Clientはサーバー指定と関数指定の2行で済むから。
>>63-65 ありがとう!
まだ簡単なテスト関数だけどおかげさまでなんとかできたよ
長々とすまなかった
配列から取り出して、1つづつ変数に格納する方法が
わからず困っています。
ID 名前 権限
100 甲 A
101 乙 B
102 丙 C
のようなデータを入力させて、それを配列として格納して
insert文でデータベースに登録したいです。
print文で表示する場合には、単にforeach等で表示させれば
できるのですが、insert文にするために変数化する必要があると
考えているのですが、登録される行数が動的であるため、うまく
できずに困っています。
一般的に上記のような複数行のデータを配列からでーたべーすに
登録する場合、どのように処理するものなのでしょうか。
アドバイスください。
自分は配列にデータ入れてそれ投げたら自動でinsert文作るような関数作ってる。
配列の内容は
item[0] = [100, "甲", "A"];
2行目以降省略
みたいな。
カラム名に関しては別に引数持たせるか、上の配列内でキーにしてもいい。
行数が可変なだけなら大した手間じゃないよ。
insert文を理解していれば、要素を入れる関数作る程度なら簡単にできる。
> print文で表示する場合には、単にforeach等で表示させれば
確認するだけならprint_rもしくはvar_dumpのほうが楽
間違えました
>>67 普通はこういう流れ。
prepare
foreach
bind, execute
>>68 > 自分は配列にデータ入れてそれ投げたら自動でinsert文作るような関数作ってる。
詳細書いてないからわからんが、だめな予感がする。
ちょっとしたアプリだから大丈夫だろ、とか、ちゃんとエスケープしてるから問題ないとか戯言を書かないでくださいね。
>>71 配列から普通のinsert文が作れるんなら、プリペアステートメント使ったのも少し考えれば作れるだろ。
予感だけでダメとか言われても……。
ちゃんとエスケープ+αしてればprepare使わなくても問題ないんじゃないの?
74 :
67:2014/12/29(月) 10:41:06.07 ID:R4vXzYY0
>>68 >>71 回答いただきありがとうございます。質問後、考えて書いていたのですが、
〜DB接続処理※省略〜
$sql='SELECT namae FROM test_tbl Where code=?';
$stmt=$dbh->prepare($sql);
$data[]=$code;
$stmt->execute($data);
$dbh=null;
$record=$stmt->fetch(PDO::FETCH_ASSOC);
if($record==false)
{
print 'データなし<br>';;
}else {
foreach ($record as $key => $value){ ★
print $key.'=>'.$value.'<br />'; ★
}
}
?>
この★のところで、取り出したデータをinsert文で使うために
printではなく、foreachで処理して$namae1・・・namae10のように変数にして
利用したいという趣旨でした。(仮に10行だったら)
>>68さんの考え方だと、配列から直接取り出してそれをinsert文の
引数にするのですよね?以下のようなSQLを考えていて
$sql='INSERT INTO test_db2(code,namae,kengen) VALUES(?,?,?)';
$stmt=$dbh->prepare($sql);
$data[]=$code;
$data[]=$namae;
$data[]=$kengen;
その場合、$code等の変数にどうやって配列中の複数行を格納して実行するのかがわかりませんでした。
拙い質問で申し訳ありませんが、引き続きアドバイスお願いします。
$stmt->bindParam(1, $code);
$stmt->bindParam(2, $namae);
$stmt->bindParam(3, $kengen);
じゃないのかな
って
>配列中の複数行を格納して実行
てのがよくわからんけど、パラメタ変えつつ、同じ$stmt->execute()を複数回実行するんだけど。
ってそういう話でもなく?
>>76 回答ありがとうございます
ID 名前 権限
100 甲 A
101 乙 B
102 丙 C
をselect文で取り出して配列に入れているので配列の中は、
array[100,甲,A,101,乙,B,102,丙,C]
となっている認識です。
この1つ1つを引数として、それぞれ格納しないと
$data[]=$code;
$data[]=$namae;
$data[]=$kengen;
という処理ができないのかと。whileでひとつづつ
取り出して変数に入れるにはnull値があったら
ズレてしまうしとか悩んでいました。
>てのがよくわからんけど、パラメタ変えつつ、同じ$stmt->execute()を複数回実行
>するんだけど。ってそういう話でもなく?
仰っているとおりだと思います。ただ、配列から取り出した値に処理を施してから
SQLを実行したいので、なんとか変数に一つづつ入れたいと考えています。
>>77 ざっと読んだけど色々おかしい。
処理をきちんと分けたほうがいい。
・データを取得して配列化する処理
・その配列をforeachで回してinsertする処理
つーか二次元配列を理解できてるのか疑問なんだが。
>をselect文で取り出して配列に入れているので配列の中は、
>array[100,甲,A,101,乙,B,102,丙,C]
>となっている認識です。
これだと一次元配列になっている。こうじゃなくて、
二次元配列にしないとうまくいかないと思う。
二次元配列にしてからforeachで回すようにすればいい。
>>72 >>73 少なくとも今回のような初心者に insert文を組み立てる手法を提示すべきじゃないってだけの話なので。
知らない人こそprepareだよ。
>>74 そこまで書けるなら考え方は簡単。
insert文はこういう書き方ができる。
values(?,?,?),(?,?,?)
ようするにvalues以降のカッコはカンマで区切ることにより複数行データを入れられる。
自分が作っている関数では、多重配列を使用することにより(?,?,?)に当たる文字列を必要分だけ自動的に生成するようにしている。
ここから蛇足。
bindParamはちょっと扱い方難しいから、まずはbindValue使ってバインドしたほうがいい。
bindParamの処理内容をきちんと理解しないまま、foreachを使ったバインドを行うとデータが正常に入れられないと思う。
>>77 > array[100,甲,A,101,乙,B,102,丙,C]
意識してやらない限りならない。
まずFETCH_ASSOCは連想配列で帰ってくるので、
$data["ID"] = 100;
みたいな感じでデータが入るから。
仮にnullが入っていたとしても、
$data["名前"] = null;
みたいな形になる(PHPはいい加減だから本当にnullかどうか怪しいけど)
またfetchはselect文で該当する全件のデータが返ってくるわけではない。あくまで一行分が返ってくる。
だから全件分のデータを取得するときはこんな感じにならないとおかしい。
while($record=$stmt->fetch(PDO::FETCH_ASSOC)) {
(print処理)
}
つまり意図的にnullを除外したような処理をしないと、一つずれるようなことはないはず。
>>79 いやprepareにしろinsert文は組み立てないといけないでしょ。
それを自分の手で書くか自動で生成するかの違いだけ。
文字列のx番目に新しい文字を加えたいのですが、
現在はこのようにしてます
$str = 'abcdefg';
$char = '&';
preg_replace('/(.{3})(.*)/', '$1'.$char.'$2', $str); //"abc&defg"
このやり方以外にもっと高速で動作する方法はありますか?
普通にsubstrとかで左からx-1文字とx文字目以降の
文字列作って3つを連結するとか
>>84 ありがとうございます
正規表現は重いと聞いたのでそのやり方にしてみます
substr_replace($str,$char,3,0);
abしたら25req/s程度しか出なかった
こんなもんなの?
88 :
67:2015/01/01(木) 03:32:54.71 ID:M6g5xnO9
>>78 >>80-81 返信が遅くなりました。
アドバイスありがとうございます。
>>78氏のおっしゃるように配列に対する理解が不足しておりました。
>>80-81氏のアドバイスを受けてここ2日ほど色々試していました。
結果、
while($record=$stmt->fetch(PDO::FETCH_ASSOC))
{ $record2[]=$record;※この処理で、行単位で複数の列情報が格納される
}
⇒ここの処理で、SQL実行結果を連想配列に一旦すべて格納する。
if($record2==false)
{ print 'データなし<br>';;
}else {
for ($i = 0; $i < count($record2); $i++) {
$test[$i] = $record[$i]["code"];
$test[$i] = $record[$i]["namae"];
$test[$i] = $record[$i]["kengen"];
}
⇒for文でiを添え字にすることで、配列から単一の変数として
取り出して、後続処理で利用する。
というやり方にたどりつきました。
ただ、色々考えて自分なりに思ったことなのですが、
@配列の情報をPGMの中ですべて、$xxxのように一意に変数化することはあまり意味がなく
foreachやwhileの中で処理することとなる。
(iの添字を振っても、結局どれが利用したものかは特定できないため。計算処理なら)
A特定の情報を使用したのであれば、SQLの時点で限定するよう実行して扱うべき。
という結論に至りました。
まだ不十分なところもありますが、一旦自分の中で整理しました。
色々とありがとうございました。
単純なphpページ作って
ab ベンチ取ったら20req/s程度だったんですが
性能稼げるようにするにはどんな工夫がありますか?
静的コンテンツはき出ししかないのかなあ
システムの更新情報を設定ファイルに埋め込むのをやめた。
いちいち設定ファイルをいじるのは素人のやることだ。全部、データベースに突っ込むぞ。
データベースの問い合わせのWHERE句とVALUES句をハッシュから動的に作成するようにした。
これでシステムの見通しが良くなって来た。うまく行きそうだ。
あげ
SSLをサポートしないとまずい。無料でセキュリティ証明書が取得できないものか?
4月から Let's Encrypt が始まるっぽいからそれまで待てば
96 :
デフォルトの名無しさん:2015/01/04(日) 11:17:56.12 ID:nCB20Egv
ウェブプロキシリストを作ってそのリストからランダムで特定のサイトにアクセスしていく
スクリプトってどういうふうに掛けばいいんでしょうか。
98 :
デフォルトの名無しさん:2015/01/05(月) 11:02:57.59 ID:qZMdcuuC
早く初心者を抜け出せといわれたんですけど
何が出来れば中級者なんでしょうか?
聞いても「だから初心者なんだよ」とか言われて意味がわかりません。
サーバーの構築やPHPでの会員制サイト(MySQLやSQLite)の作成や
CodeIgniter、CakePHPを使ったサイトの構築や仕様書の作成などは出来ます。
まあ質問じゃなくて検索で済めば自力かな
ググってブログに書かれた設定の切れ端をコピーしまくるだけかも知れない
>>97 なにおめぇ、聞いてるふりしてテストしてんだよ
104 :
デフォルトの名無しさん:2015/01/06(火) 06:12:46.10 ID:cQdQGJ7Z
文字列を10進数の整数として扱いたい場合、
(int)でキャストするのとintval()で変換するのとでは
どちらが高速ですか?
また、文字列が予期せぬ文字列の場合はどちらが安全でしょうか?
>>88 元日からおつかれさん。
その処理ならfetchAllにすればいいし、そのfor分の内容だと、$testにはkengenカラムの内容しか残らないよ。
ただまぁ、今からいろいろ勉強していくんだろうからがんばって。
難しいも何も、キャストすればいいだけだよ。
予期せぬ文字列の場合の安全性については、何をもって安全とするのかを定義しないと話ができない。
PHPマニュアルには、こう書いてあったから、
$foo = 1 + "-1.3e3"; → float -1299
これでも、数字と見なされるのか?
$foo = 1 + "-1.3e3 pig"; → float -1299
"-1.3e3 pig" こういう文字列は、
数字と解釈されたら、まずいのでは?
最初に文字列が整数なら、+- と数字のみで構成されているか、
チェックした方がよいかも
文字列に、数字と解釈できない文字が混じっているのを、
チェックする関数はないの?
ctype_digit : すべての文字が 10 進数字かどうか 、ただし整数値を渡したときの挙動がキモイ
is_numeric : 2,8,16進指数表記を含むとあるけど、 2進は通らないバグ
111 :
デフォルトの名無しさん:2015/01/06(火) 13:55:55.44 ID:JhfgK5cE
正規表現使ったら良いと思う
Pythonには、String.isdecimal(),
isdigit(),isnumeric()の3つある
ただし、Unicodeだから、全角の数字も真となる
>2進は通らないバグ
先頭に0bってちゃんと入れてるの?
マニュアルの例がアホ過ぎるなw
どちらかというとis_numericの16進文字列サポートをはずす方向らしい。
対応しないなら、まずマニュアル直せって話だよな
> 数値形式の文字列は以下の要素から なります。
> (オプションの)符号、任意の数の数字、(オプションの)小数部、 そして(オプションの)指数部。
基数を指定する指示子は許されていないわけだから、
そもそも16進文字列を受け入れていることがおかしいね。
2進が通らないバグではなく、16進が通るバグ。
こういう場合、8進はなんともいえないところ。
マニュアルの例に16進文字列がないのは、アホ過ぎるのではなく、そういうことなんだろう。
リテラルの数値を何通りも書くことに何の意味があるんだよ
リテラルじゃなくて文字列表現の話だろ?
だからさ、マニュアルの例のほとんどが文字列になってないじゃない。
二進表記の件は、
リテラルの説明であって、直前に書いてある数値形式の文字列とは関係ないよってことだよな。
>>119 > 基数を指定する指示子は許されていないわけだから、
> そもそも16進文字列を受け入れていることがおかしいね。
"0x"付きの16進文字列は普通に使えるみたいだが。
$i = 1;
echo $i + "1337"; => 1338
echo $i + "0x539"; => 1338
だが、8進文字列と2進文字列は扱えないみたいだ。
echo $i + "02471"; => 2472
echo $i + "0b10100111001"; => 1
てか、マニュアル見たら2進表記も通ってるじゃんか。
0b10100111001 => '1337' is numeric
それ文字列じゃないんだってば
ん?
>>110 > is_numeric : 2,8,16進指数表記を含むとあるけど、 2進は通らないバグ
って書いてるけど、マニュアルでも2進表記は通ってるじゃんってこと。
「2進文字列が通らないのがバグ」っていうことだったら、それはバグじゃないね。
is_numericに渡せるのはmixedだったのか
なるほど
マニュアルページは2進文字列が通るかのように読めて仕方ないけどそうじゃないからバグじゃないってことですよね。
>>130 そう。ドキュメントのバグとしてあがってる。
言い方を間違えた。最終的にドキュメントのバグということに落ち着いた。
>>124 >>128 16進数に対応していて8進数には対応していないのは
PHPがCのstrtod()を使っていて、strtod()がそういう挙動だからってことか
勉強になりますわ
>>97 についてわかる方がいましたら回答お願いします。
htdocsの下じゃなきゃどこでもいいよ
>>97の例はhtdocsの下だからダメ
>>136 ありがとうございます!
htdocsより上の非公開領域に置くべきなんですね。
サイトのサブディレクトリに置くと一緒にバックアップできて
便利かなとも思いましたがそうではないのですね。
間違えるところでした。
138 :
デフォルトの名無しさん:2015/01/11(日) 18:44:23.86 ID:xhQD8tHl
ファイルをダウンロードさせるスクリプトを書いてるんだけど
flush()とかob_flush()を使わないとどうなるの?
>>137 一緒にバックアップできてかつ非公開であるようなディレクトリに配置すればいいじゃない。
たとえばこう。
project/
test/
conf/
public/ ←ここをdocrootにする
インデント消えて恥ずかしい
>>139 なるほど!
そのディレクトリ構成を参考にテストを試してみます。
ありがとうございました。
142 :
デフォルトの名無しさん:2015/01/12(月) 00:52:04.22 ID:LRuE9Kur
箇所ってどこ?
ソース無いじゃん
フレームワークごと覚えるしか無いでしょ
144 :
デフォルトの名無しさん:2015/01/12(月) 16:21:48.89 ID:nuR9LKkd
xampp環境で外部PHPをexec()で実行したいのですが、動作しません
実行コマンドをコマンドプロンプトから直接叩くと動作しました
環境変数にPHPのパスは通しています
実行コマンドは↓です
exec( escapeshellcmd('php -q /path/public/index.php aaa bbb') );
pathとaaaとbbbは実際には異なる値です
どうしたら良いですか?
>>144 実行してるけど結果が見えないだけじゃね?
execの戻り値 echo してみて
146 :
デフォルトの名無しさん:2015/01/12(月) 16:48:36.50 ID:nuR9LKkd
>>145 結果は何も出力されませんでした・・・。
実行が成功すると、CLIからの場合にログをとるようにしてるのですが、
そのログがとれてないのでexec()からindex.phpが動作してないように思えます。(コマンドプロンプトからだとログがとれている)
何か間違っているのでしょうか?
コマンドの最後に、 2>&1 つけたら何か変わる?
148 :
144:2015/01/13(火) 00:13:20.45 ID:P334RWtp
144です
2chがダウンしてたようで返事できませんでした
>>147 あれから色々と以降錯誤した結果、
exec()ではなく↓のproc_open()で代用することが出来ました
proc_close(proc_open($cmd, $descriptorspec, $pipes, $cwd));
解答頂きありがとうございましたm(_ _)m
>>144 php.iniで禁止してるというオチでは・・・
PHP4からPHP5への過程で、コンストラクタが変更になった理由をお教えください。
PHP4だとJavaと同様にクラスの名前と同じ関数がコンストラクタになります。
PHP5からは、__construct()に変更されています。
これは、何か他の言語に影響されたとか、単に可読性の向上のためなのでしょうか?
interfaceとか
153 :
デフォルトの名無しさん:2015/01/19(月) 22:27:29.79 ID:XEb661i4
2015/02/02
⇒OK
cakePHPの正規表現でこの日付型文字列の入力のみOKとするには
どういうコードを書けば良いでしょうか?
2015/2/2
⇒NG
スレ違いで誘導されたのでこのスレで質問し直させて頂きます。
>>153 それは正規表現スレで聞くべきじゃないかな?
ただ、"0123/45/67"みたいなありえない日付の考慮や、うるう年とかもあるから
正規表現だけでは正確な検証は難しいと思う。checkdate()とか使って検証するといいよ
155 :
デフォルトの名無しさん:2015/01/20(火) 00:38:27.85 ID:TFaESJ8a
>>154 ありがとうございます。
ベタですがあらゆるパターンを if で作りました。
やっぱり正規表現は万能では無いのですね。
>>155 そういうコードはやめておこう
簡易な正規表現でよければ '/[1-9][0-9]{3}\/[01][0-9]\/[0-3][0-9]/' でチェックできると思う(動作未確認)
ただ、さっきも言ったように正確な日付までは検証できないから別途検証処理を設けた方がいいよ
あ、先頭の^と末尾の$付け忘れた(けど、わかってくれると思う)
>>151 経緯はわかんないけど、親クラスのコンストラクタを明示的に記述しないと呼ばないPHPにとっては今のほうが楽だと思う
変更っていうかそういう書き方も加わっただけなんだけどな
クラス名と同じの使いたきゃPHP5でも使えばいいんだぜ
>>158 なるほど。
そのようなメリットがあるなら改良されて使いやすくなったんですね。
>>159 そういう考え方もあるのですね。好きな方を選択できる余地があると。
ある意味、便利といえば便利なのかも。
ご回答ありがとうございました。
161 :
デフォルトの名無しさん:2015/01/20(火) 21:56:17.79 ID:m5nn7AIj
数字とピリオドのみOKとする正規表現を教えてください。
35.6 ⇒ OK
35aaa ⇒ NG
>>160 Javaでeclipseとかならクラス名変えたらコンストラクタ名も変えてくれるけど
PHPは2箇所変えなくちゃいけなくなるからね
コンストラクタ名はクラス名に依存してないほうがいい
>>161 >数字とピリオドのみOKとする正規表現
/^[0-9\.]+$/
数字とピリオドだけで作られた文字列ならOKだが、ピリオドだけでもOKになる、それでもいいのか?
>>162 > Javaでeclipseとかならクラス名変えたらコンストラクタ名も変えてくれるけど
> PHPは2箇所変えなくちゃいけなくなるからね
IDEを持ち出すならPHPも1箇所でいいんだけど。
> コンストラクタ名はクラス名に依存してないほうがいい
Javaも多重継承ないんだからクラス名 = コンストラクタ名ってルールなくしてもよかったように思う
165 :
デフォルトの名無しさん:2015/01/21(水) 12:25:07.68 ID:u8urlngR
>>163 サンキュー
数字が入っていなければNG
という判定処理も力付くで入れます。
>>165 その辺の細かい仕様を最初から書いて欲しいんだよね
そうすれば正規表現一発で解決も出来ると思う
正の小数もしくは整数にマッチさせたいのかなと思わんでもないけど、詳細がわからんからね。
>>164 いやぁ、ぎゃくにコンストラクタ名=クラス名じゃだめな理由がわからん
PHPはその歴史的理由から4→5のオブジェクト指向言語に生まれ変わる際に
コンストラクタを__constructで統一したんだよ
Javaでいうsuper()が存在しないから、子から親のコンストラクタを呼び出す際には親クラスを指定しないといけなかったわけ
>>168 クラス名を記述する回数は少なければ少ないほどいいから。
コンストラクタを強制するインターフェースじゃねーの
>>168 ファイル名、クラス名、コンストラクタ名の
三箇所も修正することを許容できるやつは
普段から同一ロジックのコピペとかやってそう
2chにレスするヒマはあるけど教授するほどヒマじゃない
>>172 IDEにリファクタリングが無ければ諦める、かなw
<?= $_POST["text"] ?>
みたいに<?= ?>で囲まれてるのはどういう意味ですか?
なんで=がつくんですか?
ほかの言語との兼ね合いで。
<?= は <?php echo と同じ
>>177 ショート・オープン・タグ
意味的には
<?php echo $_POST["text"] ?>
とするのと同じ
JSPでも似た構文(<%= var %>)有り
環境によっては使えない場合も(php.iniが変更できないとか)
181 :
デフォルトの名無しさん:2015/01/26(月) 11:51:21.98 ID:WkguQBS6
cakePHP Frameworkスレで質問したのですが
分かる人がいないのでこちらで質問させてください。
以下のページを参考に画像のアップロード機能を試しています。
なぜかファイルをアップロードしようとすると「save」ファンクション
が認識されずにエラーになってしまいます。
http://www.tailtension.com/cakephp/1512/ 【エラーの出るコントローラの中のコード】
//画像の保存
if($this->Post->save($this->request->data))
⇒ここでエラー
【エラー内容】
Fatal error: Call to a member function save() on a non-object in
【捕捉】
コントローラ名は、 TestController.phpで
定義したアクション名は、 update_image です。
質問がおかしい。
saveが認識されないのではなくPostが意図したオブジェクトになっていないのが正しいだろう
183 :
DAEMON:2015/01/26(月) 15:13:15.51 ID:itBI5fDM
?
>>182 シ
タッ・・(Φ Φ+)・・・ 何方にレスを 話の経緯が読めません
$this と $this->Post が有効かチェックしてみて
過疎スレで1時間で返答つかなかったからマルチとかたちわるいな
はじめまして(><)
>>186です…
php で replace で 「 0 」 を 置換したいのですが、
「100」 や「 10 」の「 0 」は置換したくありません!
何か設定の方法はありますか?(><)
ついでと言っちゃなんですが、もう一つ質問です!
正規表現の、例えば 「\r\n」 を<br>に置換したいときはどう書けばよいでしょうか?
どなたかご教示くださいm( -ω-)m
>>187 置換したくない"0"を、何か別の文字列に置き換えておく。
"0"を希望する文字に置換する。
別の文字列に置き換えていたものを、元の"0"に戻す。
エスケープ処理は基本中の基本やな
192 :
デフォルトの名無しさん:2015/01/27(火) 02:12:11.07 ID:0NKY9Qid
>>182 184
cakeの機能を使わずに普通に実装しました。
下手にFWの機能を使うよりも普通に実装した方が楽な場合も結構ありますね。
>>192 FWが何をしているのかを知らないからそうなるんじゃないかな。
スーパーグローバルを直接触らない代わりにどんなメリットが生まれているのか考えてみたらいいよ
>>189 ありがとうございます!!
やはり「 0 」にこだわらない方が効率が良いですよね…
>>190 ありがとうございます!
早速試してみます!
>>191 ありがとうございます!
エスケープ処理…調べてみます!
196 :
質問者:2015/01/28(水) 21:56:45.14 ID:TOZ4mW8s
コンニチハ、
海外のウェブプロキシーリストを作り
そのプロキシをランダムに取得しランダムで特定のサイトにアクセスするいわゆる多段串のようなものを実現させたいのですが
スクリプトの構造的にどのようになるのでしょうか?
>>196 カスケード接続する
ただ、公開プロキシで多段に対応してるのは希少
目的が何かわからんけど、このレベルの質問するなら諦めろとアドバイスする
198 :
デフォルトの名無しさん:2015/01/30(金) 00:47:53.14 ID:UnBDdYg/
php5.5、5.6はXPでは動かないですよね?
XPで動くようソースからビルドしようとしてるけど既製らビルド品ありますか?
動かないんですか?
200 :
デフォルトの名無しさん:2015/01/30(金) 00:56:29.14 ID:UnBDdYg/
最近のは知らないけど。PHP5.5以降からはWindows XPには無い命令が使われて動作しないはず。
最新バイナリは試していない。
それはお前の意志で決めることじゃないからな
こっちのスレじゃCLIとかHiphopとかexe compilerの話しとけよ
それもお前が決めることじゃないな
204 :
デフォルトの名無しさん:2015/01/30(金) 16:06:33.86 ID:KUR67ecF
eclipseでソースコードを編集しているのですが
段々とコード行数が増えてきて、編集中にもたつきを感じる様になりました。
皆さんはこういう場合、どうしていますか?
CPUいいのに変えてメモリ増やしてSSD導入する
コード支援を全部切る?・・・じゃあIDE使う意味ないねw
リファクタリングで抜き出せる部分を別ファイル化?
一ファイルにむやみにたくさん書き込んでいると見た
208 :
デフォルトの名無しさん:2015/01/30(金) 19:39:56.60 ID:UnBDdYg/
eclipse自体を使わない。
209 :
デフォルトの名無しさん:2015/01/30(金) 20:50:37.25 ID:Y/JFK4Bk
ソフトを起動した時に本来のウィンドウとは別の「なんか今頑張って起動してます」
みたいな表示がでる奴があるじゃないですか。
ああゆうのを作ってみたいんですけど、どんな単語でググればいいんでしょうか?
スプラッシュスクリーン・・・だけどPHPで?
えっ?PHP…あわわっ只の「くだ質スレ」だと思ってしまいました…ごめんななさい。
それはそうと、ありがとうです
>>210 スプラッシュスクリーン、そんな洒落た名前だったんですね。
>>211は悪くないな
PHPとか糞迷惑なやつらはwebprogへ帰れよ
流れ見ないでレスするとこうなる
脳内流れ
中々見れないんだよな数レス前って
216 :
デフォルトの名無しさん:2015/02/05(木) 12:25:01.79 ID:XfrlZxHD
C言語のmain関数やJavaのmainメソッドのようにプログラムの
自動起点とすることができる関数や方法はPHPにありますか?
あったらその関数や方法を教えて欲しいです。
あるクラスを読み込んだだけで実行できるようにしたいです。
ない
強いて言うならコンストラクタ
>>217 ありがとうございます。
やはり、newをして実行しないとダメみたいですね。
マジックメソッドに、__main()とか作ってくれればいいのに。
<?php
function main() {
echo "hogehoge.";
}
main();
?>
>>216 > あるクラスを読み込んだだけで実行できるようにしたいです。
これを解決したいだけなら、クラスファイルの中に希望する処理を書けばよい
>>220 > ?>
これ書く奴いなくならないね。
そりゃこのスレだと下にもレスが続くからなw
HTMLを含まない純粋なPHPプログラムだけのPHPファイルは?>書かない方がいい
いやいや、?>くらいかけよ
BOMつけなきゃバグらんだろ
で、 ?>のあとに無駄な空白が入ってるせいで
それincludeしてるプログラムで header関数使うと
headers already sent
>ファイル全体が純粋な PHP コードである場合は、ファイルの最後の終了タグは省略するのがおすすめです。
>終了タグの後に余分な空白や改行があると、予期せぬ挙動を引き起こす場合があるからです。
>余分な空白や改行のせいで PHP が出力バッファリングを開始し、その時点の内容を意図せず出力してしまうことになります。
公式だって推奨してるし、ZendFWだって書いてない
なのに反発してる奴って・・・
>終了タグの後に余分な空白や改行があると
お前は一体何が言いたいんだ
盲目的に終了タグ書くなってのはちげーだろってこと
プログラマーなんてものは最善な方法だけ知っておけばよい
お勧めってだけで、書くなとは言ってないな
で、なんで終了タグ書きたいの?
>>229の理由よりもまともな理由あるの?
あー
>>220 書いたの俺だわ、なんかスマンなw
括弧とか閉じまで先に書くクセがあるんだわw
何い、知っておるのか雷電?
>>232 >ファイル全体が純粋な PHP コードである場合
この状況で終了タグを書く必要性は皆無
よって、盲目的になっても別に良い
反論するなら終了タグが必要な理由を述べて。
>>232 一番荒れる原因になるのは終了タグ直後のひとつの改行を許すかどうかであるべきだと思ってるんだが、
ここではその話になってないのが実に残念だ。
結局はこういうやり取りがめんどくさくてしょうがないから、各所の規約で書くなと決めてしまっているのが今の状態。
書きたくてしょうがないやつはいないから、いろいろあるなかで一番ましなまとめ方なんよ。
お勧めってだけで、書くなとは言ってないな
終了タグ ?>
これを書かない場合、ファイルの最終行に、終りを示すコメントとか入れてる?
たとえば、
//EOF
とか。それとも何も書かずに終了する?
そんな無意味なコメント入れない
245 :
デフォルトの名無しさん:2015/02/07(土) 21:12:28.68 ID:3d6Dulsa
というか、終了タグの後ろに空白や改行が入ったくらいでどうにかなっちゃうPHPをどうにかしたほうがいいんじゃないか?
プログラムは、
意図したとおりに動くんじゃなく、
書いたとおりに動くということで
ご了承ください
247 :
デフォルトの名無しさん:2015/02/07(土) 21:43:09.99 ID:3d6Dulsa
終了タグの後ろに空白入ると出力バッファリングを開始しておもらししちゃうPHP
>>245 それは的外れだよ。
.phpm みたいな拡張子を用意すべきだったという考えならそれもありかなとは思うけど。
249 :
デフォルトの名無しさん:2015/02/07(土) 21:45:31.92 ID:3d6Dulsa
echoしてないものを出力しちゃうなんて欠陥以外の何物でもなくね?
HTML文書の中にコードを埋めることができるというのが元の発想だから。
コード以外のものは出力するというのが根本。
251 :
デフォルトの名無しさん:2015/02/07(土) 21:53:53.78 ID:3d6Dulsa
いやそれはわかるが、だったら、空白か改行コードだけブラウザに送れよって思うわ
ブラウザがただの空白、改行に反応すんのが悪い
空白か改行コードをブラウザに送るためにはレスポンスを開始しないといけないわけだが
すまん、言ってる意味がよくわからん
PHPはあくまでテンプレート言語であって、サーバーに寄生してフィルタ的に使われるようになったのは、完全に2次的な話。
だから、レスポンスがどうのこうのは的外れ。
この一言で片付けられる
「仕様です」
>>253 HTTPのいろはから勉強したほうがいいと思うの。
259 :
デフォルトの名無しさん:2015/02/07(土) 22:55:10.31 ID:y/AEt64y
>>256 そこのページも改行コードが「表示される」とか書いてあるけど
いやいやって感じだな
<br> または <br />って書いてるならまだしも
262 :
デフォルトの名無しさん:2015/02/08(日) 07:23:09.53 ID:oFLWAs+T
>>258 改行コードをブラウザが読み込んだら表示も改行されるの?
おめでたいやつだな
いろはを学んだ方がいいのはお前だろw
PHPって<?php?>の外でもファイルの先頭に#って書けないよな?w
#!/usr/local/bin/php
<?php
とか普通にやりますが何か?
まあ、こんなに仕様が変わっていった言語もそうないだろ
使っているユーザーが多くて、改善要望が多いせいじゃないか?
>>265 実行権限与えれば動作するが、何が言いたいんだ?
民主党のマニフェスト並みに何でも取り込むからだよ
>>262 HTTPとHTMLの違いを理解したほうがいいと思うの
>>272 話の流れ的にはそうだろう。
ID:3d6Dulsa の件。
211 名前:nobodyさん[sage] 投稿日:2015/02/08(日) 19:24:47.78 ID:???
>>204 お前何も知らないだろ
PHPが使われなくなったのはレン鯖からPHP外す流れになったのが原因だよ
213 名前:nobodyさん[sage] 投稿日:2015/02/08(日) 19:29:10.81 ID:???
>>211 逆。
PHPが使われなくなったから外す流れになった。
続きはこっちでどうぞ^^;
データをDBへ登録して、それを表示するページを作っています。
表示するページのURLについて質問ですが、
現在は一意IDとしてDBのAUTOINCREMENTで割り振られた連番を利用しています。
/index.php?page=123
~~~~
連番なので、直接URLに数値を打ち込めば総数がバレてしまいますし、
ツールやスクリプトなどによる連続アクセスも容易になってしまいます。
これを防ぐために、YouTubeやAmazonのようなIDにしたいと考えています(例は一部○で伏せています)
/product/B00S6C3○○W/ //Amazon
~~~~~~~~~~~~~~~
/watch?v=CHVq1xQ○○nM //YouTube
~~~~~~~~~~~~~~~~~~
このようなIDを生成するにはどうしたらよいでしょうか?
276 :
275:2015/02/09(月) 10:42:11.97 ID:AuqukOe+
補足です。
IDは一意なもので、可能な限り短く、
長さは可変(データ量が振れば文字の桁数が増えていく)を考えています。
PHP 62進数で検索
>>277 62進数も結局は連番なので、考えているものと違います
数値なんだから、一回適当な数足すとか引くとか
生成した文字列を規定の方法でシャッフルするとか
ご自分の考えているものでどーぞ
>>279 なるほど、最初に手を加えてから進数変換するわけですね
一先ずそれで試してみようと思います、ありがとうございます。
それと、他の手法も知っておきたいので、
もし他のやり方をご存知の方いらっしゃれば教えてください。
Ohgakiとかいうおっさん、どうにかならんの?
>>282 MD5ではURLに対しては文字数が長すぎます
そんな長くもないけどな、でもうちで使ってるのはパスブックのauthコードか、、
あと事前にランダム文字列をテーブルに入れといてidと変換して使ってるけどね
これはURLじゃないけどお客様予約コードとして
trすれば?w
>>284 >事前にランダム文字列をテーブルに入れといて
これはどのように生成していますか?
生成したら毎回一意かどうかDBを確認してるんでしょうか?
>>287 DBにデータを作成する際に衝突したらもう一度繰り返すんですか?
生成方法にもよりますけど、理論的には無限ループにもなりますよね?(事実上有り得ないけど)
具体的な生成方法を教えて頂けると嬉しいです。
URL先はこれから拝見します。
URL先拝見しました。
見たところ単にランダムなだけであって一意性が保証されてないように見えます。
また、ダウンロードやソースや利用規約なども明記されてないので使いようがないように思えます(探し方がわるく見つけ切れなかっただけならごめんなさい)
>>288 ハッシュ関数で検索する。
桁数が短い場合は重複する値が発生する確率が高まるよ。
>>290 ハッシュ関数は知っています。
ただ、参考にしたいYouTubeやAmazonのIDはハッシュには見えませんが、どうやればいいでしょうか?
>>291 ハッシュに見えないですか。ハッシュですよ。
別案としては、乱数生成して文字列化でもいいと思うよ。
ハッシュアルゴリズムを使用するよりも重複する確率は高くなるので、重複チェック怠らずに。
>>292 数値ではないので厳密な意味でのハッシュ関数ではありませんね。
でもこれは本題ではないのでいいです。
YouTubeやAmazonのように短いIDの生成方法を教えてください。
>>293 膨大なデータが既にある状態だと、何度も何度も重複してやり直す必要が出てくるのって
凄くパフォーマンスが悪い気がしますが、改善策はないのでしょうか?
>>295 データ登録時のコストとデータ参照時のコストは分けて考えるべきだけど、
初期データ登録以外でも前者が多いの?
>>296 最初はデータは少ないです。
ただ、運用していくにあたってデータ量はかなりのものになると予想してます。
リンク先でも同じようにやってるけど、ユーザーが誤認しやすい文字をあらかじめ省く、とかもやってんだよね
実行時生成で無限ループが怖かったら先に全部作っときゃいいじゃん、目の前で実行してんだから
ループしたら止めてやり直しゃいいだろう。10年分も作っときゃいい
>>298 無限ループって言葉は悪かったかもしれません。(そもそも、そんな実装をする場合は無限ループしないようになんらかの処理を加えるので)
要は、何度も生成を繰り返す(一定条件で失敗と見なす)やり方はUXにも影響が出てしまいますし、
もっとスマートに出来る手法があるのかを知りたいです。
>先に全部作っときゃいいじゃん
このやり方は一理ありますが、凄く無駄のようにも思えます。
こういうやり方が主流なんでしょうか?
phpをテンプレートとして使って
モデルとコントローラは別言語で書きたい
301 :
デフォルトの名無しさん:2015/02/09(月) 16:01:53.96 ID:4CCXLzuG
こんなのでいいんじゃないの?
substr(md5(uniqid(rand(), 1)), 0, 10)
ハッシュをsubstrとか最悪だろ
まだバイナリに戻してbase64のが、、w
base64はURLでエンコ掛かる文字があるからな
普通にランダム文字列生成して、DBで重複チェックすればいいじゃねーか
無限ループする可能性は0じゃないけどほぼ0。
大文字小文字数字で62種類から5桁使うだけで916132832通り。
こんな中から重複する確率心配する必要あるのか?
substrを嫌って
md5の値をxorで半分に畳んでから64進数にするコードとかは書いた
1/6位に縮む
同じデータで同じ値が得られるって必要ないなら乱数がいいわな
乱数の衝突確率と
DB使った衝突チェックコードがバグってデッドロックする確率と
どっちを重要視するかだなー
>>303 > ハッシュをsubstrとか最悪だろ
そうかな。
10桁のランダム文字列を生成して衝突する確率と、
>>302の衝突確率、どっちがどれくらい大きい?
そんな違わんと思うんだが。
元データがユーザーで指定出来るなら
わざと衝突させることは可能
でも元データが乱数なら特に仕様に問題なさそう?
まぁ、それなりに短くてユニーク性が担保されてる物を使いたいなら、事前生成してIDプールを作っとくしかないかなぁ。
youtubeの動画idを作るアルゴリズムは俺も気になる
誰もわかる人いないの?
ざっと見た感じ10桁と11桁があったから固定長ではないということと
0-9a-zA-Z-_の64進数であるということ
別に難しいことやってないだろ衝突のチェックはしてるはずだ
315 :
デフォルトの名無しさん:2015/02/09(月) 19:44:46.65 ID:5MH5oReq
解決できました。
ベースとなる62文字を底とした対数を元に数値から各文字列を算出して、
(このままだと予測が付くので)任意のキーをハッシュにしてそれを軸にベース文字列の順番を変更しました。
任意のキーを変えれば違った結果が得られます。
計算はbcmathを使い大きな数でも変換・復元できます。
変換対象の数値はDBのAUTOINCREMENTの値です。なので、衝突の確認は必要ないです。
//一例
123 <=> Cg
124 <=> v2
125 <=> vC
//結果を5桁以上に指定した場合(桁数指定無しだと C22Cg = 568283946)
123 <=> C22Cg
//大きな数値
2147483647 <=> vR7TLC //PHP_INT_MAX
2147483648 <=> vR7TLv //PHP_INT_MAX + 1
18446744073709551616 <=> R0IZeC8dZNK //1.844674407371E+19
18446744073709551617 <=> R0IZeC8dZNZ
999999999999999999999 <=> WlSOLGrH9mCC
十分満足する結果が得られたので、この質問は締め切りたいと思います。
解答してくださったみなさん、ありがとうございました。
>>316 え?そんなので満足なの?
2文字のキーが存在するとわかると、2文字のその他のキーは総当たりでアタックされちゃうし、
vR7TLCとvR7TLvなんて近すぎるよ。下位一桁を変えるだけで別のを参照できちゃうけど?
>ベースとなる62文字を底とした対数を元に数値から各文字列を算出して、
これって分かりやすく言うとどういうことをしているの?
またはコードで書くとどうなるのですか?
62進数とか、
>>279の言うことはわかるのですが、対数とかわからなくなる。
62を底にしたとき62の対数 1
62を底にしたときの62^2の対数 2
まあ、1,2,3・・・を元に計算しましたってことだよw
>>319 なるほど。少しわかりかけてきたよ。
ありがとう。
>>317 >2文字のキーが存在するとわかると
例に在るとおり、桁数は設定できます
>下位一桁を変えるだけで別のを参照できちゃうけど?
これはわかりやすくした結果の一例なので、正しく使えば出来ませんよ
>>318 >>279とはまた違いますよ
結果はYouTubeのようなIDが生成されます。
ただ、YouTubeは末尾一桁の4byte程を許容しているようなので完全に同じってわけじゃあありません。
多分CheckDigit的な何かだと思うので、これから真似してみます。
>>321 > >下位一桁を変えるだけで別のを参照できちゃうけど?
> これはわかりやすくした結果の一例なので、正しく使えば出来ませんよ
下位一桁を順番にさかのぼれば一個前のキーがわかるのでは?
(一桁だけでさかのぼれなければ二桁さかのぼる)
数値の増加と、生成されたキーの辞書順の順番は同じじゃないの?
元となる値はひとつずつ増え、変換後の1つ前との文字列のΔが小さすぎるんじゃないのってことなんだけど。
「YouTubeのようなID」っていうから、時系列に生成されたキーを並べても辞書順にはならないものを
求めてると思ったんだけど。
本人が満足してるならそれでいいだろ
いや、その辺のこと全部わかって満足してるんならいいんだけど、ほんとにわかってんのかなと思って。
>>322 変換テーブルは任意のキーで変更でき、それはいわばランダムにシャッフルされた状態になるので
>下位一桁を順番にさかのぼれば一個前のキーがわかるのでは?
このような心配は必要ないです。
再度言いますが、
>>316の一例はわかりやすい結果にした出力です
>>325 最初のやり取りの時点でわかってるつもりでわかってない人だということがわかってる。
適切に出力しました。
これを見てまだ指摘があるならください。
5桁以上で生成
123 <=> OpkA9
124 <=> O7WjO
125 <=> Or74G
126 <=> OebeG
127 <=> 93AWG
128 <=> 9zAwE
129 <=> EL5m9
同じ条件でKey変更
123 <=> kPQ4Z
124 <=> Z4rdG
125 <=> Zgzxk
126 <=> kA2eZ
127 <=> klB8n
128 <=> Gzj6G
129 <=> ndwJZ
疑問多数なんだけど、もろもろ理解した上での満足なんだなということだけはわかったので、もういい。
332 :
デフォルトの名無しさん:2015/02/11(水) 18:26:22.06 ID:bsa0WqJ9
それが出来たらやりたい放題だなw
334 :
デフォルトの名無しさん:2015/02/11(水) 18:45:25.70 ID:bsa0WqJ9
335 :
デフォルトの名無しさん:2015/02/11(水) 20:31:02.10 ID:bsa0WqJ9
うそです!
phpのみで苦しみながらコード書いてるけど
テンプレート言語にしては
ずいぶんプログラミングみたいにこと出来ていいねphp
>>336 Framework使ってる?
苦しむことすらからも解放されるよ
php4 dbなしos限定なし設定なし
php拡張ライブラリもwindows apacheデフォルトのみ
そんな環境向けだからWAF使いずらい
Rubyのおかげでハゲが治り、体重も減って恋人も出来ましたw
341 :
デフォルトの名無しさん:2015/02/18(水) 00:25:06.29 ID:deVdAFDE
>>207 その通り!だから左右に画面を分割してコードをいじっているともっさりして大変なのだ
小規模なスクリプトしか書かないから
railsとか重いWAF覚えるには腰が重い
どうでもいいところでハマるし
PHPを利用して作成されたサイトを見分ける方法ってありますか?
拡張子が.phpであることやexpose_phpによるヘッダー情報で見分ける以外に
どういった方法があるか知りたいです。
サーバでうまく設定してればわからない
345 :
343:2015/02/19(木) 21:48:47.12 ID:lO9TT2c4
2007年の記事を未だにしつこく貼る奴ってなんだろうね
崇拝でもしてるのかな?
あまりしつこいようなら運営に荒らし通報するからな
ぼっちって、悲しいね
自演がバレちゃうから連続で煽ってこない
効果ありすぎw
350 :
デフォルトの名無しさん:2015/02/23(月) 15:44:13.42 ID:jEdpJRTO
foreach($contents as $line)
{
}
このコードでは改行文字は \n \r\n どちらで認識されるのでしょうか?
352 :
デフォルトの名無しさん:2015/02/23(月) 23:44:09.35 ID:ETApao89
あいまいな情報だが、Rubyだと改行は、外部では\r\nでも、
Ruby内では自動的に、\nに変換されていたかな?
外:\r\n → 内:\n → 外:\r\n
PHPはどうなの?
354 :
353:2015/02/24(火) 05:19:14.75 ID:hwXyjfLa
自己レス
ary = []; ary[2] = []
いったん、空配列で初期化した後なら、追加できる
ary[2][3] = []
ary[2][3] << [1, 2]
ary[2][i]で、iが5, 10など突然に、
ランダムなインデックスに、
次々と追加していくには、どうするの?
最初の1回目だけは、空配列で初期化して、
2回目以降は初期化せずに、追加のみしていきたい
355 :
353:2015/02/24(火) 05:22:45.09 ID:hwXyjfLa
354は、誤爆!
そのサーバがクライアントに何を求めてるか
求めてるものが足りないからログインできないだけでcURLは関係ないだろ
正常にログイン出来るブラウザを使ってhttpトレースして自分で調べれないならあきらめろん
>>356 自己解決
httpヘッダーにOrigin: と'Cache-Control:の要素が足りないだけでした
質問です。お願いします。
抽象クラスの抽象メソッドは、必ず継承されるので、
可視性にprivateをつけるのは有り得ないという理解でいいのでしょうか?
継承先ではprivateにしたいのですが、protectedにするしかないのでしょうか?
必ず継承されるので ではなく、
継承でオーバーライドできないから です
>>360 ありがとうございます!
>継承でオーバーライドできないから です
つまり、オーバーライドが必須なため必ずprotected以上が要求される
のですね。継承先での実装は強制したいが、その実装の可視性は
privateにするというのは無理そうですね。
ありがとうございました。
362 :
デフォルトの名無しさん:2015/02/25(水) 12:55:47.85 ID:UFHbrp38
ほんとはPHPがやりたいのに、職業訓練校だと全部JAVAばっかり
遠回りになるのかな
選択の自由が欲しいなら自費で学校池
アホ。お前等なんて誰も雇わねぇよ。レンタルサーバなり、VPSなり借りろ。
講師なんて、プログラマになれなかったような連中がやる仕事だろw
365 :
デフォルトの名無しさん:2015/02/25(水) 15:53:53.56 ID:UFHbrp38
>>364 あったまわりいなおまえ
コンビニバイトでもしてろ
職業訓練校から雇用されると思ってる方が素敵な頭だよね
あれって、講師共に体裁の良い仕事を与えるためだけのものだよ?
知らなかった?
目の前にある箱使えばドットインストールとか色々あるのに
PSRを読んでいたらプロパティは特に定めなしってなってるけど普通はどう?
「StudlyCaps」
「camelCase」
「under_score」
クラスはStudlyCaps、メソッドはcamelCaseで決定みたいだから、
そうするとプロパティはunder_scoreがいいの?
有名どころのライブラリに倣えばいいんじゃ?
>>370 なるほど。ライブラリやFW等を調べてみます。
ありがとうございました。
そういやcakePHPは結構細かく決まってた気がするな
ファイル名とかDBのテーブル名も含めて
フレームワーク自体そこらへん厳密に決めておかないといけないものだし
フレームワークだから決めなければならないってことはないよ。
そのあたりの命名に制約を課す代わりにメリットを享受できるフレームワークだってことだね。
コネクション張りっぱなしの状態でもxhrで非同期通信が出来ますが
この時通信先のスクリプトでsession_start()をしていると
応答がものすごい長くなります(たぶん張りっぱなしのコネクションがタイムアウトしてから応答が来る)
session_start()をしなければ早く応答が来るのですが何が原因でしょうか?
376 :
375:2015/02/27(金) 21:59:03.00 ID:NM1bEzGX
ちなみに張りっぱなしのほうでもsession_start()しています
377 :
デフォルトの名無しさん:2015/03/01(日) 16:03:20.30 ID:NDBOI03r
質問です。
変数をダブルクォート内に書くとき、
echo "$var";
echo "{$var}";
echo "${var}";
;
のように3通りの書き方がありますが、
どれがいいのでしょうか?
使い分け方とかがわかりませんので教えてください。
>>377 気が向いたのでこたえる。変数を書くだけなら波括弧はいらない。
配列や可変変数を使いたいときは、どこまでが $ の範囲かを分からせるために波括弧が必要な場合がある。
$array = [1, [2, 3]];
echo "$array[0]\n"; // 一次元なら OK
echo "$array[1][0]\n"; // NG ($array[1] までが $ の範囲と解釈される)
echo "{$array[1][0]}\n"; // OK
$var = 4;
$varName = 'var';
echo ${$varName} . "\n"; // OK (知らなきゃ "PHP 可変変数" でぐぐれ)
echo "${$varName}\n"; // OK
$arrayName = 'array';
echo ${$arrayName}[0] . "\n"; // OK
echo "${$arrayName}[0]\n"; // NG (${$name} までが $ の範囲と解釈される
echo "{${$arrayName}[0]}\n"; // OK
マニュアル嫁
http://php.net/manual/ja/language.types.string.php http://php.net/manual/ja/language.variables.variable.php (可変変数)
ただ個人的には、もし
>>377が職場の後輩だったら、こんな文法を駆使したプログラムなんか読み難くて糞だから厨二で卒業しろ
ちゃんと変数に代入して普通にechoしろって言う
379 :
デフォルトの名無しさん:2015/03/01(日) 16:44:13.52 ID:NDBOI03r
>>378 なるうほど、可変変数や配列を使う以外は使用する必要がないといことですね。
そうでない場合(単に文字列を収めた変数)にも{}を使用している記述を見かけたので質問しましたが、そのサイトが誤ってるということですね。
ありがとうございました。
>>362 JavaやっときゃPHPは簡単だぞ。逆は難しい
ギターとベースのような関係だ
PHP的には、
echo "{$var}";
の書き方だけやっときゃいいんじゃないの?
echo "${var}";
は、シェルスクリプト由来だと思うけど、例によって「余計なもの」つけちゃった仕様でしょ。
Javaなんて企業勤めでもないと何の恩恵もないよね
○○やっておけば楽っていうのならJavaじゃなくてC言語勧めるわ。
そうだなぁ。Cを"ちゃんと"使える人は基礎が出来てるからね。
気が向いたのでこたえる(キリッ)
意訳
簡単な質問だから答えられる
可変変数だけじゃなくて、 $var という変数で "$varvar" で困るからだし、
使う使わないはともかく、読める必要はある
単純に、{ }で囲った方が読みやすいというのもあるな。
多次元連想配列についての質問です。
$fruits[0]= array("kind_id" => "1", "name" => "ミカン", "from" => "和歌山", "seisan" => "山田" );
$fruits[1]= array("kind_id" => "1", "name" => "ぽんカン", "from" => "愛媛" ,"seisan" => "佐藤" );
という配列を
$fruits[1][ミカン] = array("from" => "和歌山" , "seisan" => "山田" );
$fruits[1][ぽんカン] = array("from" => "愛媛" , "seisan" => "佐藤" );
という形にしたいです。
↑の例はkind_idとnameがキーとなりましたが、このキーの個数も汎用性があるようなプログラムにしたいです
日本語変ですがよろしくお願いします
foreach($fruits as $v)
$arr[$v['kind_id']][$v['name']] = array('from'=>$v['from'],'seisan'=>$v['seisan']);
>>388 <?php
$fruits = array(
array(
"ミカン" => array("from" => "和歌山", "seisan" => "山田"),
"ポンカン" => array("from" => "愛媛", "seisan" => "佐藤")
)
);
print_r($fruits);
print_r($fruits[0]);
print_r($fruits[0]["ミカン"]);
>>388です
お二人ともありがとうございます
すみません、言いたいことが伝え切れてなかったのです
結果はお二人ので合ってるのですが
・ループを使いたい
・キーが増えた時に汎用性があるものにしたいのです
イメージ的には
>>389のを汎用性があるように改造する感じです
今回の場合だとキーが2つなので
$keys = array("kind_id" ,"name");
というキーを指定する配列があるとします。
$keys = array("kind_id" ,"name","seisan");
のように増えた時にも対応したいのです。
自分で考えたのは
$keys = array("kind_id" ,"name");の場合
foreach($keys as $k){
ここで
$fruits[kind_id][name] = array();
という連想配列を作る
}
これに
>>389の
foreach($fruits as $v){
$arr[$v['kind_id']][$v['name']] = array('from'=>$v['from'],'seisan'=>$v['seisan']);
}
を組み合わせたいです
$keys = array("kind_id","name","from");
$fruits[0]= array("kind_id" => "1", "name" => "ミカン", "from" => "和歌山", "seisan" => "山田" );
$fruits[1]= array("kind_id" => "1", "name" => "ぽんカン", "from" => "愛媛" ,"seisan" => "佐藤" );
$arr=array();
foreach($fruits as $v){
$r = &$arr;
foreach($keys as $key){
if (!array_key_exists($v[$key],$r)) $r[$v[$key]] = array();
$r = &$r[$v[$key]];
}
$r = array_diff_key($v,array_flip($keys));
}
print_r($arr);
全然違うよって話になるかもしれないけど、
その変換後のデータ形式を元に表を作りたいという要件なら
変換前のデータ形式のまま、連想配列のキー名を指定すれば表になるようなものを目指したほうがいいと思う。
>>388です
>>393 何度もありがとうございます!
明日にならないと確認できないんですが、こんなやり方思いつかなかったので嬉しい
>>394 気にしてくれてありがとうございます
実はこれやりたいことの一部なので…
ちなみにやってることは、
2つのDBの同じデータが入ってるけど、カラム名が違う2つのテーブルのデータがホントに合ってるか比較するプログラムを作ってます
それの一部です
ここで言う$keysが比較するとき同じレコードを引っ張って来るためのユニークなカラム名で、
$fruitsがデータです
>2つのDBの同じデータが入ってるけど、カラム名が違う2つのテーブルのデータがホントに合ってるか比較する
SQLで出来るんじゃね?
>>396 実はおっしゃってる、SQL飛ばすバージョンのプログラムはもう出来てるんです
そっちの方が簡単ですよね
でもレコード数多いテーブルが結構あるらしく、上司に↑とは別に今回のプログラム(SQLは最低限しか投げずデータ取得し、プログラムでどうにかするというもの)を作れと言われ…
研修みたいなものです
力量を試すものなら人に投げちゃダメでしょw
>>398 そうなんですけどわからなかったもので…サーセンw
>>397 ・上司案
データ取得:比較元、比較先の2回クエリ発行
データ比較:ロジック
DBサーバとの通信量:多い
・みんなの案
データ比較結果取得:クエリ1回
DBサーバとの通信量:少ない
>>388です
連想配列回すのとSQL飛ばすののサーバへの負荷の差はわからないですが、プログラムで処理しすぎるのも微妙ですよね
〆ます
皆さんありがとうございました!
比較元のデータ抜いてきて、1件ごとにクエリ投げるようなお馬鹿なことしてなければ。
mysqlのdbとposgresqlのdbにjoinしたsqlを投げることはできますか?
なぜ試してから質問しない
>>403 おまえのデバッグの為にここに人間がいるわけじゃない。
試しもせずに質問するような馬鹿は、板に来なくていい。
おまえじゃ、100万年経っても何もできないと言っておく。
RDBMSをまたいでJOINしたいんじゃねーのw
アパッチ経由(ブラウザ)だと意図した結果になるんだが
ターミナルで実行するとエラーが出て動かない。
ターミナルPDOでデータベース接続していて、pdo接続時にエラーCatchして”ドライバがない"と表示されるが処理は進み
その後”PDOオブジェクトが生成させれていない”と表示され処理が終了する。
アパッチ経由だと接続して結果もちゃんと表示される。
ただしPDOオブジェクトをprint_r()で確認すると中身空っぽ(生成はされている)
PDOオブジェクトが空でもデータベースは接続されるのか?
それとも他になにか原因があるのか?
両方で phpinfo()して違いを見れば分かるだろ
それぞれの設定は変えられるんだよ
質問です。
よろしくお願いいたします。
PHPでの並列処理なんですが、
exec("nohup php -f omoi.php > /dev/null &");
return true;
omoi.phpは1分程度かかる処理なんですが、
期待してるのは、即時trueの返却、別プロセスでomoi.phpの処理なのに、待たされてしまってます。
で、プラットフォームは何なの?(´・ω・`)
411 :
デフォルトの名無しさん:2015/03/08(日) 17:48:55.01 ID:q94065c/
execはwindowsでは同期だ。他OSはしらん。
基本非同期で同期にするのが困難なnode.js使えば。
>>409 stderrに何か出てるというオチはないの
>>410 プラットフォームですか、、
サーバはhetemlなんですが、、
なんて答えたらいいんでしょう?
php ver5.4.27です。
#下記をphp.phpとしたら
<?php
function init(){
exec("nohup php -f omoi.php > /dev/null &");
return true;
}
init();
?>
php.phpにPOSTがあったら、即trueを返して別プロセスでomoi.phpを動かしたいのです。説明不足ですいません。
>>412 確認してみます。
phpって並列処理するならpthreadsでしょ
>>414 ということはレンサバではキツそうですね。。。
VPSでやってみようと思います。
ありがとうございました!!
バックグラウンドプロセスで起動するのとスレッド起こすのではずいぶん話が変わるけれど。
とりあえずstderrも捨てるようにして試してみたら?
ちなみに、これの真偽についてはしらないけど、そうなの?
> execはwindowsでは同期だ。
あああと、通常プラットフォームといえばOSを指すよ
>>416 /dev/nullはUNIX系OSのコマンド
Windowsでは認識されないから処理が止まる
解決策はManualに載ってる
コマンドとは言えないが
超初心者です。お願いします。
mac os x 10.9.5
eclipseの日本語設定の質問です
ネットで見たままのやり方でpleiadesの中身を貼ったりiniで最後に-javaagent:../../../plugins/jp.sourceforge.mergedoc.pleiades/pleiades.jarを追加しました。
しかし追加する前は起動するのですが、追加後は起動しません。
いくら調べても解決策がわからないので質問させて頂きました。
拙い質問ですが答えて頂けたら大変助かります。
汎用くだ質じゃないですよ
>>409 >>416 ありがとうございます。
/dev/null 2>&1
としてみましたが、やはり処理が終わってから trueが返ります。
並列と書いてしまいましたが、確かに並列ではなくバックグラウンドプロセスでした。
その処理の終了を待たずにtrueを返したいということが目的でした。
今更ですが、仕様としてはPOSTにてXMLが送られてきて中身を解析し、大体1000レコードぐらいをDBにインサートします。
構造は1対多になっているので、紐付くhasmany側を入れると1000*〜となります。
重複チェックもあり、クエリ数は相当数となります。
XMLでレスポンスを返すのですが、相手のタイムアウトが30秒で、処理を終わるのを待ってからでは難しいのでできないかな?と思いました。
引き続き悩んでみます。
2>&1 はstderr出力をstdoutに回す指定だ。 & はそれとは別につける
でも結局 nohup.out に出るような気が
>>423 1> /dev/null 2> /dev/null
1> /dev/null 2>&1
とかやってみましたがダメでした。
nohupも取ってみましたがダメでした。
受け取ったXMLをDBなり、テキストなりに保存して、重い処理はCronをとか考えるようになっていますが、レンサバではあまり短い時間でcronを実行できないので、やっぱりVPS?とかいろいろ考えてます。
標準出力のリダイレクトのこと、今回初めて調べたのですが勉強になりました。
今までは「cronでメール送信を止めるもの」な理解でした。
アドバイスくださった方々ありがとうございます。
できました!!
> /dev/null 2> /dev/null &
としたらできた!
ふとstackoverflowを確認したらこう書いてあって、試したらできました。
この&の意味がよくわからないので、調べてみます!
ありがとうございました!失礼します!
linuxのお勉強からどうぞ