2011-07-26 80 views
3

我的index.php中是否可以通過ajax直接發送一個php會話變量?

<?php 

    include_once '..\connect.php'; 

    session_start(); 

    if (isset($_SESSION['username'])){ 
     $player_name = $_SESSION['username']; 

    } else {  
     header('Location: http://localhost/Inventory/index.php') ; 
     exit; 
    } 

    ?> 

和IM做出Ajax請求得到這request.php

<?php 
    //connect to databate and check for errors 
    $con = mysql_connect ("localhost","root",""); 
    if (!$con) { 
     die ('Could not connect to database: ' . mysql_error()); 
    } 

    //select database and check selection 
    if (!mysql_select_db ("GotA", $con)) { 
     die ('Could not select database: ' . mysql_error()); 
    } 

//I have to create this if not it doesnt find the sessions $player_name variable 
    $player_name = $_POST['name']; 

    //***Create Player Array**// 
    $player_info = "SELECT * from players where id = $player_name"; 
    $player_info2 = mysql_query($player_info) or die ('Couldnt get players name'); 
    $player_info3 = mysql_fetch_array($player_info2); 

那麼它只是似乎不安全以檢索從使用可變發送的databe數據與JavaScript不是有沒有辦法從index.php(會話部分)直接使用變量? 還是安全的,只是通過使用JavaScript的信息?

+0

請,請閱讀[這個問題](http://stackoverflow.com/questions/60174/best-way-to- stop-sql -injection-in-php)及其接受的答案。明白它。用它。 –

+0

謝謝大家對您的意見和答案,我就要通過他們和鏈接時,我找到解決讀病報告 – Thaiscorpion

回答

2

從我以前使用jQuery的經驗來看,會話仍然可以與ajax請求一起工作,只要您在被調用腳本的頂部調用了session_start(),您應該可以訪問會話變量。

+0

敢肯定你錯了......我敢肯定,90%我已經能夠設置/獲取使用AJAX http://stackoverflow.com/questions/607673/setting-a-php-sessionvar-using-jquery –

3

你爲什麼不只是再次request.php檢索會話?

相反的:

$player_name = $_POST['name']; 

用途:

$player_name = $_SESSION['username']; 

另外,請務必在此之前使用session_start()

+0

權,但我不會在這裏談論任何JS,只有PHP會話變量。 JS只是調用一個PHP頁面,它可以訪問會話。 –

+0

傑森,是正確的,它可以* *如果知道會話ID和你打電話'SESSION_ID(散)'。只調用'session_start'將不會重新設置會話,因爲PHP將AJAX視爲它自己的唯一會話。 –

+0

我從來沒有使用session_id這樣的東西。我說過的方式在過去很多次對我來說都很好。 –

1

你的AJAX請求,儘管它從JavaScript來了,仍然可以訪問瀏覽器的會話狀態。您也可以回退到貼出的變量:

request.php:其他

<?php 
session_start(); 

// Set $dbuser and $dbpass in a secure configuration file 
$dbh = new PDO('mysql:host=localhost;dbname=GotA', $dbuser, $dbpass); 

if (isset($_SESSION['username'])) 
    $player_name = $_SESSION['username']; 
else 
    $player_name = $_POST['name']; 

$stmt = $dbh->prepare('SELECT * from players where id = :playername'); 
$stmt->execute(array(':playername' => $player_name)); 

$result = $stmt->fetchAll(); 

一兩件事,有asyncronous會話感知請求可能會導致競爭條件,如果你運行多個異步請求。有關信息,請參閱this article。只要你只是閱讀會話變量,而不是寫它們(或明確結束會話),那麼你應該沒問題。 (如果有人對前面的陳述有明確的答案,請在評論中分享)