PHP質問・雑談スレ5【初心者お断り(ROM歓迎)】
■ このスレッドは過去ログ倉庫に格納されています
PHPに関する質問や雑談をするスレです。
初心者お断り(ROM歓迎)と書いてますが、初心者用のスレが用意されているからで、
難しい質問や話題をしなければいけないわけではありません。
PHPマニュアルの読み方を概ね理解していて、関数リファレンスが正しく読める方用のスレです。
PHP未導入の方や、手取り足取りが必要な初心者の方はム板のくだスレへどうぞ。
https://mevius.5ch.net/tech/ (【PHP】で板内を検索)
前スレ
https://medaka.5ch.net/test/read.cgi/php/1498653249/
その他リンク
・PHPマニュアル
https://secure.php.net/manual/ja/index.php
・コードテスト・貼り付け用
https://ideone.com/
・プログラミングのお題スレ (求PHPer参戦)
https://mevius.5ch.net/test/read.cgi/tech/1538096947/
このスレで扱う話題
・PHPのコード,設定や設定値に関する質問
・常識的範囲内でのコードレビュー依頼・改良相談
・PECL,PEARに関する質問
・PHP新機能やPHP関連トレンドの話題
(FWや非公式ライブラリの話題や特徴比較は良いが使い方から先の話題は専スレへ)
・PHPのバグ発見報告・公式に報告する前の検証依頼
このスレで扱わない話題
・直接関係ない○○特有の質問(専スレへ)
(HH,エディタ,IDE,サーバ,OS,DB,SQL,FW,テンプレート,非公式ライブラリ・アプリケーション等)
・PHPの改造 ソース渡す時点で対策しても無意味だな ソース読める人がみたらすぐバレる
ソース読まない前提ならipチェックでもいれればいいかと >>201
if(ip==xxx){
}
if(ip_address_dummy!==xxx){
}
address_ip==xxx ? foo() : bar();
if(sitename==yyy){
}
if(sitename_false!==yyy){
}
とず〜〜〜っと書いて
「これなら1から書いたほうが早い!」
と思わせることができればコピーされないという手法を思いついた
なお自分が死ぬ模様 exeファイルならクラッキングの難易度をいくらでも上げることができるけど
ソースファイル渡しちゃったらどうぞ改造してくださいと言っているようなもの >>203
ipとかで抽出かけちゃえばどの行で対策してるかすぐバレちゃうよ 一見動くようにして、たま〜〜〜に動かなくなるとかでいいんじゃない
/* ここ見てるって事はコピーされたんですねwwwちーっすww */
とか煽っとけばok 相手がどのレベルかによるだろう
ソース丸見えのインタプリタの場合リバースエンジニアリングもくそもないしな
何したって無駄であるしライセンス条項に明記して
違反した時の脅しをかけるしかない そういやサーバーのipってメンテとかで変わる事あるの?
xサーバーとかsakuraとか サーバがどういう運用してるかによるだろ
元々動的IPでDDNSで運用してるならともかく
固定IPプランで固定IP前提で運用してるのに(DNS更新は手動)
それが勝手に変わっちまったらサーバを利用してる事業者は
外部からアクセス不能(IP直打ちで物理的には可能だが)になり
事実上のサービス停止を余儀なくされ信頼が低下する
そんなサーバを提供した事業者は例え免責事項に責任取らないと書いてたとしても
過失が大きすぎて可能な限り最大の損害賠償を請求できるレベル アクセス可能なら覗かれるに決まってんだろ
アクセス不可能なら覗かれないに決まってんだろ 別に覗かれても困るようなもんじゃないけどな
レン鯖業社とかphpinfo普通に公開してるし 今PHPの試験受けるより来年2月からの方がいいよね 初心者以前のくっだらねえ質問続いてるようですが
スレチじゃないっすか〜 FWでORMとか使わないでPDO使うのってアリ?
Laravelに興味があるんだけど遅いことで悪名高いEloquentは使いたくない
PDOはクエリ直接書かんといけないからそれはそれで別の問題が出るけど
Laravelみたいな低速FWを少しでも高速化しようとなると仕方ないよね >>219
pdo自体が完成されたクラスだから
あえてORMなんか使うよりクエリーの中身が見えるからパッと見わかりやすいし
あとデバッグもしやすい >>220
SymfonyでDoctrineバンドルを使ってれば
ログにクエリーを記録したり、
プロファイラー(ブラウザで動くデバッグ用のツール)でクエリーを表示出来るので
そこまで不便は感じない
それどころかプロファイラーでは
explainを見たり、フォーマットされたクエリーやパラメータを埋め込んだ状態のクエリーも表示可能
DBALはORMより抽象度が低い
異なるプラットフォームのDBの抽象化とスキーマ管理のみに特化している RedBeanPHPは使ったことないが
アノテーションやXMLを使ったスキーマ定義が不要とか(開発中に自動的に作られるから)
DoctrineみたいにQuery Builderがなくて
普通のSQLっぽく書けるのが特徴のようだ
5分で分かる公式のクイックツアー
https://redbeanphp.com/index.php?p=/quick_tour PDOが抽象化するのはDBへの接続だけでSQLの抽象化はほぼ行わない
その部分が必要になったら結局自分で書くかライブラリ使うかになる
というか計測もせずに速度のことを考えたってどうにもならん
とりあえずEloquentなりDoctrineなり使って組んでみて後でボトルネックになるようなら必要な部分を最適化する 最近はSQLベタがきする人を馬鹿にするような風潮があって嫌だ Doctrine DBALやORMでもQuery Builder使わずに
直接DQL/SQLを書くのは出来る ハードコーディングしないに越したことはないが
SQL書けない人がコーディング出来る怖さも感じる
高級プログラマーはアセンブラやれってレベルの老害話に聞こえるかもしれん いや、SQLくらい自分で書けよw
html並に簡単すぎるんだが 並べてるのがHTMLな辺り分かって書いてるんだろうなぁと思う HTML並って動くだけってならそれでもいいけど
高負荷な実用に耐えるようなSQLかけるようになるには
結構なスキルと知識が必要 いやそんなにスキルいらんわ
件数数えるのクッソ重い!!!!
↓
件数記録するテーブルつくって終了
JOINクッソ重い!!!!
↓
JOINしないでJOIN元テーブルに列追加してそっちに必要なデータ入れて終了
とにかくデータ多すぎて重い!!!!
↓
パーティションつくって終了 x スキルいらない
o スキルない>>232はこれしかできない >>232のような素人は下手にSQL書くよりORMやクエリビルダに任せたほうがいいだろうな
ハイパフォーマンスが必要な場合は高度なスキルを有するDBエンジニアにまかせればいいわけだし
スタートアップやITドカタには必要 >>234
んなわけねーだろバーカ笑笑
>>235
だからクエリービルダ使ったらどう速くなるんだよ?
答えろ >>236
君がいるとプロダクトが汚れる
はよ廃業しろ世の中のためだ >>237
いいから答えろ
クエリービルダ使ったらどう速くなるんだよ!!!!!? え、今ってSQLをViewに登録とかしないの?
最近NoSQLばっか使っててSQLDB知らんけど Viewなんかつかわないよ
移植性が悪くなるし保守が大変 最強はSpefificationパターンだろ
QueryBuilderでは検索条件の再利用が難しい
Happyr Doctrine Specification
https://github.com/Happyr/Doctrine-Specification
This library gives you a new way for writing queries. Using the Specification pattern you will get small Specification classes that are highly reusable. 生のSQL使うかどうかってのが問題の本質であってだな >>216
結論としてはQueryBuilderを使うと速くなるってことだ Cでインラインアセンブラ使うってのと通ずるとこがある ORMやクエリビルダは、メリットあるのか??
ふつうにSQL書けばいいじゃん。 取得したデータに型があった方がIDEでの補完が出来て分かりやすい
phpstanでエラーの検出も簡単になる
OneToManyの関係にある物も扱いやすい
QueryBuilderは関数と関数の間で受け渡しして
検索条件を追加していけるメリットがある
文字列連結で同じ事やるなんて間違えやすくて面倒 素のSQL書くよりQueryBuilder使ったほうが動作が速いらしい ORMにしてもQBにしても所詮ラッパーだし
ステップ数が増えるのに早くなるわけないわ 毎度思うがそれをいったら話が進まねえだろ
PHPが遅いなら遅いなりに速度を求めるってのは別に悪い話題じゃない 駐留型でない再起動不要 インタプリタ
この辺の条件じゃPHPは一歩頭抜けてるのでは? 駐留型って言葉はじめて聞いたけど、IT用語?
てかCGI実行でなければPHP.iniの設定変更したらWebサーバの再起動は必要よ。 よほど計算負荷の高いアプリケーションでない限り
ボトルネックはPHPではなくデータベースになる >>256
いやそういうことでなくファイル差し替えで
プログラムをメモリにロードするタイプって意味でいったんだが
駐留じゃなくて常駐って言いたかったん PDOにてプリペアドステートメントを使用してmysqlにUPDATEを実行したいと思っています
値0x0001をバイナリで設定したいのですが、プレースホルダを使用して実行すると意図しない結果になってしまいます
どのようにすればよいでしょうか?
//成功パターン
$stmt = $pdo->prepare('UPDATE users SET progress = 0x0001 WHERE id = ?');
$stmt->execute([$_SESSION['id']]);
設定される値:0x0001
//失敗パターン@
$stmt = $pdo->prepare('UPDATE users SET progress = ? WHERE id = ?');
$stmt->execute([0x0001,$_SESSION['id']]);
設定される値:0x3100
//失敗パターンA
$stmt = $pdo->prepare('UPDATE users SET progress = ? WHERE id = ?');
$stmt->execute(['0x0001',$_SESSION['id']]);
設定される値:0x3078
//失敗パターンB
$stmt = $pdo->prepare('UPDATE users SET progress = ? WHERE id = ?');
$stmt->bindValue(1,0x0001, PDO::PARAM_INT);
$stmt->bindValue(2,$_SESSION['id'], PDO::PARAM_INT);
$stmt->execute();
設定される値:0x3137
//失敗パターンC
$stmt = $pdo->prepare('UPDATE users SET progress = ? WHERE id = ?');
$stmt->bindValue(1,'0x0001', PDO::PARAM_STR);
$stmt->bindValue(2,$_SESSION['id'], PDO::PARAM_INT);
$stmt->execute();
設定される値:0x3078 phpは複数書き方がある時、どれがベストかを教えて欲しい
気づかない内に非推奨、廃止とか悲しい PDO::PARAM_バイナリ みたいなやつってある? >>261
配列を直接指定せず変数に代入してからだとうまくいくのでは? bit(16)にして"b'".base_converter('0x0001', 16, 2)."'"とか? $sql = "insert into test (
progress
) values (
:progress
)";
$stmt->bindValue(':progress', 0x0001, \PDO::PARAM_INT);
これでできた
やり方じゃなくて確認の仕方を間違えてたりしない? 目的は16進数表示(0x〜〜〜)のデータをint型でDBに格納したいで合ってる? 配列
$arrayは$array[0]と同等とのこと
ならば
$array="foo";
を
$array="foo";
$array[]="bar";
とするとエラーになりました
これは、
$arrayは$array[0]と同等に”見做してあげてる”という感じなのでしょうか? コードかくとなぜかブロックされてかけねーから日本語でかくけど
失敗パターン3で
プログレス=キャスト(? as ヴァーバイナリ(n))
とかDB側でキャストすればいいんじゃね?
試してないけど >$arrayは$array[0]と同等とのこと
え? >>268
$array=“foo”の意味
“foo”という文字列を変数arrayに代入 ←配列の変数じゃない
$array[]=“bar”の意味
“bar”という文字列を配列変数arrayに代入
エラーになるのはarrayが配列の変数じゃないのに
“bar”を突っ込もうとするから >>270
c言語にそういうのが合った気がする
ただ、単純に見づらすぎるので書い
たことないけど すいません、なにか勘違いしてたようです
特に意味もないようなので、
array[0]
と書くようにします >>272
Cにだってそんなものはない
array[i] と i[array] が同じ(どっちも *(array * i) の糖衣構文)というのはあるけど c言語だったら参照の話じゃない?
&arrayと&array[0]は一緒 (だった気がする) >>276
あぁ、多分それです
お騒がせしました、申し訳ありません ありがとうございます
教えていただいた方法を色々試してはみたのですがやはりどうもうまくいかず、
DB側の型をINTにして対応することで想定通りの動作にできました
実はもう一点悩んでいるところがありまして、
jQueryのAjaxからPOSTでPHPを呼び出すと、呼び出し元からのPHPセッションが切れてしまいます
そもそもこういう使い方はできないのか、何か間違っているのか教えていただきたいです。
js部分が若干スレチ気味かもしれませんが、よろしくお願いします。
//update.js
function Update(){
$.ajax({
type: "POST",
url: "update_progress.php",
data: {
progress: 0x0001
},
}
}
//update_progress.php
<?php
session_start();
(中略)
$stmt = $pdo->prepare('UPDATE users SET progress = :progress WHERE id = :id');
$stmt->bindValue(':progress',$_POST['progress'], PDO::PARAM_INT);
$stmt->bindValue(':id', $_SESSION['ID'], PDO::PARAM_STR); //$_SESSIONがNULLになる
$stmt->execute();
(後略)
?> ajax使ったことないから分からんのだけど
クッキーは送られてるの? クロスドメイン?
このページをみると色々設定してるみたいだけど ぱっと思いつく要因は二つ
・クッキーが送られてない
・セッションが切り替わってる ありがとうございます!
クッキーかもしれません
送り方を調べています >>261では$_SESSION['id']と小文字になってるが >>284
送り方調べるより先に原因調べたほうがいいよ
・ブラウザにクッキー(PHPSESSID)が保存されているか
・ブラウザからpost先(update_progress.php)にクッキーが送られているか >>285
すみません、こちらにコードを起こすときに打ち間違えたみたいです
大文字になってるのが本来は正しいです var_dump($_SESSION)もやってみてくれ >>286の調べ方は
クロームだったら
・アドレスバー左のアイコンをクリック → クッキーを見る
・右クリック→検証→Networkタブをひらく→update.js実行→通信が発生してグラフに線が表示されるのでクリック→リクエスト名をクリック→中段のcookieタブを開く >>289
正常にセッション情報が取得できるページで使用しているクッキーに保存されているPHPSESSIDと、
update_progress.phpに送信されているRequest CookiesのPHPSESSIDは同じになっていることを確認しました
なんでだ... var_dump($_COOKIE)は表示される? >>292
直前のページで使用しているクッキーのPHPSESSIDと同じものが表示されます print_r(ini_get_all('session'));
でもみてみれば >>293
PHPSESSIDを仮に”abc”だとして
1)
直前のページでセッションデータ保存する
→ var_dump($_SESSION) セッションデータ表示される
var_dump($_COOKIE) “abc”が表示される
2)
update.js実行
→ var_dump($_SESSION) セッションデータ表示されない
var_dump($_COOKIE) “abc”が表示される
↑今こんな状況? すみません分割になります
[session.auto_start] => Array
[global_value] => 0
[local_value] => 0
[access] => 2
[session.cache_expire] => Array
[global_value] => 180
[local_value] => 180
[access] => 7
[session.cache_limiter] => Array
[global_value] => nocache
[local_value] => nocache
[access] => 7
[session.cookie_domain] => Array
[global_value] =>
[local_value] =>
[access] => 7
[session.cookie_httponly] => Array
[global_value] => 0
[local_value] => 0
[access] => 7
[session.cookie_lifetime] => Array
[global_value] => 0
[local_value] => 0
[access] => 7
[session.cookie_path] => Array
[global_value] => /
[local_value] => /
[access] => 7 [session.cookie_secure] => Array
[global_value] => 0
[local_value] => 0
[access] => 7
[session.gc_divisor] => Array
[global_value] => 100
[local_value] => 100
[access] => 7
[session.gc_maxlifetime] => Array
[global_value] => 1440
[local_value] => 1440
[access] => 7
[session.gc_probability] => Array
[global_value] => 1
[local_value] => 1
[access] => 7
[session.lazy_write] => Array
[global_value] => 1
[local_value] => 1
[access] => 7
[session.name] => Array
[global_value] => PHPSESSID
[local_value] => PHPSESSID
[access] => 7
[session.referer_check] => Array
[global_value] =>
[local_value] =>
[access] => 7 [session.save_handler] => Array
[global_value] => files
[local_value] => files
[access] => 7
[session.save_path] => Array
[global_value] => /tmp
[local_value] => /tmp
[access] => 7
[session.serialize_handler] => Array
[global_value] => php
[local_value] => php
[access] => 7
[session.sid_bits_per_character] => Array
[global_value] => 4
[local_value] => 4
[access] => 7
[session.sid_length] => Array
[global_value] => 32
[local_value] => 32
[access] => 7
[session.upload_progress.cleanup] => Array
[global_value] => 1
[local_value] => 1
[access] => 2
[session.upload_progress.enabled] => Array
[global_value] => 1
[local_value] => 1
[access] => 2 [session.upload_progress.freq] => Array
[global_value] => 1%
[local_value] => 1%
[access] => 2
[session.upload_progress.min_freq] => Array
[global_value] => 1
[local_value] => 1
[access] => 2
[session.upload_progress.name] => Array
[global_value] => PHP_SESSION_UPLOAD_PROGRESS
[local_value] => PHP_SESSION_UPLOAD_PROGRESS
[access] => 2
[session.upload_progress.prefix] => Array
[global_value] => upload_progress_
[local_value] => upload_progress_
[access] => 2
[session.use_cookies] => Array
[global_value] => 1
[local_value] => 1
[access] => 7
[session.use_only_cookies] => Array
[global_value] => 1
[local_value] => 1
[access] => 7
[session.use_strict_mode] => Array
[global_value] => 0
[local_value] => 0
[access] => 7
[session.use_trans_sid] => Array
[global_value] => 1
[local_value] => 1
[access] => 7 session.save_pathのところにセッションファイルが保存されていると思うけど
>>295の(1)から(2)に遷移するタイミングでファイルが上書きされてる? ■ このスレッドは過去ログ倉庫に格納されています