เกิดข้อผิดพลาดขณะรับค่าจาก URL โดยใช้ PHP และส่งไปยังตัวแปรจาวาสคริปต์

ฉันกำลังพยายามรับตัวแปร php จาก url โดยใช้ $_REQUEST ถึง javascript เพื่อที่ฉันจะได้ส่งผ่าน Ajax ได้

ที่ด้านบนของหน้าฉันมี:

<?php
  include_once('../php/connection.php');
  include_once('../php/getDiagnosis.php');
  $pid = $_REQUEST['pid'];

?>

และในส่วน Java Script ฉันมี:

  <script src="../js/history.js"></script>

และใน history.js:

var addHistory = function()
{
  var patient_medication = $("#patient_medicationn").val();
  var disease = $("#disease").val();
  var patient_side_effect = $("#patient_side_effect").val();

  var pid = '<?php echo $pid;?>';
  console.log(pid);

  if(disease=="select")
  {
    $("#disease").css('border-color', 'red');
    $("#disease").focus();
  }

  else
  {
    $.ajax({
      url: '../php/history.php',
      data: {pid: pid, patient_medication: patient_medication, disease: disease, patient_side_effect: patient_side_effect},
      type: 'POST',
      dataType: 'TEXT',

      success:function(resp)
      {

      },
      error:function(resp)
      {
        alert("Information have not been added, please try again");
      }
    })
  }
}
$(document).ready(function()
{

  $("#add_history").on('click', addHistory);
  $("#patient_medication").on('keypress', function(event)
  {
    if(event.which==13)
    {
        $("#add_history").click();
    }
  })
  $("#patient_side_effect").on('keypress', function(event)
  {
    if(event.which==13)
    {
        $("#add_history").click();
    }
  })
});

ผลลัพธ์ในคอนโซลคือ:


person alim1990    schedule 23.06.2017    source แหล่งที่มา
comment
ไฟล์ JS ของคุณอาจไม่ได้คอมไพล์ฝั่งเซิร์ฟเวอร์ ดังนั้นจึงไม่มีการดำเนินการโค้ด PHP   -  person Peter M.    schedule 23.06.2017
comment
มีวิธีแก้ไขหรือไม่?   -  person alim1990    schedule 23.06.2017
comment
คุณควรลองลิงค์นี้ มันจะเรียงลำดับได้มากขึ้น https://stackoverflow.com/questions/9653651/รวมทั้ง-php-variables-in-an-external-js-filehttp://   -  person Ankesh Vaishnav    schedule 23.06.2017
comment
มีวิธีแก้ไขที่ดี โปรดตรวจสอบคำตอบของฉัน   -  person Curious Mind    schedule 23.06.2017
comment
โปรดตรวจสอบให้แน่ใจว่า history.php ของคุณตรวจสอบว่าผู้ใช้ที่ทำการร้องขอมีสิทธิ์ดูประวัติที่พวกเขาต้องการหรือไม่ ไม่เช่นนั้นใครๆ ก็สามารถทราบประวัติได้เพียงแค่มี pid (หรือคาดเดา) คุณสามารถทำได้โดยใช้ตัวแปรเซสชัน   -  person Marcelo Staudt    schedule 23.06.2017


คำตอบ (5)


ไฟล์ JS ของคุณอาจไม่ได้คอมไพล์ฝั่งเซิร์ฟเวอร์ ดังนั้นจึงไม่มีการดำเนินการโค้ด PHP

วิธีแก้ไขวิธีหนึ่งคือใช้ฟิลด์ที่ซ่อนอยู่

ในหน้า HTML ของคุณ (ซึ่งอาจคอมไพล์แล้ว) คุณสามารถทำสิ่งนี้:

<input type="hidden" name="someField" id="someField" value="<?php echo $pid; ?>">

ในไฟล์ JS ของคุณ คุณสามารถทำได้:

var pid = $('#someField').val();
person Peter M.    schedule 23.06.2017

