Объединение Javascript и amp; PHP Вместе [дубликат]

Хотя вышеупомянутые решения должны работать в 90% случаев, но если вы все еще читаете этот ответ !!! Вероятно, вы пытаетесь подключиться к другому серверу, чем предполагалось. Возможно, это связано с конфигурационным файлом, указывающим на другой сервер SQL, чем фактический сервер, с которым вы пытаетесь подключиться.

Произошло со мной по крайней мере.

571
задан Madara Uchiha 22 March 2017 в 09:44
поделиться

19 ответов

Я попробую более простой ответ:

Объяснение проблемы

Во-первых, давайте разобраться в потоке событий, когда страница обслуживается с нашего сервера:

  • Первый PHP запущен, он генерирует HTML, который подается клиенту.
  • Затем HTML доставляется клиенту, после того, как PHP завершен с ним, d хотели бы подчеркнуть, что как только код покидает сервер - PHP завершается с ним и больше не может его получить.
  • Затем HTML с JavaScript доходит до клиента, который может выполнять JS на этом html.

Итак, главное, что нужно запомнить здесь, это HTTP-апатрид. После того, как запрос покинул сервер, сервер не может его коснуться. Таким образом, это оставляет наши возможности:

  1. Отправлять больше запросов от клиента после , начальный запрос выполнен.
  2. Кодировать, что сервер имел в исходном запросе.

Решения

Вот главный вопрос, который вы должны задать себе:

Я пишу веб-сайт или приложение?

Веб-сайты в основном основаны на страницах, а время загрузки страницы должно быть как можно быстрее (например, Википедия).

Веб-сайт

Отправка большего количества запросов от клиента после веб-приложений больше, чем AJAX, и совершить много круговых поездок, чтобы быстро получить информацию о клиенте. первоначальный запрос выполняется медленно, так как требует больше HTTP-запросов, которые имеют значительные накладные расходы. Более того, для асинхронности требуется асинхронность , поскольку для запроса AJAX требуется обработчик, когда он будет завершен.

Я бы не не рекомендовал сделать другой запрос , если только ваш сайт является приложением для получения этой информации с сервера.

Вы хотите быстрое время отклика, которое имеет огромное влияние на время конверсии и загрузки. Выполнение ajax-запросов медленнее для первоначального времени безотказной работы в этом случае и ненужных.

У вас есть два способа решить проблему

  • Установить cookie - файлы cookie - это заголовки, отправленные по HTTP запросы, которые могут считываться как сервером, так и клиентом.
  • Кодировать переменную как JSON - JSON очень близок к объектам JavaScript, а most Объекты JSON являются действительными переменными JavaScript.

Настройка файла cookie действительно не очень сложна, вы просто назначаете ему значение:

setcookie("MyCookie", $value); // sets the cookie to the value, remember, do not
                               // set it with HTTP only to true.

Затем вы можете прочитать его с помощью JavaScript с помощью document.cookie:

Вот краткий рулонный парсер, но ответ, который я связал прямо над этим, имеет более проверенные:

var cookies = document.cookie.split(";").
    map(function(el){ return el.split("="); }).
    reduce(function(prev,cur){ prev[cur[0]] = cur[1];return prev },{});

cookies["MyCookie"] // value set with php.

Cookies хороши для небольших данных. Это то, что часто делают службы отслеживания.

Как только у нас будет больше данных, мы можем кодировать его с помощью JSON внутри JS-переменной:

<script>
    var myServerData = <?=json_encode($value)?>; // don't forget to sanitize 
                                                 //server data
</script>

Предполагая, что $value - json_encode на стороне PHP (это обычно есть). Этот метод - это то, что StackOverflow делает со своим чатом, например (только с использованием .net вместо php).

Приложение

Если вы пишете приложение - внезапно начальное время загрузки равно всегда важна, как текущая производительность приложения, и начинает платить за загрузку данных и кода отдельно.

В моем ответе здесь объясняется, как загружать данные с помощью AJAX в JavaScript:

