2017-01-11 2 views
0

Мой HTML-файл вызывает функции в JS-файле, которые передают параметры в файл PHP для вызова определенных функций. Моя проблема в том, что я хотел бы, чтобы сеанс PHP оставался в живых, так что, когда пользователь вызывает функцию входа в систему, переменная $ connection остается в живых и может использоваться, когда пользователь в конечном итоге вызывает функцию loadBD, а Ajax вызывает файл PHP, переменная соединения пуста. Я знаю, что могу использовать файл с регистрационными данными и включать его в начале файла PHP, но это не сработает, потому что я еще не знаю деталей. Как я могу войти только один раз?Как сохранить сессию PHP в AJAX в родной JS?

Вот файл 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), в которой говорится, что« это пользователь выполнил вход ». Суперкомпьютер '$ _SESSION' имеет информацию только о конкретном пользователе, поэтому он безопасен (большую часть времени). – apokryfos

ответ

1

Вы не можете держать соединение открытым между запросами; это не так, как работает PHP (по умолчанию, в любом случае). Что вы можете сделать, так это сохранить подробности подключения для сеанса пользователя в PHP $_SESSION и использовать это, чтобы восстановить соединение с базой данных, когда пользователь нажимает ваш PHP-скрипт.

+0

Спасибо, я дам ему попытку и отправлю отчет – user7391050

2

Это крайне неуверенно и очень плохая идея. Вы публикуете свои учетные данные в мире на своей веб-странице. Стандартная практика заключается в том, чтобы сохранить конфигурацию базы данных в безопасном месте на вашем сервере и ссылаться на этот файл конфигурации непосредственно с PHP.

Сохранение связей между живыми между запросами не зависит от сеансов PHP. Это зависит от деталей вашей настройки, поэтому см. official docs.

Сеансы PHP являются «живыми» в том смысле, что они отслеживаются через запросы через файл cookie сеанса. Пока существует тот же файл cookie, и сеанс не имеет expired, вам не нужно ничего делать, чтобы сохранить его «живым».

+0

Я немного перегружен количеством сдвига, которое люди говорят, чтобы хранить данные в файле через PHP. Итак, предполагая, что файл находится в безопасном месте, можно было бы использовать Json? – user7391050

+0

Да, общие форматы файлов для конфигураций включают INI, YAML и JSON. –

Смежные вопросы