คุณไม่สามารถทำเช่นนี้ได้ วิธีที่เป็นไปได้คือการสร้างตัวแปรส่วนกลางซึ่งสามารถเข้าถึงได้จากไฟล์ JS ของคุณ ก่อนถึงบรรทัดนี้.

<script src="../js/history.js"></script>

เพิ่มสิ่งนี้

<script>var pid = '<?php echo $pid;?>';</script>

และตอนนี้ pid มีอยู่ในไฟล์ JS

person Arpad Hollo    schedule 23.06.2017

ดังที่ @Peter m กล่าวไว้ ไฟล์ .js ของคุณจะไม่แยกวิเคราะห์ตามค่าเริ่มต้น คุณสามารถเปลี่ยนการกำหนดค่า Apache เป็นแยกวิเคราะห์ไฟล์ .js (ไม่แนะนำ) สิ่งที่ฉันจะทำ เพียงแค่ทำให้ตัวแปรของคุณเป็นสากลและกำหนดไว้ในไฟล์ php หรือส่งตัวแปรเป็นอาร์กิวเมนต์ไปยังฟังก์ชัน

person Marcelo Staudt    schedule 23.06.2017
comment
หรือคุณสามารถรวมไฟล์ php เหมือนว่าเป็นไฟล์ js - ตรวจสอบคำตอบของฉัน - person Curious Mind; 23.06.2017

คุณสามารถทำได้ด้วยการเปลี่ยนแปลงเล็กๆ น้อยๆ 3 ประการ:

เปลี่ยนสิ่งนี้:

<script src="../js/history.js"></script> 

สำหรับสิ่งนี้:

<script type="text/javascript" src="../js/history.php?pid=$pid"></script>

จากนั้นเปลี่ยนชื่อ history.js เป็น history.php

เริ่มแก้ไข

4 บรรทัดแรกของไฟล์ js ก่อนหน้าของคุณ ตอนนี้ history.php ควรเป็น:

<?php
    header('Content-Type: application/javascript');
    $pid = $_GET['pid'];
?>

สิ้นสุดการแก้ไข

ทดสอบ - มันควรจะใช้งานได้

ไม่จำเป็นต้องกำหนดค่า apache ใหม่เพื่อแยกวิเคราะห์ js - นอกจากนี้การแยกวิเคราะห์ไฟล์ js ทั้งหมดเนื่องจากไฟล์ php จะเพิ่มภาระของเซิร์ฟเวอร์อย่างมาก

ด้วยวิธีนี้ เบราว์เซอร์จะมองเห็นเป็นไฟล์ js และไม่มีภาระเพิ่มเติมบนเซิร์ฟเวอร์

person Curious Mind    schedule 23.06.2017

สำหรับปัญหาด้านความปลอดภัยและการบำรุงรักษาโค้ด อย่าผสมฝั่งเซิร์ฟเวอร์กับโค้ดฝั่งไคลเอ็นต์ในลักษณะดังกล่าว ให้ส่งตัวแปรเป็นแอตทริบิวต์ของวิธีการแทน

JS:

var addHistory = function(pId){
   // treat as attribute
   // ...
}

เริ่มต้น JS:

$(document).ready(function(){


// some generic function used to parse url
// You can google JS url parser library for more functionality
function getQueryParam(url, key) {
  var queryStartPos = url.indexOf('?');
  if (queryStartPos === -1) {
    return;
  }
  var params = url.substring(queryStartPos + 1).split('&');
  for (var i = 0; i < params.length; i++) {
    var pairs = params[i].split('=');
    if (decodeURIComponent(pairs.shift()) == key) {
      return decodeURIComponent(pairs.join('='));
    }
  }
}
// use on click, bind clicks to body avoiding future event collisions
$('body').on('click','#add_history', addHistory, function(){
   // get parameter from url
   var pId = getQueryParam(window.location, 'pid');
   addHistory(pId); 
});

});
person George Dryser    schedule 23.06.2017