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

나는 워드 프레스가 그 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'에 의존하는 '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. 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);
      }
   }
}

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.