PHP에서 JavaScript로 변수와 데이터를 어떻게 전달합니까?


664

PHP에 변수가 있으며 JavaScript 코드에 값이 필요합니다. PHP에서 JavaScript로 변수를 가져 오려면 어떻게해야합니까?

다음과 같은 코드가 있습니다.

<?php
     ...
     $val = $myService->getValue(); // Makes an API and database call
?>

JavaScript 코드가 필요 val하고 다음과 같은 줄을 봅니다.

<script>
    myPlugin.start($val); // I tried this, but it didn't work
    <?php myPlugin.start($val); ?> // This didn't work either
    myPlugin.start(<?=$val?> // This works sometimes, but sometimes it fails
</script>

2
결산 괄호가 myPlugin.start(<?=$val?>의도적으로 없습니까? "이것은 때때로 작동한다"는 것이 사실입니까?
앤드류

2
글쎄요, 이것은 실제로 Ben에 의한 것이지만 $ val이 "42)"제대로 작동 한다면 : D
Madara의 유령

답변:


878

실제로 몇 가지 방법이 있습니다. 일부는 다른 것보다 더 많은 오버 헤드를 필요로하며 일부는 다른 것보다 더 나은 것으로 간주됩니다.

특별한 순서는 없습니다 :

  1. AJAX를 사용하여 서버에서 필요한 데이터를 가져옵니다.
  2. 데이터를 페이지 어딘가에 에코하고 JavaScript를 사용하여 DOM에서 정보를 가져옵니다.
  3. 데이터를 JavaScript로 직접 에코하십시오.

이 글에서는 위의 각 방법을 살펴보고 각각의 장단점과 구현 방법을 살펴 보겠습니다.

1. AJAX를 사용하여 서버에서 필요한 데이터를 가져옵니다.

서버 측과 클라이언트 측 스크립트는 완전히 분리되어 있으므로이 방법이 가장 좋습니다 .

찬성

  • 계층 간 더 나은 분리 -내일 PHP 사용을 중단하고 서블릿, REST API 또는 다른 서비스로 이동하려는 경우 많은 JavaScript 코드를 변경할 필요가 없습니다.
  • 더 읽기 -JavaScript는 JavaScript, PHP는 PHP입니다. 둘을 혼합하지 않으면 두 언어 모두에서 더 읽기 쉬운 코드를 얻을 수 있습니다.
  • 비동기식 데이터 전송 가능 -PHP에서 정보를 얻는 데 시간 / 자원이 많이 소요될 수 있습니다. 때로는 정보를 기다렸다가 페이지를로드하고 정보가 도달 할 때까지 원하지 않습니다.
  • 마크 업에서 데이터를 직접 찾을 수 없음 -이는 마크 업에서 추가 데이터를 깨끗하게 유지하며 JavaScript 만 볼 수 있음을 의미합니다.

단점

  • 대기 시간 -AJAX는 HTTP 요청을 생성하고 HTTP 요청은 네트워크를 통해 전달되며 네트워크 대기 시간이 있습니다.
  • 상태 -별도의 HTTP 요청을 통해 가져온 데이터에는 HTML 문서를 가져온 HTTP 요청의 정보가 포함되지 않습니다. 이 정보가 필요할 수 있습니다 (예 : 양식 제출에 대한 응답으로 HTML 문서가 생성 된 경우). 필요한 경우 어떻게 든 전송해야합니다. 페이지에 데이터를 포함하지 않은 경우 (이 기술을 사용하는 경우) 경쟁 조건에 따라 쿠키 / 세션으로 제한됩니다.

구현 예

AJAX를 사용하면 두 페이지가 필요합니다. 하나는 PHP가 출력을 생성하는 곳이고 두 번째는 JavaScript가 해당 출력을 얻는 곳입니다.

get-data.php

/* Do some operation here, like talk to the database, the file-session
 * The world beyond, limbo, the city of shimmers, and Canada.
 *
 * AJAX generally uses strings, but you can output JSON, HTML and XML as well.
 * It all depends on the Content-type header that you send with your AJAX
 * request. */

echo json_encode(42); // In the end, you need to echo the result.
                      // All data should be json_encode()d.

                      // You can json_encode() any value in PHP, arrays, strings,
                      //even objects.

index.php (또는 실제 페이지의 이름이 무엇이든)

<!-- snip -->
<script>
    function reqListener () {
      console.log(this.responseText);
    }

    var oReq = new XMLHttpRequest(); // New request object
    oReq.onload = function() {
        // This is where you handle what to do with the response.
        // The actual data is found on this.responseText
        alert(this.responseText); // Will alert: 42
    };
    oReq.open("get", "get-data.php", true);
    //                               ^ Don't block the rest of the execution.
    //                                 Don't wait until the request finishes to
    //                                 continue.
    oReq.send();
</script>
<!-- snip -->

위의 두 파일 조합은 42파일로드가 완료되면 경고 합니다.

더 읽을 거리

2. 데이터를 페이지 어딘가에 에코하고 JavaScript를 사용하여 DOM에서 정보를 가져옵니다.

이 방법은 AJAX보다 덜 바람직하지만 여전히 장점이 있습니다. 그것은 여전히 상대적으로 자바 스크립트에서 직접에는 PHP가 없다는 것을 의미에서 PHP와 자바 스크립트 사이에 분리.

찬성

  • 빠름 -DOM 작업이 빠르며 많은 데이터를 비교적 빠르게 저장하고 액세스 할 수 있습니다.

단점

  • 잠재적으로 의미가없는 마크 업 -일반적으로 발생 <input type=hidden>하는 정보는 정보를 더 쉽게 가져올 수 있기 때문에 일종의 정보를 저장하는 것입니다 inputNode.value. 그러나 그렇게하면 HTML에 의미없는 요소가 있습니다. HTML에는 <meta>문서에 대한 데이터 요소가 있으며 HTML 5 data-*에는 특정 요소와 연관 될 수있는 JavaScript로 읽을 수있는 데이터에 대한 특성이 도입되었습니다 .
  • 소스를 더럽 힙니다 -PHP가 생성하는 데이터는 HTML 소스로 직접 출력되므로 더 크고 덜 집중된 HTML 소스를 얻게됩니다.
  • 구조화 된 데이터를 얻는 것이 더 어렵습니다 -구조화 된 데이터는 유효한 HTML이어야합니다. 그렇지 않으면 문자열을 직접 이스케이프하고 변환해야합니다.
  • PHP를 데이터 로직에 밀접하게 연결 -PHP는 프리젠 테이션에 사용되므로이 둘을 명확하게 분리 할 수 ​​없습니다.

구현 예

이를 통해 사용자에게는 표시되지 않지만 JavaScript에서는 볼 수있는 일종의 요소를 만드는 것이 좋습니다.

index.php

<!-- snip -->
<div id="dom-target" style="display: none;">
    <?php
        $output = "42"; // Again, do some operation, get the output.
        echo htmlspecialchars($output); /* You have to escape because the result
                                           will not be valid HTML otherwise. */
    ?>
</div>
<script>
    var div = document.getElementById("dom-target");
    var myData = div.textContent;
</script>
<!-- snip -->

3. 데이터를 JavaScript로 직접 에코

아마도 가장 이해하기 쉬울 것입니다.

찬성

  • 매우 쉽게 구현 -구현하고 이해하는 데 거의 걸리지 않습니다.
  • 더티 소스가 아님 -변수가 JavaScript로 직접 출력되므로 DOM은 영향을받지 않습니다.

단점

  • PHP를 데이터 로직에 밀접하게 연결 -PHP는 프리젠 테이션에 사용되므로이 둘을 명확하게 분리 할 수 ​​없습니다.

구현 예

구현은 비교적 간단합니다.

<!-- snip -->
<script>
    var data = <?php echo json_encode("42", JSON_HEX_TAG); ?>; // Don't forget the extra semicolon!
</script>
<!-- snip -->

행운을 빕니다!


70
"PHP는 사소한 JavaScript 이스케이프 기능이 없습니다"— 무엇이 잘못 json_encode되었습니까?
Quentin

34
"매우 안전하지 않은 !!"에 동의하지 않습니다 그리고 "구조화 된 데이터는 어렵다". 데이터를 JSON ( JavaScript Object Notation) 으로 인코딩 하면 끝납니다!
el.pescado 14 년

14
AJAX 요청을 할 때 비동기 적으로 발생하는 오버 헤드와 코드 복잡성은 어떻습니까? JavaScript 라이트 웹 사이트에서 작업 할 때 AJAX 요청은 번거롭고 모범 사례가 아닙니다.
Benjamin Gruenbaum

8
@BenjaminGruenbaum — JS가 유효하지 않은 JSON은 관련이 없습니다. 과제의 오른쪽에 JavaScript에서 유효하지 않은 JSON을 생각할 수 없습니다.
Quentin

7
@SecondRikudo 방법 3에서이 예제는 웹 사이트를 종료시킬 수 있습니다. 예 : <?php $output = '<!--<script>'; echo json_encode($output); ?>. 자세한 내용은 이 질문 을 참조하십시오. 솔루션 : JSON_HEX_TAG이스케이프 <>(PHP 5.3.0 필요)를 사용하십시오 .
Pang

90

더 간단한 답변을 시도하겠습니다.

문제 설명

먼저 서버에서 페이지가 제공 될 때 이벤트 흐름을 이해합니다.

  • 먼저 PHP가 실행되면 클라이언트에 제공되는 HTML이 생성됩니다.
  • 그런 다음 HTML이 클라이언트에 전달되고 PHP가 완료되면 코드가 서버를 떠나면 PHP가 완료되어 더 이상 액세스 할 수 없다는 것을 강조하고 싶습니다.
  • 그런 다음 JavaScript가 포함 된 HTML이 클라이언트에 도달하여 해당 HTML에서 JavaScript를 실행할 수 있습니다.

따라서 여기서 기억해야 할 핵심은 HTTP는 stateless 입니다. 요청이 서버를 떠나면 서버는이를 만질 수 없습니다. 따라서 우리의 옵션은 다음과 같습니다.

  1. 초기 요청이 완료된 클라이언트에서 더 많은 요청을 보냅니다 .
  2. 초기 요청에서 서버가 말한 내용을 인코딩하십시오.

솔루션

그것은 당신이 스스로에게 물어봐야 할 핵심 질문입니다.

웹 사이트 나 응용 프로그램을 작성하고 있습니까?

웹 사이트는 주로 페이지 기반이며 페이지로드 시간은 최대한 빨라야합니다 (예 : Wikipedia). 웹 애플리케이션은 AJAX를 많이 사용하고 클라이언트에게 빠른 정보 (예 : 재고 대시 보드)를 얻기 위해 많은 왕복을 수행합니다.

웹 사이트

초기 요청이 완료된 후 클라이언트에서 더 많은 요청을 보내면 상당한 오버 헤드가있는 더 많은 HTTP 요청이 필요하므로 속도느립니다 . 또한 AJAX 요청을 수행하려면 완료시 핸들러가 필요하므로 비동기 성 이 필요합니다 .

나는 것 없는 또 다른 요청을 추천 사이트 응용 프로그램이 아닌 서버에서 해당 정보를 얻기 위해.

변환 및로드 시간에 영향을주는 빠른 응답 시간을 원합니다 . 이 경우 초기 가동 시간 동안 Ajax 요청이 느리고 필요하지 않습니다.

이 문제를 해결하는 두 가지 방법이 있습니다

  • 쿠키 설정 -쿠키는 서버와 클라이언트 모두가 읽을 수있는 HTTP 요청으로 전송 된 헤더입니다.
  • 변수를 JSON으로 인코딩-JSON은 JavaScript 객체와 매우 유사하며 대부분의 JSON 객체는 유효한 JavaScript 변수입니다.

쿠키를 설정하는 것은 그리 어렵지 않습니다. 값을 지정하면됩니다.

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.

쿠키는 작은 데이터에 좋습니다. 이것이 추적 서비스가 자주하는 일입니다.

더 많은 데이터가 있으면 대신 JavaScript 변수 내에서 JSON으로 인코딩 할 수 있습니다.

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

가정 $value되고 json_encode는 PHP 측에 수 (보통이다). 이 기술은 예를 들어 스택 오버플로가 채팅에서 수행하는 작업입니다 (PHP 대신 .NET 만 사용).

신청

응용 프로그램을 작성하는 경우-갑자기 초기로드 시간이 항상 응용 프로그램의 지속적인 성능만큼 중요하지는 않으며 데이터와 코드를 별도로로드하기 위해 비용을 지불하기 시작합니다.

내 대답은 여기에 어떻게 자바 스크립트에서 AJAX를 사용하여로드 데이터에 대한 설명 :

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 database call
     echo json_encode($val); // Write it to the output
 $>

이런 식으로 JavaScript 파일은 코드를 요구하거나 레이아웃을 요구하지 않고 데이터를 요구하고 보여줍니다. 이것은 더 깨끗하고 응용 프로그램이 높아질수록 지불을 시작합니다. 또한 문제를보다 효과적으로 분리 할 수 ​​있으며 서버 측 기술없이 클라이언트 측 코드를 테스트 할 수 있습니다.

포스트 스크립트 : 당신은 할 필요가 매우 당신이 PHP에서 자바 스크립트 아무것도 주입 할 때 XSS 공격 벡터를 알고 있습니다. 그건 아주 제대로 값을 탈출하기 어렵다과는 상황이다. XSS를 처리하는 방법을 잘 모르거나 모르는 경우이 OWASP 기사 , 기사이 질문을 읽으십시오 .


4
@cHao 더 일반적으로-인코딩은 일련의 문자로 정의되며 개념적 객체의 존재는 철학적 인 것입니다. 그러나 JSON 객체와 같은 것이 있으며 JSON 문법으로 정의됩니다. {}유효한 JSON 객체입니다 - 볼 json.org
벤자민 Gruenbaum

1
그러나 그 정의를 사용하고 있다면 모든 "JSON 객체"는 JS에서 유효합니다.
cHao

1
@cHao는 미묘한 점에 주목하십시오. JavaScript에는 객체 개념이 있고 JSON에는 객체 개념이 있습니다 -동일하지 않습니다. 사람들이 "JSON 객체"라는 용어를 잘못 사용하는 경우, JavaScript 랜드에서 JSON은 데이터 직렬화 형식으로 사용되고 JSON 객체는 문자열 (서버 측 언어의 SQL 쿼리와 유사)에 나타나는 JS 객체를 의미합니다 . 그러나이 답변에서 JSON 메소드는 대부분의 JSON 객체가 유효한 JavaScript 객체이므로 JSON 객체를 JavaScript 코드로 작성 한다는 사실에 의존 합니다.
Benjamin Gruenbaum

1
@cHao 아,하지만 어제 :이 순간을 예견 한 stackoverflow.com/questions/23752156/...
벤자민 Gruenbaum

2
알았어, 거기 도착 했어 :) 그래도 여전히 안전합니다. PHP의 기본 동작은 이러한 문자 (ASCII 이외의 문자와 함께)를 이스케이프 처리하는 것이므로 \u2028등을 제외하고는 절대로 출력으로 들어 가지 않습니다. 명시 적으로 말하지 말아야합니다.
cHao

85

나는 보통 HTML에서 data- * 속성을 사용합니다.

<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');

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

이 예제는 jQuery를 사용하지만 다른 라이브러리 또는 바닐라 JavaScript에 맞게 조정할 수 있습니다.

https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement.dataset 에서 dataset 속성에 대한 자세한 내용을 확인할 수 있습니다.


4
간단한 문제에 대한 멋진 솔루션을 과도하게 분석하고 구현하고 싶지는 않습니다. 이 방법은 PHP를 Javascript와 분리하므로 PHP는 여전히 HTML 만 생성하고 Javascript는 PHP 파일 외부에있을 수 있습니다.
alds

2
이것이 최선의 선택이라는 데 동의합니다. 대기 시간없이 모든 보안 문제를 해결합니다. JS를 HTML 페이지에서 완전히 제외시킬 수 있습니다. HTML은 응용 프로그램 서버에서 제공해야하지만 JS (및 CSS)는 그렇지 않습니다. 또한 더 의미 론적입니다.
Ryan

1
@Quentin 출력이 HTML 자체가 아닌 한 모든 출력을 이스케이프해야합니다.
yuikonnu

2
@asdasd — 글쎄, 나는 일반적인 경우가 아니라 답변에서 코드의 특정 문제를 해결하고있었습니다.
Quentin

1
@kanji – 모범 사례가 없습니다. div괜찮지 만 원하는 태그를 사용할 수 있습니다. 에 있어야한다 body생각.
Timm

38
<script>
  var jsvar = <?php echo json_encode($PHPVar); ?>;
</script>

json_encode ()에는 다음이 필요합니다.

  • PHP 5.2.0 이상
  • $PHPVar UTF-8, 유니 코드로 인코딩됩니다.

19

다음 방법 중 하나를 사용하십시오.

<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>

4
기존 답변보다 어떤 가치가 있습니까?
Benjamin Gruenbaum

5
간단하고 똑바로 유지하십시오. 깊은 설명을 파헤칠 시간이 많은 모든 사용자를 위해
Nishant Mendiratta


이것은 어리석은 질문 일지 모르지만 PHP 세계에는 전혀 익숙하지 않습니다. 위의 코드를 .php 파일로 작성하면 JavaScript 파일 또는 "index.html"파일의 "js_variable"에 어떻게 액세스합니까?
Ankit Prajapati

@AnkitPrajapati 문서 준비 상태를 확인하여 액세스하십시오. 다음 스크립트를 사용합니다. document.onreadystatechange = () => { if (document.readyState === 'complete') { // document ready alert(js_variable) } };
Nishant Mendiratta

11

나는 워드 프레스가 그 enqueuelocalize 함수 와 함께 작동하는 방식을 매우 좋아한다. 따라서이 모델에 따라 스크립트 의존성에 따라 스크립트를 페이지에 넣고 스크립트에 추가 데이터를 제공하는 간단한 클래스를 작성했다.

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'에 의존하는 'jquery-ui'에 정의되어 있기 때문에 이전에 인쇄됩니다. 'custom-script'에 대한 추가 데이터는 새 스크립트 블록 안에 있으며 그 앞에 배치되며 mydata, 이제 'custom-script'에 사용할 수있는 추가 데이터를 보유하는 객체가 포함 됩니다.


10

이 시도:

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

-

-한동안 시도한 후

작동하지만 성능이 느려집니다. PHP는 서버 측 스크립트이고 JavaScript는 사용자측입니다.


4
우리는 설명과 맥락을 제공하는 긴 답변을 찾고 있습니다. 한 줄만 대답하지 마십시오. 인용에 이상적으로 답이 적합한 이유를 설명하십시오. 설명이 포함되지 않은 답변은 제거 될 수 있습니다. 이것은 질문에 쓰여 있습니다.
Madara 's Ghost

3
PHP 코드에
반영된

5
확실해? 이 질문에 대한 최고의 답변을 보셨습니까? 꽤 많이 설명합니다. 귀하의 솔루션이 안전하지 않다는 것은 말할 것도 없습니다. $phpVariable = '42"; alert("I am evil!");';
Madara의 유령

9
이건 내 문제를 해결 내 제안하고 내가 몇 가지 중 하나가 흥미 희망, 추가 그래서 이전 답변에서 찾을 수 없습니다
Yosra 나가 티

1
에코 여기 첨가 그것에이 PHP 코드를 갖는 웹 페이지를 인쇄하거나 JS 변수 @ YosraNagati에 데이터를 넣을 구문 단지 일부하도록.
SUMIT KUMAR 싱

8
myPlugin.start($val); // Tried this, didn't work

$valJavaScript와 관련하여 정의되지 않았기 때문에 작동하지 않습니다 . 즉 PHP 코드가 아무것도 출력하지 않았습니다 $val. 브라우저에서 소스를 보시면 다음과 같습니다.

myPlugin.start(); // I tried this, and it 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 코드 출력이 안전하지 않으므로로 필터링해야합니다 json_encode().

편집하다

myPlugin.start(<?=$val?>:-\ 에서 빠진 괄호를 보지 못했기 때문에

@Second Rikudo가 지적했듯이 올바르게 작동 $val하려면 닫는 괄호를 포함해야합니다.$val="42);"

PHP가 이제 myPlugin.start(42);JavaScript 코드에 의해 실행될 때 예상대로 작동하고 작동 한다는 것을 의미합니다 .


JSON은 데이터를 인코딩 :myPlugin.start(<?=json_encode($val)?>);
kingprawn

6

PHP를 사용하여 JavaScript 변수를 할당하는 쉬운 방법을 찾았습니다.

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

JavaScript 코드는 다음과 같습니다

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");
}

2
데이터 속성은 문제에 대한 합리적인 해결책이지만 데이터를 이스케이프하지 않으면 원래 질문과 비슷한 문제가 발생합니다. JS 대신 HTML로 이스케이프 처리하면됩니다.
Quentin

5
  1. 데이터를 JSON 으로 변환
  2. JSON 파일 을 받기 위해 AJAX 호출
  3. JSONJavascript 객체 로 변환

예:

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);
      }
   }
}

