2010-07-05 79 views
0

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

最终的get()或许会需要这个样子?行动=新& USER_ID = 1(或什么都编号用户)&文本=用户文本类型...

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

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"; 
?> 
+0

注意:您的mySQL查询容易受到SQL注入攻击。你需要使用'mysql_real_escape_string()' – 2010-07-05 15:35:08

+0

是的,我已经在我的课上报道过了。我只是推出了一个片段记住;) – Eli 2010-07-05 21:11:25

+0

嗯....如果你这么说?我所看到的是'$ _GET'值直接传递到了没有任何过滤的'mysql_query()'中。但是,这是你的代码:) – 2010-07-06 09:11:05

回答

2

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

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

+0

不一定:如果PHP由于cookies关闭而回退到通过GET参数添加会话ID,可能是因为jQuery URL不会自动重写。在这种情况下,手动添加会话ID是唯一的选择。 – Unicron 2010-07-05 16:29:09

+0

我想这是边缘情况下的一个例子,你可能想要将会话ID传递给你的js文件,但它看起来并不像s2xi所问的那样。 这将是一个严重的阻力,不得不在ajaxy web应用程序中支持无Cookie会话! – joeynelson 2010-07-05 18:36:47

+0

脚本从index.php中接受一个动作,并用javascript将它传递给我的ajax.php,它有我的包括todo.class.php。因此,添加/编辑/删除操作通过$ _GET进行,所以它看起来像?action = new&text =我的测试文本和位置= 2我想要的是JS捕获会话ID并在$ GET中将它携带到我的ajax.php将信息传递给我的class.php ...这有道理吗? – Eli 2010-07-05 20:36:15

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> 
+0

以及文件是分开的,如果我把它们都放在一起,那么我不会对此感到疑惑,因为我可以使用php来回显我在js中需要的东西。 – Eli 2010-07-05 20:34:02

+0

@ s2xi是的,但是如果你在包含脚本之前执行上述操作,'php_session_id' javascript变量将可用。 – Unicron 2010-07-05 21:59:48

+0

哈,我做了php_session_id = 和我能够在我的脚本中使用该js变量...不,我只是不知道为什么它不会保存到我的数据库,我得到一个错误;( – Eli 2010-07-06 00:22:10

0

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

我想我们只是想弄清楚为什么你需要把PHP会话ID放在你的GET请求中。您的PHP脚本将始终知道用户的会话ID,您只需致电session_id()即可。没有必要把它放在你的GET请求中。 (让我们忽略饼干残疾边缘的情况下,现在,我认为这是明确的,我们有更大的鱼鱼苗)

其他的事情我很担心:在数据库中的会话

  1. 搭售数据身份证并没有很多意义。一旦该用户的会话过期,您将永远无法将该数据绑定到他们。我在这里错过了什么吗?

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

+0

他没有在寻找会话ID,他正在寻找一个最有可能来自登录的会话变量(一个自定义user_id)。但事实仍然存在(正如你所提到的),会话被维护,所以从AJAX调用的PHP页面知道user_id .. – 2010-07-05 22:46:45

+0

啊,足够公平,我抨击了SQL语句中的$ _SESSION ['user_id']'。 虽然这并不能让我更加困惑。如果您已经使用'$ _SESSION ['user_id']'那么问题是什么? – joeynelson 2010-07-05 23:15:36

+0

嗯,以及我正在使用InnoDB与外键到位。我的问题是,我试图找到一种方法1)通过ajax从php页面传递user_id到class.php或2)....不知道;(我试图想为什么我可以在我的class.php中简单地添加WHERE子句并使用我的会话变量并完全绕过js ...? – Eli 2010-07-05 23:35:31