2012-03-26 3 views
1

Немного времени назад я отправил this question. Я обновил этот вопрос с помощью сценария AJAX, который работал около 1 недели. В основном я могу использовать session_start() из сценария AJAX, а затем я мог бы получить доступ к переменным сеанса, которые мне нужны.AJAX скрипт перестал запоминать сеанс

Это действительно странно, но я пришел после выходных, и этим утром этот скрипт больше не работает. Это очень просто, здесь:

<?php 

session_start(); 

$ajax_connection = mysql_connect('10.X.X.X',$_SESSION['username'],$_SESSION['password']); 

$result_set = array(); 

while ($result_set[] = mysql_fetch_assoc($results)){ 
    // do nothing 
} 

echo json_encode($results); 

?> 

На прошлой неделе это работало безупречно, и теперь в моем журнале ошибок я получаю Undefined index: username и Undefined index: password предупреждения. И, конечно же, соединение MySQL не установлено. Таким образом, этот скрипт не работает на том же сеансе, что и исходное соединение. Я использовал error_log(session_id()) для проверки идентификаторов родительской страницы и сценария AJAX, и, конечно же, они разные. Когда я перезагружаю страницу и каждый раз повторяю ее, идентификаторы остаются неизменными для страницы и сценария AJAX соответственно, но они должны быть одинаковыми идентификаторами, а не двумя разными.

В любом случае, есть ли у кого-нибудь идеи, почему это больше не будет работать, после хорошей работы в течение недели?

+0

Зачем вам хранить информацию о подключении mysql в переменной сеанса? –

+0

@ N.B. Хорошо, потому что это работает. Как еще я могу получить информацию о подключении к сценарию AJAX? –

+1

Что мешает вам включить файл, содержащий учетные данные db в ваш сценарий AJAX? Для 10 000 пользователей вы должны заполнить сеансы с той же информацией. Это не реально, не так ли? Это также, по-видимому, создает проблемы для вас. Следовательно, это подразумевает плохое дизайнерское решение. Я мог бы продолжать, как это небезопасно на совместном хостинге и т. Д., Но я не буду, это просто плохое дизайнерское решение, чтобы иметь информацию db, хранящуюся в сеансе. –

ответ

4

Вот такой класс, который вы можете использовать. Именно в одноэлементном режиме убедитесь, что вы его инициируете только один раз. Создание экземпляра его

$db = Db::getInstance(); 

затем

$db->connect(); 

это является гораздо более безопасным способом использовать соединение Dbase (Обратите внимание, что я использовал PDO, но если вам действительно нужно, чтобы продолжать использовать функции mysql_, вы можете изменить Это).

class Db { 

    private static $instance = null; 
    private $db = null; 
    private $host = ''; 
    private $name = ''; 
    private $username = ''; 
    private $password = ''; 

    private function __construct() { 
     $this->host = 'yourHost'; 
     $this->name = 'yourDbName'; 
     $this->username = 'yourUserName'; 
     $this->password = 'youPassword'; 
    } 

    public static function getInstance() { 
     if(is_null(self::$instance)) { 
      self::$instance = new Db(); 
     } 
     return self::$instance; 
    } 

    public function connect() { 
     try { 
      $this->db = new PDO('mysql:host=' . $this->host . ';dbname=' . $this->name, $this->username, $this->password); 
     } catch(Exception $e) { 
      throw new Exception('Connection error: either the database is unavailable or connection infos are not valid. Please contact the webmaster.'); 
     } 
    } 
} 
0

Не уверен, если это решит вашу проблему, но вы должны добавить следующее в любом случае в верхней части вашего PHP скрипт называется в Ajax:

header('Cache-control: no-cache, must-revalidate'); 
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); 

Это были решены некоторые задачи, которые я использую, чтобы иметь с сеансами и Ajax ,

+0

спасибо за помощь, но это не решило проблему. –

+0

Должно быть добавлено после session_start(), хотя – Ronan

+0

О, спасибо, все еще не получив тот же сеанс. –