5

다음은 옵션으로 게시되지 않은 것입니다. 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 JavaScript code 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;
?>

변수가 HTML을 생성하는 PHP 스크립트에 존재하므로 동적 생성의 중요한 단계를 놓쳤습니다 var1=value1. 데이터에 '문자가 포함되어 있으면 스크립트가 중단됩니다 .
Quentin

@Quentin 코드 EXAMPLE은 제시된대로 오류없이 작동합니다. 사용법을 보여주기위한 것입니다. 프로그래머가 코딩 에까지 이르면 $ _GET 변수에 작은 따옴표 / 큰 따옴표가 미치는 영향을 이해할 것입니다. 어쨌든 urlencoded해야합니다. var1 != [some HTML code]... 분명히 var1=="value1". 분명히, 당신은 내가 놓친 것이 잘못되었습니다. EXAMPLE 스크립트는 완성되었으며, 보시다시피 HTML을 생성하지 않으며 OP는 HTML을 언급하지 않았습니다. 그것은 몇 가지 트리거 행복 bypasser하여 downvote을받을 자격이되지 않습니다 - 후퇴 downvote을
aequalsb

문제의 코드는 OP가 인용 / 이스케이프를 이해하지 못함을 보여줍니다. 그것에 대한 이해 부족은 전체 문제입니다! 예제가 완료되었지만 질문에 표시된 문제를 해결하는 방법의 예는 아닙니다.
Quentin

