Ошибка при получении значения из URL-адреса с помощью PHP и отправке его в переменную javascript

Я пытаюсь получить переменную 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