2017-04-20 17 views
0

我試圖使用XmlHttpRequest從JavaScript文件運行php腳本。但由於某些原因,我的代碼只是將字符串作爲字符串返回,而不是實際運行它。從javascript文件調用時,php將無法運行

如果我從全局URL單獨運行它,php運行得很好,但它不會從javascript文件運行,這意味着我的javascript請求出現問題了嗎?

我使用Apache和nodejs在Ubuntu上本地運行所有內容。我早前被引導到這個鏈接:PHP code is not being executed, instead code shows on the page,但是看起來Ubuntu沒有httpd.conf文件,而是使用apache2.conf。我不確定它們之間有什麼區別或如何在不破壞它的情況下如何處理它。另外,上面的鏈接只是暗示它是php的錯?但是當我通過全球網址訪問時,我的php文件運行得非常好。

下面是是應該調用PHP文件的JavaScript代碼片段:

function drawOutput(responseText) { 
    console.log(responseText); 
} 
function drawError(status) { 
    console.log('Error: ' + status); 
} 
// handles the response, adds the html 
function getRequest(url, success, error) { 
    var req = false; 
    try{ 
     // most browsers 
     req = new XMLHttpRequest(); 
    } catch (e){ 
     console.log("XML request failed."); 
     return false; 
    } 
    if (!req) return false; 
    if (typeof success != 'function') success = function() {}; 
    if (typeof error!= 'function') error = function() {}; 
    req.onreadystatechange = function(){ 
     if(req.readyState == 4) { 
      return req.status === 200 ? success(req.responseText) : error(req.status); 
     } 
    } 
    req.open("GET", url, true); 
    req.send(null); 
    return req; 
} 
var urlString = '../tests/server_scripts/page_load.php' + encodeURIComponent('game_id') + '=0&' + encodeURIComponent('client_timestamp') + '=10'; 

//var urlString = "http://rpal.cs.cornell.edu/YH/public/tests/server_scripts/page_load.php?" + encodeURIComponent('game_id') + '=0&' + encodeURIComponent('client_timestamp') + '=10'; 
//var urlString = 'http://localhost/YH/WebHanabi/public/tests/server_scripts/page_load.php&' + encodeURIComponent('game_id') + '=0&' + encodeURIComponent('client_timestamp') + '=10'; 
console.log(urlString); 
var urlRequest = getRequest(
    urlString, // URL for the PHP file 
    drawOutput, // handle successful request 
    drawError // handle error 
); 

編輯: 這是我的HTML:

<!DOCTYPE html> 
<html> 
<head> 
    <title>Hanabi Lobby</title> 
    <link href="//netdna.bootstrapcdn.com/font-awesome/4.1.0/css/font-awesome.min.css" rel="stylesheet"> 
    <script src="/js/classList.js"></script> 
    <script src="/js/socket.io.js"></script> 
    <script src="/js/bokeh.js"></script> 
    <script src="/js/lobby.js"></script> 
</head> 
<body> 
    <div id="header">Hanabi Lobby<hr></div> 
    <div id="body"> 
     <div id="info-row"> 
      <ul> 
       <li><span class="info-title">Name:</span><span class="editable" title="Click to edit"><span class="name editable-text">My Name</span><i class="fa fa-edit edit"></i></span></li> 
       <li><span class="info-title">Room:</span><span class="room">My Room</span></li> 
      </ul> 
     </div> 
     <div id="content"> 
      <div class="column"> 
       <div class="column-title">Rooms</div> 
       <div class="column-container rooms"> 
        <ul class="room-list"> 
         <li class="joinable" x-room="room 1">room 1</li> 
         <li class="joinable" x-room="room 2">room 2</li> 
         <li class="selected-room" x-room="room 3">room 3</li> 
         <li class="joinable" x-room="room 4">room 4</li> 
        </ul> 
        <ul class="bottom-buttons"> 
         <li id="new-room-button"><i class="fa fa-plus-circle" style="position: absolute; left: 10px; bottom: 5px;"></i> New Room</li> 
        </ul> 
       </div> 
      </div> 
      <div class="column"> 
       <div class="column-title">Participants</div> 
       <div class="column-container participants"> 
        <ul class="clients-list"> 
         <li class="ready">person 1</li> 
         <li class="not-ready">person 2</li> 
         <li class="ready">person 4</li> 
        </ul> 
        <ul class="bottom-buttons"> 
         <li id="ready-button"><i class="icon fa fa-play-circle" style="position: absolute; left: 10px; bottom: 5px;"></i><span class="text">Ready</span></li> 
        </ul> 
       </div> 
      </div> 
     </div> 
    </div> 
    <div id="footer">Sweet game bro!</div> 
</body> 
</html> 

這裏就是我想從運行PHP文件javascript:

<?php 
header('Access-Control-Allow-Origin: *'); 
include("connection.php"); 
//specific 
if(!isset($_GET["game_id"]) || !isset($_GET["client_timestamp"])){ 
     print(json_encode(array("error_code" => "1", "message" => "missing game_id or client_timestamp"))); 
    return; 
} 
$game_id = $_GET["game_id"]; 
$client_timestamp = $_GET["client_timestamp"]; 
if(!is_numeric($game_id) || !is_numeric($client_timestamp)){ 
    print(json_encode(array("error_code" => "2", "message" => "game_id or client_timestamp malformed, integers only"))); 
    return; 
} 

// jsonp 
$jsonp = false; 
if (isset($_GET["callback"])) { 
    $jsonp = true; 
    $jsonp_methodname = $_GET["callback"]; 
} 

//insert new id 
$user_id = isset($_GET["user_id"]) ? $_GET["user_id"] : generateRandomString(40); 
if(!isset($_GET["user_id"])){ 
    $st1 = $mysqli->prepare("INSERT INTO users (user_id, user_info) VALUES (?, ?)"); 
    $user_info = isset($_GET["user_info"]) ? $_GET["user_info"] : ""; 
    $st1->bind_param("ss", $user_id, $user_info); 
    $st1->execute(); 
} 
$st = $mysqli->prepare("INSERT INTO player_pageload_log (user_id, server_timestamp, game_id, version_id, session_id, client_timestamp, host_domain, referrer_host, referrer_path) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)"); 
$server_timestamp = time(); 
$version_id = isset($_GET["version_id"]) ? $_GET["version_id"] : 1; 
$session_id = isset($_GET["session_id"]) ? $_GET["session_id"] : generateRandomString(36); 
$host_domain = $_SERVER["HTTP_HOST"]; 
$referrer_host = $_SERVER["HTTP_USER_AGENT"]; 
$referrer_ip = $_SERVER["REMOTE_ADDR"]; 
$st->bind_param('siiisisss', $user_id, $server_timestamp, $game_id, $version_id, $session_id, $client_timestamp, $host_domain, $referrer_host, $referrer_ip); 
$st->execute(); 

// Return response as either json or jsonp if method wrapper (as GET param 'callback') was specified. 
$json_response = json_encode(array("error_code" => "0", "message" => "success", "user_id" => $user_id, "session_id" => $session_id)); 
if ($jsonp) { 
    print($jsonp_methodname . '(' . $json_response . ');'); 
} 
else { 
    print($json_response); 
} 
?> 
+0

您是從文件系統還是從服務器運行腳本,它是像'file:/// var/www/html/index.html'這樣的東西嗎? –

+0

,如果它不是'file:///',但確實是'http:// localhost',那麼看看你的js控制檯。 –

+0

看看你以前的另一個問題http://stackoverflow.com/q/43421794/1415724你說你試過// InsertAbsolutePathHere/tests/my_file.php和file:/// InsertAbsolutePathHere/tests/my_file。 php' - 問題是清楚的,儘管你所有的過去的問題。 –

回答

0

我假設javascript文件在本地運行?

然後問題是因爲PHP需要運行Apache和PHP引擎才能顯示它。你的代碼實際上做的是進入後端,打開一個帶有.php擴展名的文件並讀取該文件。不要使用絕對文件路徑,請嘗試使用URL。

+0

通過網址,你的意思是像「var urlString =」http://rpal.cs.cornell.edu/YH/public/tests ...「(整件事情太長了放在這裏)? – xxiane

+0

當然,那但是你需要在前面加上「http://」,下面是這個,PHP只是明文,不像編譯的文件那樣是shell代碼。你不能執行原始的PHP。它必須通過翻譯。 Apache被配置爲在用戶訪問.php文件時使用PHP解釋器。除了Apache之外,如果你只是想抓住文件並閱讀它,那麼你最終只會這樣做:閱讀它。 另一種方法是執行一個shell命令「php myphpfile.php」 –

+0

對不起,我不太理解這個解釋。我對後端和一切都很陌生。我不完全確定Apache如何工作。我所知道的是,有一些文件集合在一起構成了這個Apache,沒有它,php就不能運行。但是當我在瀏覽器中打開文件時,爲什麼php運行正常,但是當我從JavaScript調用它時,卻不能運行?僅僅是因爲我調用它的文件是以.js而不是.php開頭的,所以Apache找不到它? – xxiane