通过jquery从php页面获取会话变量?

时间:2010-07-05 15:27:57

标签: php jquery

我编辑了我的原始文本,以便为那些不理解我的问题的人解释我的整套代码。当我的数据库使用MyISAM时,所有这一切都很完美,但当我转换到InnoDB时,我现在必须考虑我的外键,否则mysql_queries将无法成功执行。我在用户登录时创建的会话变量中有user_id。我想我需要从该会话变量中继该数字(int)并将其附加到$ _GET以便它可以转移到todo.class.php处理权吗?

最终的get()可能需要看起来像这样吗?action = new& user_id = 1(或用户所用的数字)& text =文本类型由用户...

如果有更好的方法可以做到这一点,我会全力以赴,准备好学习! ; - )

todo.js

$(document).ready(function(){
    $(".todoList").sortable({
        axis        : 'y',
        containment : 'window',
        update      : function(){

            var arr = $(".todoList").sortable('toArray');

            arr = $.map(arr,function(val,key){
                return val.replace('todo-','');
            });

            $.get('././process/todo/todo.ajax.php',{action:'rearrange',positions:arr});
        },

        /* Opera fix: */

        stop: function(e,ui) {
            ui.item.css({'top':'0','left':'0'});
        }
    });

    var currentTODO;

    $("#dialog-confirm").dialog({
        resizable: false,
        height:130,
        modal: true,
        autoOpen:false,
        buttons: {
            'Delete item': function() {

                $.get("././process/todo/todo.ajax.php",{"action":"delete","id":currentTODO.data('id')},function(msg){
                    currentTODO.fadeOut('fast');
                })

                $(this).dialog('close');
            },
            Cancel: function() {
                $(this).dialog('close');
            }
        }
    });

    $('.todo').live('dblclick',function(){
        $(this).find('a.edit').click();
    });

    $('.todo a').live('click',function(e){

        currentTODO = $(this).closest('.todo');
        currentTODO.data('id',currentTODO.attr('id').replace('todo-',''));

        e.preventDefault();
    });

    $('.todo a.delete').live('click',function(){
        $("#dialog-confirm").dialog('open');
    });

    $('.todo a.edit').live('click',function(){

        var container = currentTODO.find('.text');

        if(!currentTODO.data('origText'))
        {
            currentTODO.data('origText',container.text());
        }
        else
        {
            return false;
        }

        $('<input type="text">').val(container.text()).appendTo(container.empty());

        container.append(
            '<div class="editTodo">'+
                '<a class="saveChanges" href="#">Save</a> or <a class="discardChanges" href="#">Cancel</a>'+
            '</div>'
        );

    });

    $('.todo a.discardChanges').live('click',function(){
        currentTODO.find('.text')
                    .text(currentTODO.data('origText'))
                    .end()
                    .removeData('origText');
    });

    $('.todo a.saveChanges').live('click',function(){
        var text = currentTODO.find("input[type=text]").val();

        $.get("././process/todo/todo.ajax.php",{'action':'edit','id':currentTODO.data('id'),'text':text});

        currentTODO.removeData('origText')
                    .find(".text")
                    .text(text);
    });

    var timestamp=0;
    $('#addButton-todo').click(function(e){

        if((new Date()).getTime() - timestamp<5000) return false;

        $.get("././process/todo/todo.ajax.php",{'action':'new','text':'New Todo Item. Doubleclick to Edit.','rand':Math.random()},function(msg){

            $(msg).hide().appendTo('.todoList').fadeIn();
        });

        timestamp = (new Date()).getTime();

        e.preventDefault();
    });

});

todo.class.php

<?php
class ToDo{

    private $data;

    public function __construct($par){
        if(is_array($par))
            $this->data = $par;
    }

    public function __toString(){

        return '
            <li id="todo-' . $this->data['id'] . '" class="todo">

                <div class="text">' . $this->data['text'] . '</div>

                <div class="actions">
                    <a href="#" class="edit">Edit</a>
                    <a href="#" class="delete">Delete</a>
                </div>

            </li>';
    }