function callback(data){
    // what do I do with the response?
}

var httpRequest = new XMLHttpRequest;
httpRequest.onreadystatechange = function(){
    if (httpRequest.readyState === 4) {// request is done
        if (httpRequest.status === 200) {// successfully
            callback(httpRequest.responseText);// we're calling our method
        }
    }
};
httpRequest.open('GET', "/echo/json");
httpRequest.send();

Или с jQuery:

$.get("/your/url").done(function(data){
    // what do I do with the data?
});

Теперь сервер просто должен содержать маршрут / файл /your/url, содержащий код, который захватывает данные и делает это что-то с этим, в вашем случае:

<$php
 ...
 $val = myService->getValue(); // makes an api and db call
 echo json_encode($val); // write it to the output
 $>

Таким образом, наш JS-файл запрашивает данные и показывает их, а не запрашивает код или макет. Это чище и начинает окупаться по мере того, как приложение становится выше. Это также лучшее разделение проблем, и это позволяет тестировать код на стороне клиента без какой-либо связанной с ним технологии на стороне сервера. Это еще один плюс.

Postscript: вы должны очень знать об атаке XSS векторы, когда вы вводите что-либо от PHP к JavaScript. очень трудно избежать значений правильно, и это чувствительно к контексту. Если вы не знаете, как обращаться с XSS или не знаете об этом, прочитайте эту статью OWASP , эту [ и этот вопрос .

741
ответ дан Community 18 August 2018 в 16:41
поделиться
  • 1
    «PHP не имеет тривиальных функций escape-кода JavaScript». - Что случилось с json_encode? – Quentin 19 May 2014 в 15:43
  • 2
    Я не согласен с «Очень небезопасным !!». и «Структурированные данные являются жесткими». Кодировать данные как JSON ( JavaScript Обозначение объекта, в конце концов), и там вы идете! – el.pescado 19 May 2014 в 15:44
  • 3
    Как насчет значительных асинхронностей накладных расходов и сложности кода при вводе AJAX-запроса? При работе на легком веб-сайте JavaScript создание запроса AJAX является утомительным, а не лучшим. – Benjamin Gruenbaum 19 May 2014 в 15:44
  • 4
    @BenjaminGruenbaum - JS является недействительным JSON не имеет значения. Я не могу придумать какой-либо JSON, который недействителен в JavaScript в правой части задания. – Quentin 19 May 2014 в 15:45
  • 5
    Nitpick: Нет такой вещи, как объект JSON & quot; (кроме тех, которые имеют методы parse и stringify). JSON по определению представляет собой последовательность символов. – cHao 20 May 2014 в 02:47
  • 6
    @cHao в целом - кодировки определяются как последовательность символов, а существование концептуальных объектов является философским. Однако есть такие вещи, как объекты JSON, и они определяются грамматикой JSON. {} - действительный объект JSON - см. json.org – Benjamin Gruenbaum 20 May 2014 в 04:12
  • 7
    @cHao отметить тонкость: JavaScript имеет свое понятие объекта , а JSON имеет свое понятие объекта - они не совпадают. Когда люди злоупотребляют термином «объект JSON», они означают объект JS, где на земле JavaScript - JSON используется как формат сериализации данных, а объекты JSON появляются внутри строк (вроде подобных SQL-запросов на серверных языках). Однако в этом ответе метод JSON полагается на то, что объекты most JSON также являются действительными объектами JavaScript, поэтому мы записываем объект JSON в код JavaScript. – Benjamin Gruenbaum 20 May 2014 в 07:02
  • 8
    Хорошо, ты меня достал. :) Это все еще безопасно; Поведение PHP по умолчанию состоит в том, чтобы избежать таких символов (наряду с другими символами, отличными от ASCII), поэтому они никогда не попадают в выходные данные, кроме как \u2028 и т. Д. Вы должны явно сказать, что это не делать этого. – cHao 20 May 2014 в 16:02
  • 9
    @SecondRikudo В методе 3 этот пример может убить веб-сайт. Пример: <?php $output = '<!--<script>'; echo json_encode($output); ?>. См. этот вопрос для деталей. Решение. Используйте JSON_HEX_TAG для выхода < и > (требуется PHP 5.3.0). – Pang 21 May 2014 в 03:23
  • 10
    @avi: Доверяя входящие данные, вы получаете огромное количество веры в свой источник. И с помощью «source», я не имею в виду только сценарий обработчика ajax вашего сервера - я также имею в виду код, в котором хранятся используемые данные, и любой пользователь, который может иметь входные данные, которые используются, и (если вы не используете используя HTTPS) даже маршрутизаторы между пользователем и вашим сервером, которые пересылают данные. Если вы можете доказать, что инъекция не может быть абсолютно невозможной, дезинфекция может быть чрезмерной. Но этот уровень уверенности довольно редок. – cHao 15 August 2014 в 00:18
