実現したいこと
・管理画面とユーザー画面で、取得内容を変えたいです。
前提
・コメント取得処理を実装中です。
・管理画面はベーシック認証で簡単なものを作りました。
発生している問題
・Ajaxの場合に管理画面からのPOSTか否かの判定ができません。
該当のソースコード
PHPで以下 IS_ADMIN
のような判定をしたいのです。
PHP
1<?php 2// get_comments.php 3function get_comments(){ 4 5 // ベーシック認証を突破済みの 6 // 管理画面からのAjaxでなければ 7 // is_official = 1 のみ取得 8 // ということをやりたい 9 $WHERE = 'WHERE user_id = :user_id'; 10 if ( !IS_ADMIN ) { 11 $WHERE .= 'AND is_official = 1'; 12 } 13 14 $db = new PDO('DSN', 'USER', 'PASSWORD'); 15 $user_id = filter_input(INPUT_POST, 'user_id', FILTER_VALIDATE_INT); 16 $sql = "SELECT * FROM comments {$WHERE} LIMIT 0, 20;"; 17 $stmt = $db->prepare($sql); 18 $stmt->bindValue(':user_id', $user_id, PDO::PARAM_STR); 19 $stmt->execute(); 20 echo json_encode( $stmt->fetchAll() ); 21}
JavaScript側は普通に以下の感じです。
JavaScript
1$.ajax({ 2 "url" : "https://example.com/get_comments.php", 3 "type" : "post", 4 "dataType": "json", 5 "data" : {"user_id": 1} 6}).done(function(response){ 7 console.log(response); 8});
試したこと
まず、data
にis_admin_ajax
を持たせました。
しかし、これでは管理画面に関わらずPOSTできてしまうらしく、断念致しました…。
JavaScript
1$.ajax({ 2 "url" : "https://example.com/get_comments.php", 3 "type" : "post", 4 "dataType": "json", 5 // is_admin_ajaxを持たせた 6 "data" : {"user_id": 1, "is_admin_ajax": "true"} 7}).done(function(response){ 8 console.log(response); 9});
次に、上記is_admin_ajax
に加えて「ベーシック認証を突破済みである」を混ぜたらどうかと思い、PHP側で以下実装しました。
しかし、$_SERVER['PHP_AUTH_USER']
がAjaxの際に取得できないため(つまり以下IS_ADMIN
は常にfalse
となるため)、こちらも断念することとなりました…。
PHP
1// 管理画面を判定 2define('IS_ADMIN', (function(){ 3 return ( 4 // 管理画面への訪問時である場合 5 str_starts_with($_SERVER["PHP_SELF"], '/admin') 6 // 管理画面からのAjaxである場合 7 || ( 8 // ベーシック認証を突破済みである 9 isset($_SERVER['PHP_AUTH_USER']) 10 // is_admin_ajax である 11 && filter_input(INPUT_POST, 'is_admin_ajax') === 'true' 12 ) 13 ); 14})());
補足情報(FW/ツールのバージョンなど)
セッションと使うとできるのか?と思いましたが、具体的な流れがつかめずこれも苦慮しています。
PHP のバージョンは 8.1 になります。
宜しくお願い致します。
回答2件
あなたの回答
tips
プレビュー
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。