@Quentin 정확히 OP는 인용 / 이스케이프를 이해하지 못한다는 것을 어떻게 보여줍니까? 그것은 영업 이익은 자바 스크립트로 PHP 데이터를 가져 오는 방법을 요구하기 때문에, 문제를 해결하는 방법에 대한 예입니다 - 내 예는 다른 답변에서 언급되지 않은 하나의 방법입니다
aequalsb

이스케이프하거나 인코딩 할 필요가없고 $val때때로 작동하고 때때로 작동 하지 않는이 코드 조각으로myPlugin.start(<?=$val?> // this works sometimes, but sometimes it fails
Quentin

3

요령은 다음과 같습니다.

  1. 해당 변수를 사용하는 'PHP' 는 다음과 같습니다 .

    <?php
        $name = 'PHP variable';
        echo '<script>';
        echo 'var name = ' . json_encode($name) . ';';
        echo '</script>';
    ?>
  2. 이제이라는 JavaScript 변수가 있으며이 변수 'name'를 사용하는 JavaScript 코드는 다음과 같습니다.

    <script>
         console.log("I am everywhere " + name);
    </script>

실제로 소스 코드에 인쇄되지 않도록 얻을 수있는 방법이 있습니까? 나는 지나가는 거대한 배열을 가지고 있으며 소스를 막습니다.
William Howley

1
예제 테스트 사례를 제공 할 수 있습니까?
Ramin Taghizada

이 답변의 "3. JavaScript로 직접 데이터 에코"와 동일하지 않습니까? 저것은 더 좋아 보인다.
간지

3

변수가 항상 정수라고 가정 해 봅시다. 이 경우 더 쉽습니다.

<?PHP
    $number = 4;

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

출력 :

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

변수가 정수가 아니라고 가정하지만 위의 방법을 시도하면 다음과 같은 결과가 나타납니다.

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

그러나 JavaScript에서 이것은 구문 오류입니다.

PHP에서는 json_encode문자열을 JSON 객체로 인코딩 하는 함수 호출 이 있습니다.

<?PHP
    $number = 'abcd';

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

이후 abcdJSON이에 "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>

콘솔 출력

여기에 이미지 설명을 입력하십시오


2

많은 연구 끝에 가장 쉬운 방법은 모든 종류의 변수를 쉽게 전달하는 것입니다.

서버 스크립트에는 두 개의 변수가 있으며이를 클라이언트 스크립트로 보내려고합니다.

$php_var1 ="Hello world";
$php_var2 ="Helloow";
echo '<script>';
echo 'var js_variable1= ' . json_encode($php_var1) . ';';
echo 'var js_variable2= ' . json_encode($php_var2) . ';';
echo '</script>';

페이지에서 호출 된 JavaScript 코드에서 해당 변수를 호출하면됩니다.


1

전송할 데이터가 문자열이라고 가정하겠습니다.

다른 논평가들이 언급했듯이, AJAX는 하나의 가능한 솔루션이지만, 단점은 전문가보다 중요합니다. 간단하고 프로그래밍하기가 어렵습니다 (서버 및 클라이언트 측 모두 값을 검색하는 코드가 필요합니다). 탈출 기능으로 충분합니다.

그래서 우리는 탈출로 돌아 왔습니다. UTF-8 데이터가 필요 하기 때문에 소스 문자열을 아직 UTF-8로 인코딩하지 않은 경우 먼저 UTF-8로 인코딩하면 json_encode($string)작동 합니다json_encode . 문자열이 ISO-8859-1에 있으면 간단하게 사용할 수 있습니다 json_encode(utf8_encode($string)). 그렇지 않으면 항상 iconv변환을 먼저 수행하는 데 사용할 수 있습니다 .

그러나 큰 문제가 있습니다. 이벤트에서 사용하는 htmlspecialchars()경우 올바른 코드를 만들려면 결과 를 실행해야 합니다. 그런 다음 큰 따옴표를 사용하여 이벤트를 묶거나 항상 ENT_QUOTEShtmlspecialchars에 추가 해야합니다. 예를 들면 다음과 같습니다.

<?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일반 JavaScript 코드 ( <script>... </script>태그로 묶인 코드) 에서는 사용할 수 없습니다 . htmlspecialchars이벤트 코드를 작성할 때 결과 를 잊어 버리기 때문에이 기능을 실수로 사용하기 쉽습니다 .

이벤트를 항상 작은 따옴표로 묶거나 항상 큰 따옴표로 묶는 한, 문제가없는 함수를 작성할 수 있으며 이벤트와 일반 JavaScript 코드 모두에서 사용할 수 있습니다. 여기 내 제안은 큰 따옴표로 묶어야합니다 (내가 선호하는).

<?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>';

0

귀하의 코드에 따라

<$php
     $val = $myService->getValue(); // Makes an API and database call
     echo '<span id="value">'.$val.'</span>';
$>

이제 DOM을 사용하여 가치를 얻고 span id의 innerHTML을 사용할 수 있습니다.이 경우 서버 또는 Ajax 또는 다른 것을 호출 할 필요가 없습니다.

귀하의 페이지는 PHP를 사용하여 인쇄하고 JavaScript를 사용하면 DOM을 사용하여 가치를 얻을 수 있습니다.


이 코드는 <and와 같은 문자를 이스케이프하지 않기 때문에 XSS에 취약합니다 >. 또한 유사한 솔루션이 이미 제안되었습니다.
Michał Perłakowski

0
<?php

    $val = $myService->getValue(); // Makes an API and database call

    echo "
        <script>
            myPlugin.start({$val});
        </script> ";

?>

0

PHP

$fruits = array("apple" => "yellow", "strawberry" => "red", "kiwi" => "green");
<script>
    var color = <?php echo json_encode($fruits) ?>;
</script>
<script src="../yourexternal.js"></script>

JS (yourexternal.js)

alert("The apple color is" + color['apple'] + ", the strawberry color is " + color['strawberry'] + " and the kiwi color is " + color['kiwi'] + ".");

산출

사과 색은 노란색, 딸기 색은 빨간색, 키위 색은 녹색입니다.


-2

아래 코드를 사용하는 데 문제가 <?php echo $username?>있거나 계속 표시 되는 사람은 mime_module 섹션에서 httpd.conf를 편집하여 'AddType application / x-httpd-php .html .htm'을 추가하십시오. 기본적으로.

<?php
    $username = 1;
?>

<script type="text/javascript">
    var myData = <?php echo $username ?>;
    console.log(myData);
    alert(myData);
</script>

@MadaraUchiha 왜 설명 할 수 있습니까?
Nikita 웃

3
그렇다면 $username === "hello", 당신은 var myData = hello;끔찍하게 깰 것입니다.
Madara의 유령

-2

사용하다:

<?php
    $your_php_variable= 22;
    echo "<script type='text/javascript'>var your_javascript_variable = $your_php_variable;</script>";
?>

작동합니다. JavaScript 변수를 할당 한 다음 기존 PHP 변수의 값을 전달하면됩니다. PHP는 여기에 JavaScript 행을 작성하므로 PHP 변수의 값을 가지며 직접 전달할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.