2017-01-11 1 views
0

私のHTMLファイルは、特定の関数を呼び出すためにパラメータをPHPファイルに渡すJSファイルの関数を呼び出します。私の問題は、PHPセッションが生き続けるようにして、ユーザーがログイン関数を呼び出すと、$接続変数が生きていて、ユーザーが最終的にloadBD関数を呼び出し、AjaxがPHPファイル$接続変数は空です。私はログインの詳細を含むファイルを使用してPHPファイルの先頭にインクルードすることができますが、詳細はまだ分かっていないため動作しません。一度しかログインできないのですか?ここでネイティブJSのAJAXでPHPセッションを維持するにはどうすればよいですか?

は、JSファイルである:ここで

function runScript(params) { 
xhr = new XMLHttpRequest(); 
xhr.open('POST', 'scripts.php', true); 
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); 
xhr.onload = function() { 
    if (xhr.status === 200) { 
     document.getElementById("demo").innerHTML = xhr.responseText; 
    } 
    else { 
     alert('Request failed. Returned status of ' + xhr.status); 
    } 
}; 
xhr.send(encodeURI(params)); 
} 

function login() { 
    var params = "func=login"; 
    params += "&svr=" + document.getElementById('srv').value; 
    params += "&name=" + document.getElementById('name').value; 
    params += "&psw=" + document.getElementById('psw').value; 
    ; 
    runScript(params); 
} 

function loadBD() { 
    var params = "func=load_db"; 
    runScript(params); 
} 

は私のPHPファイルです:

<?php 

$func = $_POST["func"]; 
$connection; 

switch ($func) { 
    case 'login': 
     login(); 
     break; 
    case 'load_db': 
     load_db(); 
     break; 
    default: echo 'Function Error'; 
    break; 
} 

function login() { 
    $connection = @mysqli_connect($_POST["svr"], $_POST["name"], $_POST["psw"]) or die("initial host/db connection problem"); 
    if(errorCheck($connection)) { 
     getDatabases($connection); 
    } 
} 

function errorCheck($connection) { 
    if (!$connection) { 
     echo "internal error " . mysqli_errno(); 
     return FALSE; 
    } else { 
     return TRUE; 
    } 
} 

function getDatabases($connection) { 
    $result = mysqli_query($connection, "SHOW DATABASES"); 
    $available = array(); 
    $index = 0; 

    while($row = mysqli_fetch_row($result)){ 
     if (($row[0]!="information_schema") && ($row[0]!="mysql")) { 
      echo $row[0]; 
      $available[$index] = $row[0]; 
      $index += 1; 
      echo "<a href='javascript:loadDB();' >Load $row[0]</a>"; 
      echo "<br>"; 
     } 
    } 
} 

function load_db() { 
    echo "loading"; 
    echo $connection; 
} 

?> 
+1

接続変数は、セッションが有効であるかどうかにかかわらずありません。 (1)PHP変数は、リクエストの期間だけスコープ内にあります。 (2)変数を '$ _SESSION'スーパーグローバルに格納しても、[永続的接続](http://php.net/manual/en/)を使用していない限り、要求が完了するとデータベース接続は閉じられます。 features.persistent-connections.php)これは完全に別のものです。 – apokryfos

+0

PHPファイルのログイン機能は毎回呼び出すことをお勧めしますか?もしそうなら、どうすればログイン情報を保存して再利用できますか? – user7391050

+0

通常、ユーザーはサインイン情報をサーバーに一度だけ送信します。サーバー上でチェックし、有効であれば変数を['$ _SESSION'](http://php.net/manual/en/session.examples.basic.php)に格納します。この変数には" thisユーザーがサインインしました "。 '$ _SESSION'スーパーグローバルは特定のユーザに関する情報しか持っていないので、安全です(ほとんどの場合)。 – apokryfos

答えて

1

あなたが要求間のオープン接続を維持することはできません。それは実際にPHPがどのように動作するかではありません(デフォルトでは、とにかく)。あなたができることは、ユーザーセッションの接続の詳細をPHPの$_SESSIONに保存し、それを使ってユーザーがPHPスクリプトにヒットしたときにデータベースへの接続を再確立することです。

+0

ありがとう、私はそれを試してみると報告バック – user7391050

2

これは非常に危険で、非常に悪い考えです。データベースの資格情報をWebページに公開しています。標準的な方法は、データベースの設定をサーバ上の安全な場所に保存し、PHPから設定ファイルを直接参照することです。

リクエスト間でデータベース接続を維持することは、PHPセッションとは別です。設定の詳細に大きく依存しますので、詳細はofficial docsをご覧ください。

PHPセッション自体は、セッションクッキーを介して要求を渡って追跡されるという意味で「生きている」という意味で「生きている」という意味です。同じクッキーが存在し、セッションがexpiredでなければ、それを "生きている"ように保つために余分なことをする必要はありません。

+0

私は、PHPを介してファイルにデータを格納するために人々が言う剪断量に少し圧倒される。したがって、ファイルが安全な場所にあると仮定すると、Jsonを使用するのが適切でしょうか? – user7391050

+0

はい、構成の一般的なファイル形式には、INI、YAML、およびJSONがあります。 –

関連する問題