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の改造 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)に遷移するタイミングでファイルが上書きされてる? セッション保存した後にunset関数呼んじゃってるとか? >>301 上書きされていました たぶんこいつが原因ですよね なんでや... >>302-303 ログアウト処理では行っているところもありますが、それ以外だと無い感じです そのテストはどの環境でやってる?本番?ローカル? 本番なら共用サーバー? session_destroyかsession_regenerate_id実行してる位しか思いつかない 共用サーバなら/home/user/public_htmlがドキュメントルートだとして /tmpじゃなくて/home/user/tmpとかに変更するとうまくいく場合がある >>310 再現しないよ cookie無効になってるだけでは? update.jsは正常に動作してる? jquery読み込めてなくてajaxが動作してなくてupdate.php叩けてないとかじゃない? >>312 叩けてなければセッションが取れないとか言わないでしょう たふん… どっちにしろPHP関係ない可能性大だね 謎だね ブラウザから直打ちでupdate.php叩いたらうまくいくの? ajaxに関係なくセッションデータが利用できない環境なのか ajaxが絡むとセッションデータが利用できなくなる環境なのか ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる