2017-07-17 19 views
0

AJAX/JSONを介してJavaScriptに転送されるPHP変数に関する質問があります。AJAXがページの読み込み時にJavascript変数を更新しない

var ChronoIDを、PHPコードからAJAX getから取得した値で更新するようにします。 AJAXで正常に動作していても、は未定義に戻り、後で使用するために変数を更新しません。

私は間違って何をしていますか、JavaScript変数にPHP変数を転送する最良の方法は何ですか?

- scripts.js

$(document).ready(function() { 
var jsonGet; 
var chronoID; 
var timeworked; 
var startAt; 

$.ajax({ 
     type: "GET", 
     url: "detectopencrono.php", 
     dataType: "json", 
     success: function (response) { 
      jsonGet = response; 
      console.log(jsonGet); // JSON Array (works) 
      var arr = $.map(jsonGet, function (el) { 
       return el; 
      }); 
      console.log(arr); // JavaScript Array (after parse, works) 
      chronoID = arr[0]; // (works) 
      $("#chrono" + chronoID + "").show(200); 
      console.log(chronoID); // Works, shows value 
     } 
    }); 

console.log(chronoID); // Undefined (doesn't work) 

}); 

- "AJAX" でdetectopencrono.php

<?php 
    include("connection.php"); 
    session_start(); 

    /*if (isset($_POST['projectname'], $_POST['startyear'], $_POST['startmonth'], $_POST['startday'], $_POST['deadyear'], $_POST['deadmonth'], $_POST['deadday'], $_POST['lider'], $_POST['hours'], $_POST['budget'])) 
    {*/ 

    $iduser = $_SESSION['ID']; 

    if(isset($_SESSION['gbsn'])) 
    { 
     $wasopenresult = mysqli_query($mysqli, "SELECT ID, IsGbsn FROM subtask WHERE Crono='Y' AND IsGbsn='Y' AND IDUser='$iduser'") 
      or die("Não foi possivel executar o pedido."); 
    } 
    else 
    { 
     $wasopenresult = mysqli_query($mysqli, "SELECT ID, IsGbsn FROM subtask WHERE Crono='Y' AND IsGbsn='N' AND IDUser='$iduser'") 
      or die("Não foi possivel executar o pedido."); 
    } 

    if(mysqli_num_rows($wasopenresult)==1) 
    { 
     $rowwasopen = mysqli_fetch_assoc($wasopenresult); 
     $result1 = $rowwasopen['ID']; 
     $result2 = $rowwasopen['IsGbsn']; 
     echo json_encode(array('userid' => $result1,'gbsn'=> $result2)); 
     header('Content-Type: application/json'); 
    } 
    ?> 
+1

[ブラウザのデベロッパーツールでAJAX要求/応答を監視しましたか?プロジェクトにjQueryライブラリを含めましたか?エラーが報告されていますか?あなたはこれをWebサーバーで実行していますか?](http://jayblanchard.net/basics_of_jquery_ajax.html) –

+1

[Little Bobby](http://bobby-tables.com/)は*** [あなたのスクリプトはSQLインジェクション攻撃のリスク。](http://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in-php)*** [prepared]について学ぶ(http:// en .wikipedia.org/wiki/Prepared_statement)の[MySQLi]に関する記述(http://php.net/manual/en/mysqli.quickstart.prepared-statements.php)を参照してください。 [文字列をエスケープする](http://stackoverflow.com/questions/5741187/sql-injection-that-gets-around-mysql-real-escape-string)でも安全ではありません! –

+1

'success'はAJAXが完了した後にコールバックされるコールバックなので、' chronoID'はまだ定義されていませんが、2番目の 'console.log()'がコールバックが完了する前に実際に実行されていると思います。 'chronoID'で何かしたいのなら、それをあなたの成功関数の中で行います。 – perfect5th

答えて

1

"A" は非同期の略です。

ある
var chronoID; 

$.ajax({ 
    // do something asynchronously, which will happen later 
}); 

console.log(chronoID); 

、あなたはそれが実際に価値を与えられていますchronoID前にログインしようとしている:何をやっている簡単にするために。代わりに、その値のAJAX呼び出し自体に応答する必要があります。あなたは既にやっている

どの...:

success: function (response) { 
    // other code which assigns a value to chronoID 
    console.log(chronoID); 
} 

をだから、基本的にあなたがここに持っているものの作業と同じことを実行しようとすると、非稼働コードの両方の同時例があります。基本的には、動作していないものを取り外して、動作しているものに固執してください。既に必要なコードがあります。

+0

しかし、どのようにchronoID後で? – atherir

+0

@atherir: "後で" "後で"という意味ならば、後で使うことができます。あなたが質問に表示しているコードの「動作していない」行は、AJAX呼び出しが完了する前に*実行されます。値が設定されているので、* AJAX呼び出しが完了した後*の値はいつでも使用できます。基本的には、まだ設定されていない値は使用できません。しかし、*それが設定された後はいつでも、あなたはそれを使うことができます。どのような操作でも、その値が設定された後に*呼び出される必要があります。 – David

+0

そして、AJAX呼び出しは完了しましたが、_success_の内部ではなく、変数を呼び出すにはどうすればよいですか? – atherir

関連する問題