741
ответ дан Community 18 August 2018 в 16:42
поделиться

вот один, который я не вижу в качестве опции. он похож на использование ajax, но явно отличается.

сначала устанавливает источник скрипта непосредственно в файл PHP.

<script type="text/javascript" src="url_to_your_php_file.php" /></script>

вы даже можете передать переменную обратно в PHP файл, такой как этот пример:

<script type="text/javascript" src="url_to_your_php_file.php?var1=value1" /></script>

, затем в «your_php_file.php»:

<?php
// THIS IS A SIMPLE EXAMPLE
// it demonstrates one method of using the src attribute to link
// to a PHP file which can generate javascripts dynamically
// and share data between PHP and javascript
// you may take this learning example and develop it further
// relying on your own coding skills for validating data
// and avoiding errors, of course
header( 'content-type: text/javascript' );

// if you pass a $_GET variable from the javascript
// you should add code to validate your $_GET variable(s)

// you can add code to query a database
// using $_GET['var1'] or some other criteria

// you can add simple variable assignments
$value = 'some value';

// for the OP's needs (assumes the class object has been defined)
$val = $myService->getValue();

?>
function name() {
    // pay attention because you need to use quotes properly
    // and account for possible quotes in the variable strings
    // to avoid both php and javascript errors
    // example assumes $val has been returned as a string
    // validate $val as needed using your method of choice
    var example1 = '<?php echo '"' . $val . '"'; ?>';
    var example2 = '<?php echo '"' . $value . '"'; ?>';
    var example3 = '<?php echo '"some other data"'; ?>';
    alert( example1 + ' / ' + example2 );
}
<?php
// you may even want to include additional files (.php or .js, etc)
@include 'local_path_to_some_other_js_file.js';
@include 'local_path_to_some_other_php_file.php';