    public static function edit($id, $text){

        $text = self::esc($text);
        if(!$text) throw new Exception("Wrong update text!");

        mysql_query("UPDATE `todo` SET `text` = '".$text."' WHERE `id`=".$id    );

        if(mysql_affected_rows($GLOBALS['link'])!=1)
            throw new Exception("Couldn't update item!");
    }

    public static function delete($id){

        mysql_query("DELETE FROM `todo` WHERE `id` = ".$id);

        if(mysql_affected_rows($GLOBALS['link'])!=1)
            throw new Exception("Couldn't delete item!");
    }

    public static function rearrange($key_value){

        $updateVals = array();
        foreach($key_value as $k=>$v)
        {
            $strVals[] = 'WHEN '.(int)$v.' THEN '.((int)$k+1).PHP_EOL;
        }

        if(!$strVals) throw new Exception("No data!");

        mysql_query("UPDATE `todo` SET `position` = CASE `id`".join($strVals)." ELSE `position` END");

        if(mysql_error($GLOBALS['link']))
            throw new Exception("Error updating positions!");
    }

    public static function createNew($uid,$text){

        $text = self::esc($text);
        if(!$text) throw new Exception("Wrong input data!");

        $posResult = mysql_query("SELECT MAX(`position`)+1 FROM `todo`");// WHERE `user_id` = 1");

        if(mysql_num_rows($posResult))
            list($position) = mysql_fetch_array($posResult);

        if(!$position) $position = 1;

        mysql_query("INSERT INTO `todo` SET /*`user_id` = {$uid},*/ `text` = '".$text."', `position` = ".$position);

        if(mysql_affected_rows($GLOBALS['link'])!=1)
            throw new Exception("Error inserting TODO!");

        echo (new ToDo(array(
            'id'    => mysql_insert_id($GLOBALS['link']),
            'text'  => $text
        )));

        exit;
    }

    public static function esc($str){

        if(ini_get('magic_quotes_gpc'))
            $str = stripslashes($str);

        return mysql_real_escape_string(strip_tags($str));
    }   
} 
?>

todo.ajax.php

<?php

require "../../dbc.php";
require "../../resources/classes/todo.class.php";

$id = (int)$_GET['id'];

try{

    switch($_GET['action'])
    {
        case 'delete':
            ToDo::delete($id);
            break;

        case 'rearrange':
            ToDo::rearrange($_GET['positions']);
            break;

        case 'edit':
            ToDo::edit($id,$_GET['text']);
            break;

        case 'new':
            ToDo::createNew($_GET['text']);
            break;
    }

}
catch(Exception $e){
    echo $e->getMessage();
    die("0");
}

echo "1";
?>

3 个答案:

答案 0 :(得分:2)

为什么在客户端需要会话ID? jQuery正在向服务器上的PHP脚本发送GET请求。对于您的PHP脚本,它看起来像任何其他请求。 $ _SESSION数组将就位,所有与会话相关的函数都可以正常工作。

信任客户提供会话ID是一个非常糟糕的主意。

答案 1 :(得分:0)

我没有完全遵循您的脚本,但据我所知,将当前会话ID可靠地放入JavaScript空间的唯一方法是

(... head section of the HTML document ...)

<script type="text/javascript">
php_session_id = "<?php echo session_id(); ?>"

alert("The PHP session ID is "+php_session_id);
</script>

答案 2 :(得分:0)

@ s2xi我意识到你正在寻找一个简单问题的答案,“如何将PHP会话ID添加到我的javascript中?”而Unicron的回答是一种万无一失的做法。

我认为我们只是想弄清楚为什么需要将PHP会话ID放在GET请求中。您的PHP脚本将始终知道用户的会话ID,您只需要调用session_id()。没有必要将它放在您的GET请求中。 (现在让我们忽略饼干禁用的边缘情况,我认为很明显我们有更大的鱼来煎炸)

我担心的其他事情:

  1. 将数据库中的数据绑定到会话ID并没有多大意义。一旦该用户的会话到期,您将永远无法将这些数据与他们联系起来。我在这里遗漏了什么吗?

  2. 您正在使用GET请求来执行操作和修改数据。这是一个非常糟糕的主意。