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の改造 よほど計算負荷の高いアプリケーションでない限り
ボトルネックは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が絡むとセッションデータが利用できなくなる環境なのか ちなみに俺も(>>311とは別人)ローカル環境で試してみたけど上手くいった とりあえず書いておくがGCPのGAEで確認したがIE11のセキュリティゾーンがインターネットだとcookieがガードされてセッションは取得出来なかった
セキュリティゾーンを信頼済みに変えるとOK
スレチなのでこの辺で PHP側で確認するならタイムアウト時間とかセッション管理をDBにしてみるとかか? 遅くなりすみません
>>312
再配布いいんだっけと思って、jquery同梱していませんでした
update.js自体は動作しました
>>314
update.phpのPOST要素を無くして、login.php開いてる状態からupdate.php直打ちしてもうまくいきませんでした
>>316
$_SESSIONが拾えなくてSQL失敗しててもjs側では成功と表示されるのですが、
そういう意味ではなく・・・?
使ってる環境がバリュードメインのコアサーバー+Chromeなんですが、そのせいなのかな・・・ >>321
セッション拾える
>update.phpのPOST要素を無くして、login.php開いてる状態からupdate.php直打ちしてもうまくいきませんでした
セッション拾えないって意味? login.phpでセッション保存できてもupdate.php直打ち実行で
セッション表示されないって話ならajax関係ないな 別ブラウザ、別PC・スマホとか端末かえてみてもだめなら、
サーバ側に問題があるのでは?
ユーザ設定ファイルのphp.iniや.htaccess設置してたら削除してみたり、
cronの設定削除してみたり、
削除してだめならsave.path変更とか、phpのセッション周りの設定変えてみたり、
レンタルサーバだと問題の特定は難しいけど、
デフォルトでPHPセッションがおかしくなる環境が提供されてるとは考えにくい。 お世話になっています
セッションが切れてしまう問題ですが、原因がわかり問題が解決いたしました
結果を言いますと、update.phpの先頭1行目に空白の改行があったことが原因でした
本番用のコードにもテスト用の最小構成コードにも空白行があり、そのため動作していなかったようです
色々手助けしていただき助かりました
ありがとうございました 解決してよかったけど、うーん、死ねってのが本音だぁ・・・ 「再現可能な」←再現しないコードをばら撒いて騒いでました
ペチパーはほんと民度が低いな きっとおまえんちの部屋の中も
お前のコードと同じように無秩序で
足の踏み場もない汚部屋なんだろうな IDE(いったい 誰が気にする ええじゃないか)を使えばジャンプできるから問題ない 再現したコードをこのスレに上げたけど環境によって
再現しないって話だからしょうがないと思うけどな
まー次からはこのスレ使うといいよ
【PHP】下らねぇ質問はここに書き込みやがれ 10
http://mevius.5ch.net/test/read.cgi/tech/1543392526/ よくしらんがバリュードメインのコアサーバーって
無料のやつで先頭に広告が挿入されるようなやつか?
そうだとしても先頭空行でPHPが機能しないとか謎すぎる なるほど、headers already sentか。
確かにsession_start()はset-cookieしなきゃいけないからな。
しかし完全にオマ環だな。こりゃエスパーでも難しい。
WARNINGまで切っちゃってるのはレン鯖にありがちだが、
開発段階ならちゃんとerror_reportingだすようしないと。 俺のローカル環境php.iniみたらoutput_buffering 4096になってたわ
>>261のレンサバはオフになってるのだろう 気づけばプロ並みPHP読んでるけど難しというより面倒くさすぎて挫折しそう
会員登録システム作るだけでこんな面倒くさいのかよ 俺は今PHPで汎用型POSレジシステムを構築しようとしているぜ >会員登録システム
これはかなり鬼門だぞ。フレームワーク使ったほうが良い
セキュリティ方面はマジで沼だから初心者が手を出すべきじゃない 初心者から勉強するならフレームワーク使うな
自分でセキュリティ含めて考えながらやるべき
その後フレームワークを使え 期間決めて考えながらプロトタイプを作ってみる事はアリだと思うけど、
それをそのまま本番で使ってしまわないか心配だ ろくなフレームワークすらなかったPHP4の時代から独学で身につけたけど
今からPHPやるならフレームワークから入るってのもありなのかね
※今からやるなら他の言語をやれというのは無しでw
色々と便利なものはたくさんできたが
昔はウェブアプリといえばperlかPHPって感じで選択肢はあまりなかったけど
今から始める人は、選択肢がたくさんありすぎて訳わかんなくなったりするんだろうな 最近は古い記事が検索にかかりにくくなっているから大分マシじゃないかな
昔は古い記事が普通に残っていたので本当に混乱してたわ でもPHP関係の質問を見てると
未だにDB処理にリペアドステートメント使ってないとか
酷いのになると mysql 関数をまだ使ってるとか
結構あるんだよなぁ
ああいうのは何を見てまねしてるんだろ
PHPならまずはこの本を読め!ってのが無いのも問題か
ひょっとしたら今は決定版みたいな本があるのかもしれないが
少なくとも俺はPHP関係の本を買った事が一度もないw mysql 関数はmysqli 関数に置き換えれば済む・・・そう思っていた時期が僕にもありました
古いwordpressは内部的にmysql関数使っててびびったゾ 別にmysqliでもいい
無理してPDOにする必要はない
公開するわけじゃないし
結局PDOで書いても対応DBは1つなんだから PHP使ってるならSQLiteを使わないのはもったいないと思うけどね
個人の趣味程度のサイトならSQLiteの方がよほど手っ取り早い
もし負荷的にSQLiteで問題が出てきたらMySQLに変える
なんて事が、PDO使ってたら一瞬でできる
MySQLでしか使えない関数ももちろんあるけどさ
基本的なSQLはほぼ完全互換だし(当たり前) まずAUTOINCREMENTとAUTO_INCREMENTとSEQUENCEで既に違うのが面倒い
複数DB対応するならSQLを抽象化したい >>349
>基本的なSQLは「ほぼ」完全互換
ライトユーザーはwordpressだし、その辺がねぇ >>350が全部言ってるけど
結局PDOじゃ修正が必要になるわけで
将来的に別DBへのアップデート考えてんなら
最初からORM使っとけよって話だし >>351
WordPressはSQLite使えるでしょ
ひょっとしたら今のバージョンは使えなくなってるのかもしれないけど
つまり、実際にMySQL⇔SQLiteを柔軟に切り替えられるものはあるってこと
ライトユーザーこそWordPressなんか使っちゃ駄目だと思うんだよなぁ
2018年末頃頃だけでもプラグインの致命的な脆弱性のニュースを
何回も見て笑ってしまったw
そりゃ乗っ取られもするわ ”個人の趣味程度”って話へドヤ顔でORMとか言われても…な
sqliteはたしかに楽だよな
ファイルがロックしちゃうのが弱点だが更新の少ないウェブアプリなら全然あり >353
どんなFWでも使えるし、プラグインなら更に楽に導入できる
問題はセキュリティ面やphp・SQL・apacheなどの低級なところで問題が見つかった場合
SQLliteはなんだかんだでマイナーなので、その辺を担保できる補償がない
てか、俺hは無理だ 俺はスマホアプリもやるんでSQLiteがマイナーとか言われちゃうとモヤっとしちゃう ■ このスレッドは過去ログ倉庫に格納されています