exit;
?>
2
ответ дан aequalsb 18 August 2018 в 16:41
поделиться
  • 1
    Поскольку переменная существует в скрипте PHP, который генерирует HTML, вы пропустили важный шаг динамического генерации var1=value1. Поскольку это означает, что ваш скрипт будет разбит, если данные содержат символ '. – Quentin 19 August 2015 в 14:18
  • 2
    @Quentin код ПРИМЕР работает без ошибок, как представлено. это продемонстрировать использование. если программист так далеко от кодирования, они поймут последствия одиночных кавычек / двойных кавычек в переменных $ _GET, которые в любом случае должны быть укодированы. var1 != [some HTML code] ... ЧИСТЫЙ var1=="value1". просто неправильно, вы ошибаетесь, что я что-то пропустил. сценарий EXAMPLE завершен и, как вы видите, не генерирует никакого HTML-кода - и OP не упоминает HTML. он не заслуживает нисходящего спутника с помощью спускового крючка счастливого байдара - убирает downvote – aequalsb 20 August 2015 в 15:50
  • 3
    Код в вопросе показывает, что OP не понимает цитирование / экранирование. Недостаток понимания об этом - проблема! Пока этот пример завершен, это не пример того, как решить проблему, выраженную в вопросе. – Quentin 20 August 2015 в 16:07
  • 4
    @Quentin точно, как OP демонстрирует, что они не понимают цитирование / экранирование? это пример того, как решить проблему, потому что ОП задал вопрос о том, как получить данные PHP в javascript - мой пример - это один метод, который не был отмечен ни в каких других ответах – aequalsb 20 August 2015 в 16:11
  • 5
    С помощью этого фрагмента кода, который ничего не делает, чтобы убежать или закодировать $val, и который иногда работает, а иногда нет: myPlugin.start(<?=$val?> // this works sometimes, but sometimes it fails – Quentin 20 August 2015 в 16:12
myPlugin.start($val); // tried this, didn't work    

Это не работает, потому что $val не определено для javascript, т.е. php ничего не выводил для $val. Попробуйте просмотреть источник в своем браузере, и вот что вы увидите:

myPlugin.start(); // tried this, didn't work    

И

<?php myPlugin.start($val); ?> // this didn't work either

Это не работает, потому что php попытается обработать myPlugin как константа, и когда это не удается, он попытается рассматривать его как строку 'myPlugin', которую он попытается связать с выходом функции php start(), и поскольку это не определено, это приведет к фатальной ошибке

И

 myPlugin.start(<?=$val?> // this works sometimes, but sometimes it fails

Хотя это, скорее всего, сработает, так как php создает допустимый javascript с ожидаемыми аргументами, если он не работает, скорее всего, потому что myPlugin не готов все же. Проверьте свой порядок выполнения.

Также вы должны заметить, что установка php out небезопасна и должна быть отфильтрована с помощью json_encode()

EDIT

Поскольку я didn Не заметите отсутствующую скобку в myPlugin.start(<?=$val?>: - \

Как указывает @Second Rikudo, для правильной работы $val необходимо будет содержать закрывающую скобку, например: $val="42);"

Значение php теперь будет генерировать myPlugin.start(42); и будет работать как ожидалось при выполнении javascript

7
ответ дан andrew 18 August 2018 в 16:41
поделиться
  • 1
    JSON кодирует ваши данные: myPlugin.start(<?=json_encode($val)?>); – kingprawn 30 January 2015 в 09:57

Мне очень нравится, как Wordpress работает с его функциями enqueue и localize , поэтому после этой модели я написал простой класс для размещения скриптов на странице в соответствии с зависимостей сценария и получения дополнительных данных для скрипта.

class mHeader {

    private $scripts = array();

    /**
     * @param string $id        unique script identifier
     * @param string $src   script src attribute
     * @param array  $deps      an array of dependencies ( script identifiers ).
     * @param array  $data      an array, data that will be json_encoded and available to the script.
     */
    function enqueue_script( $id, $src, $deps = array(), $data = array() ) {
        $this->scripts[$id] = array( 'src' => $src, 'deps' => $deps, 'data' => $data );
    }

    private function dependencies( $script ) {
        if ( $script['deps'] ) {
            return array_map( array( $this, 'dependencies' ), array_intersect_key( $this->scripts, array_flip( $script['deps'] ) ) );
        }
    }

    private function _unset( $key, &$deps, &$out ) {
        $out[$key] = $this->scripts[$key];
        unset( $deps[$key] );
    }

    private function flattern( &$deps, &$out = array() ) {

        foreach( $deps as $key => $value ) {            
            empty($value) ? $this->_unset( $key, $deps, $out ) : $this->flattern( $deps[$key], $out );
        }
    }   

    function print_scripts() {

        if ( !$this->scripts ) return;

        $deps = array_map( array( $this, 'dependencies' ), $this->scripts );
        while ( $deps ) 
            $this->flattern( $deps, $js );

        foreach( $js as $key => $script ) {
            $script['data'] && printf( "<script> var %s = %s; </script>" . PHP_EOL, key( $script['data'] ), json_encode( current( $script['data'] ) ) );
            echo "<script id=\"$key-js\" src=\"$script[src]\" type=\"text/javascript\"></script>" . PHP_EOL;
        }
    }
}

Функция enqueue_script() предназначена для добавления сценария, установки сума и зависимостей в других сценариях и дополнительных данных, необходимых для скрипт.

$header = new mHeader();

$header->enqueue_script( 'jquery-ui', '//ajax.googleapis.com/ajax/libs/jqueryui/1.10.4/jquery-ui.min.js', array( 'jquery' ) );
$header->enqueue_script( 'jquery', '//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js' );
$header->enqueue_script( 'custom-script', '//custom-script.min.js', array( 'jquery-ui' ), array( 'mydata' => array( 'value' => 20 ) ) );

$header->print_scripts();

И, метод print_scripts() вышеприведенного примера отправит этот вывод:

<script id="jquery-js" src="//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js" type="text/javascript"></script>
<script id="jquery-ui-js" src="//ajax.googleapis.com/ajax/libs/jqueryui/1.10.4/jquery-ui.min.js" type="text/javascript"></script>
<script> var mydata = {"value":20}; </script>
<script id="custom-script-js" src="//custom-script.min.js" type="text/javascript"></script>

Независимо от того, что скрипт jquery установлен в очередь после 'jquery-ui', он печатается ранее, потому что он определен в 'jquery-ui', который зависит от `jquery '. Дополнительные данные для «custom-script» находятся внутри нового блока сценариев и размещаются перед ним, он содержит mydata объект, который содержит дополнительные данные, теперь доступный для «пользовательского сценария».

9
ответ дан Danijel 18 August 2018 в 16:41
поделиться

Так я это делаю (есть много способов):

  1. Преобразовать данные в JSON
  2. Вызов AJAX , чтобы получить файл JSON
  3. Преобразовать JSON в объект Javascript

Пример:

ШАГ 1

<?php

   $servername = "localhost";
   $username = "";
   $password = "";
   $dbname="";
   $conn = new mysqli($servername, $username, $password,$dbname);

   if ($conn->connect_error) {
      die("Connection failed: " . $conn->connect_error);
   } 

   $sql = "SELECT id, name ,image FROM phone";
   $result = $conn->query($sql);

   while($row =$result->fetch_assoc()){ 
      $v[]=$row;    
   }

  echo json_encode($v);

  $conn->close();
?>

ШАГ 2

function showUser(fnc) {
   var xhttp = new XMLHttpRequest();

   xhttp.onreadystatechange = function() {
      if (this.readyState == 4 && this.status == 200) {
         // STEP 3    
         var p=JSON.parse(this.responseText);}
       }
    }
0
ответ дан Devanshu 18 August 2018 в 16:41
поделиться

Я обычно использую атрибуты data- * в html.

<div class="service-container" data-service="<?php echo $myService->getValue(); ?>">

</div>

<script>
$(document).ready(function() {
    $('.service-container').each(function() {
        var container = $(this);
        var service = container.data('service');

        // service variable now contains the value of $myService->getValue();
    });
});
</script>

В этом примере используется jQuery, но может быть адаптирован для другой библиотеки или ванильного Javascript.

Вы можете узнать больше о свойство набора данных здесь: https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement.dataset

71
ответ дан icc97 18 August 2018 в 16:41
поделиться
  • 1
    Этот ответ на самом деле кажется мне самым простым для большинства людей. Вы заработали аванс! – Eckstein 13 July 2014 в 04:39
  • 2
    Я согласен, не желая чрезмерно анализировать и внедрять причудливое решение для простой проблемы. Этот метод отделяет PHP от Javascript, так что PHP все еще генерирует только HTML, а Javascript может быть внешним по отношению к файлу PHP. – alds 30 July 2014 в 17:32
  • 3
    Я согласен, что это лучший вариант. Он решает все проблемы безопасности без задержки. Вы можете полностью исключить JS из своих HTML-страниц. HTML должен обслуживаться сервером приложений, но JS (и CSS) этого не делает. Это также более семантично. – Ryan 14 April 2015 в 02:26
  • 4
    @Quentin Вы должны избегать вывода ALL, если только вывод не является HTML. – yuikonnu 29 October 2015 в 00:57
  • 5
    @asdasd - Ну да, я просто рассматривал конкретную проблему с кодом в вашем ответе, а не в общем случае. – Quentin 29 October 2015 в 00:59
  • 6
<script>
  var jsvar = <?php echo json_encode($PHPVar); ?>;
</script>

json_encode () требует:

  • PHP 5.2.0 или более
  • $PHPVar кодируется как UTF-8, Unicode.
34
ответ дан Jessé Catrinck 18 August 2018 в 16:41
поделиться
    <?php 
    $your_php_variable= 22;
    echo "<script type='text/javascript'>var your_javascript_variable = $your_php_variable;</script>";  
    ?>

, и это сработает. Это просто назначение переменной javascript, а затем передача значения существующей переменной php. Поскольку php записывает здесь строки javascript, он имеет значение переменной php и может передавать ее напрямую.

-1
ответ дан Neo 18 August 2018 в 16:41
поделиться

Просто используйте один из следующих способов.

<script type="text/javascript">
var js_variable  = '<?php echo $php_variable;?>';
<script>

ИЛИ

<script type="text/javascript">
    var js_variable = <?php echo json_encode($php_variable); ?>; 
</script>
12
ответ дан Nishant Mendiratta 18 August 2018 в 16:41
поделиться
  • 1
    Какую ценность это добавляет к существующим ответам? – Benjamin Gruenbaum 13 April 2015 в 18:59
  • 2
    Держать его простым и прямым. Для всех пользователей, у которых есть много времени, чтобы вникать в глубокое объяснение – Nishant Mendiratta 13 April 2015 в 19:06
  • 3
    Почему это было приостановлено? Это простейшее рабочее решение. – desbest 2 May 2015 в 19:30
  • 4
    Простой лучше – Doberon 28 November 2017 в 17:28
  • 5
    Может быть, это глупый вопрос, но я абсолютно новичок в мире PHP. Как только мы напишем вышеуказанный код в .php-файле, как мне получить доступ к js_variable & quot; в моем файле JavaScript или моем & quot; index.html & quot; файл? – Ankit Prajapati 25 June 2018 в 15:07

В соответствии с вашим кодом

<$php
     $val = $myService->getValue(); // makes an api and db call
     echo '<span id="value">'.$val.'</span>';
$>

Теперь вы можете получить значение с помощью DOM, используйте innerHTML идентификатора span, в этом случае вам не нужно делать вызов на сервер или ajax или любую другую вещь.

Ваша страница будет печатать его с помощью php, и ваш javascript получит значение с помощью DOM.

0
ответ дан Pang 18 August 2018 в 16:41
поделиться
  • 1
    Этот код уязвим для XSS, поскольку он не поддерживает символы типа < и >. Также были предложены аналогичные решения. – Michał Perłakowski 18 April 2017 в 10:26

Я предполагаю, что данные для передачи - это строка.

Как отмечают другие комментаторы, AJAX - одно из возможных решений, но недостатки превосходят плюсы: он имеет задержку, и это сложнее (для этого требуется код для получения значения как на стороне сервера, так и на стороне клиента), когда должна быть достаточно простая функция экранирования.

Итак, мы вернулись к экранированию. json_encode($string) работает , если вы сначала кодируете исходную строку как UTF-8, если это еще не так, потому что для json_encode требуются данные UTF-8. Если строка находится в ISO-8859-1, вы можете просто использовать json_encode(utf8_encode($string)); в противном случае вы всегда можете использовать iconv для выполнения преобразования.

Но есть большая проблема. Если вы используете его в событиях, вам нужно запустить htmlspecialchars() в результате, чтобы сделать правильный код. И тогда вы должны быть осторожны, чтобы использовать двойные кавычки для включения события или всегда добавлять ENT_QUOTES в htmlspecialchars. Например:

<?php
    $myvar = "I'm in \"UTF-8\" encoding and I have <script>script tags</script> & ampersand!";
    // Fails:
    //echo '<body onload="alert(', json_encode($myvar), ');">';
    // Fails:
    //echo "<body onload='alert(", json_encode($myvar), ");'>";
    // Fails:
    //echo "<body onload='alert(", htmlspecialchars(json_encode($myvar)), ");'>";

    // Works:
    //echo "<body onload='alert(", htmlspecialchars(json_encode($myvar), ENT_QUOTES), ");'>";
    // Works:
    echo '<body onload="alert(', htmlspecialchars(json_encode($myvar)), ');">';

    echo "</body>";

Однако вы не можете использовать htmlspecialchars для обычного JS-кода (код, заключенный в теги <script> ... </script>). Это позволяет использовать эту функцию, подверженную ошибкам, забыв htmlspecialchars результат при записи кода события.

Можно написать функцию, которая не имеет этой проблемы, и может использоваться как в событиях и в регулярном JS-коде, если вы включаете свои события всегда в одинарные кавычки или всегда в двойные кавычки. Вот мое предложение, требующее, чтобы они были в двойных кавычках (что я предпочитаю):

<?php

// Optionally pass the encoding of the source string, if not UTF-8
function escapeJSString($string, $encoding = 'UTF-8')
{
    if ($encoding != 'UTF-8')
        $string = iconv($encoding, 'UTF-8', $string);
    $flags = JSON_HEX_TAG|JSON_HEX_AMP|JSON_HEX_APOS|JSON_HEX_QUOT|JSON_UNESCAPED_SLASHES;
    $string = substr(json_encode($string, $flags), 1, -1);
    return "'$string'";
}

Для функции требуется PHP 5.4+. Пример использования:

<?php
    $myvar = "I'm in \"UTF-8\" encoding and I have <script>script tags</script> & ampersand!";
    // Note use of double quotes to enclose the event definition!
    echo '<body onload="alert(', escapeJSString($myvar), ');">';
    // Example with regular code:
    echo '<script>alert(', escapeJSString($myvar), ');</script>';
    echo '</body>';
1
ответ дан Pedro Gimeno 18 August 2018 в 16:41
поделиться

Я получил простой способ присвоить переменные JavaScript с помощью PHP.

Он использует атрибуты данных HTML5 для хранения переменных PHP, а затем присваивается JavaScript при загрузке страницы.

Полный учебник можно найти здесь здесь

Пример:

<?php

$variable_1 = "QNimate";
$variable_2 = "QScutter";

?>
    <span id="storage" data-variable-one="<?php echo $variable_1; ?>" data-variable-two="<?php echo $variable_2; ?>"></span>
<?php

Hers - это код JS

var variable_1 = undefined;
var variable_2 = undefined;

window.onload = function(){
    variable_1 = document.getElementById("storage").getAttribute("data-variable-one");
    variable_2 = document.getElementById("storage").getAttribute("data-variable-two");
}
3
ответ дан qnimate 18 August 2018 в 16:41
поделиться
  • 1
    Хотя атрибуты данных являются разумным решением проблемы, у вас возникает аналогичная проблема с исходным вопросом, если вы не избегаете данных в них. Вам просто нужно избегать их для HTML вместо JS. – Quentin 19 August 2015 в 14:22

Вот трюк:

<?php 
 $name = 'PHP variable';
 echo '<script>';
 echo 'var name = ' . json_encode($name) . ';';
 echo '</script>';
<?
<script>
  console.log("i am everywhere " + name);
</script>
2
ответ дан Ramin Taghizada 18 August 2018 в 16:41
поделиться
  • 1
    Есть ли способ получить его так, чтобы он фактически не печатался в исходном коде? У меня массивный массив, который я прохожу, и он забивает источник. – William Howley 12 August 2017 в 18:06
  • 2
    Можете ли вы привести примерный тестовый пример? – Ramin Taghizada 15 August 2017 в 13:22
  • 3
    Разве это не так, как «3. Эхо-данные непосредственно в JavaScript & quot; в этот ответ ? Это выглядит еще лучше. – kanji 12 February 2018 в 13:04

, предположим, что ваша переменная всегда целочисленна, в этом случае это проще

<?PHP
$number = 4;

echo '<script>';
echo 'var number = ' . $number . ';';
echo 'alert(number);';
echo '</script>';

?>

output:

<script>var number = 4;alert(number);</script>

, предположим, что ваша переменная не является целым числом, но если вы пытаетесь выполнить выше метод, вы получите что-то вроде этого:

<script>var number = abcd;alert(number);</script>

, но в javascript это синтаксическая ошибка.

, поэтому в php у нас есть вызов функции json_encode, который кодирует string в json-объект.

<?PHP
$number = 'abcd';

echo '<script>';
echo 'var number = ' . json_encode($number) . ';';
echo 'alert(number);';
echo '</script>';

?>

с abcd в json это "abcd", поэтому он выглядит так:

<script>var number = "abcd";alert(number);</script>

Вы можете использовать тот же метод для массивов :

<?PHP
$details = [
'name' => 'supun',
'age' => 456,
'weight' => '55'
];

echo '<script>';
echo 'var details = ' . json_encode($details) . ';';
echo 'alert(details);';
echo 'console.log(details);';
echo '</script>';

?>

и ваш javascript выглядит так:

<script>var details = {"name":"supun","age":456,"weight":"55"};alert(details);console.log(details);</script>

консольный выход

0
ответ дан Supun Praneeth 18 August 2018 в 16:41
поделиться

Для тех, у кого есть проблемы с использованием кода ниже, и он продолжает показывать <?php echo $username?> или что-то вроде этого. Редактируйте httpd.conf в разделе mime_module, добавив это приложение AddType / x-httpd-php .html .htm. потому что он может отключиться по умолчанию.

   <?php
        $username = 1;
    ?>

    <script type="text/javascript">
        var myData = <?php echo $username ?>;
        console.log(myData);
        alert(myData);
    </script>
-2
ответ дан Tapasit Suesasiton 18 August 2018 в 16:41
поделиться
  • 1
    @MadaraUchiha вы можете объяснить, почему? – CM 웃 2 January 2016 в 18:17
  • 2
    Потому что, если $username === "hello", то у вас есть var myData = hello;, который будет прерываться ужасно. – Madara Uchiha♦ 2 January 2016 в 18:43

попробуйте это

<?php
    echo "<script> var x = ". json_encode($phpVariable)."</script>";
?>

-

-После попытки этого какое-то время Хотя он работает, однако он замедляет работу. поскольку php является скриптом на стороне сервера, а javascript - пользователем.

7
ответ дан Yosra Nagati 18 August 2018 в 16:41
поделиться
  • 1
    Мы ищем длительные ответы, которые дают некоторое объяснение и контекст. Не просто дать однострочный ответ; объясните, почему ваш ответ прав, в идеале с цитатами. Ответы, не содержащие объяснений, могут быть удалены. Это написано на вопрос. – Madara Uchiha♦ 2 September 2014 в 11:09
  • 2
    нечего объяснять, записывать вашу переменную php в тег & lt; script & gt; который отражается в php-коде – Yosra Nagati 2 September 2014 в 11:42
  • 3
    Ты уверен? Вы видели верный ответ на этот вопрос? Это объясняет совсем немного. Не говоря уже о том, что ваше решение небезопасно. $phpVariable = '42"; alert("I am evil!");'; – Madara Uchiha♦ 2 September 2014 в 11:43
  • 4
    это мое предложение, которое решило мою проблему, и я не нашел его в предыдущих ответах, поэтому добавил, в надежде, что кто-то найдет это интересным – Yosra Nagati 2 September 2014 в 11:49
  • 5
    здесь добавляется эхо, чтобы распечатать его на веб-странице, имеющей этот php-код, или это просто часть синтаксиса, чтобы поместить данные в переменную js. @ YosraNagati – SUMIT KUMAR SINGH 11 April 2015 в 08:20
1
ответ дан Jonathan199 7 September 2018 в 01:36
поделиться
2
ответ дан Jonathan199 30 October 2018 в 05:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: