从Jquery传递资源对象到PHP?

时间:2011-03-25 13:01:45

标签: php jquery

我正在尝试使用Jquery传递imap_conection(PHP Imap库)。邮政似乎不起作用 - 还有什么我应该尝试的吗?

PHP

$connection = imap_open($mailServer,$login,$password);

的jQuery

    var dataString='email=<?php echo $email_address; ?>&connection=<?php echo $connection; ?>&password=<?php echo $password; ?>&server=<?php echo $server;?>&daysago='+daysago+'&num='+num;
    $.ajax({
       type: "POST",
    url: "search.php",
    data: dataString,

现在,Firebug告诉我$ _POST ['connection']变量是Resource id #57

已编辑添加

主要问题

我使用PHP Imap Library连接到imap电子邮件地址。当我尝试使用ajax多次重新连接(进行多次关键字搜索)时,我倾向于失去与某些电子邮件提供商(主要是Hotmail)的连接,所以我试图集中一个连接,这样我就不会丢失连接 - 这是为什么我想要1个连接资源并传递连接。还有其他可能的解决方案

我使用多个ajax调用/ imap连接的原因是我想尽快为用户提供数据。这种搜索通常需要大约8-10秒。

3 个答案:

答案 0 :(得分:4)

$connection是一个特殊的php“类型”,称为资源。这些是由mysql_connectfopenimap_open等函数创建的,并代表底层C库中的某种状态。这些资源在页面执行期间有效。 PHP完成页面执行后,资源就会被释放。这是问题的第一部分。

第二部分是当您打印资源时,它将转换为字符串。此字符串表示已丢失资源的基础状态,无法转换回资源。因此,没有办法做你想做的事。

您需要做的是在search.php中重新建立与imap服务器的连接,并从ajax调用中删除连接参数。

答案 1 :(得分:1)

这是因为您不应将&connection=<?php echo $connection ;?>包含在您的网址中,因为它是一种资源,当您尝试将其回显到javascript中时,它会转换为字符串:Resource id #57。您无法使用JavaScript传递PHP资源。

答案 2 :(得分:1)

这里有两个主要问题:

  1. 当您尝试回显资源对象时,您正在调用其__toString()方法。这通常会打印出对象的非常通用的描述,如您在此处所见。转换对象以传递到其他地方的正确方法是使用serialize()函数。 See the docs for it
  2. 即使您尝试将其序列化,也会失败。资源对象非常依赖于状态,因此不能像这样传递。它可以在打开它的脚本中使用,就是它。有关详细信息,请参阅上述文档。
  3. 作为额外奖励:

    您没有逃避dataString中的任何值,如果其中包含?&,则很容易导致值被误解。您应该对正在形成的每个值运行escape,或者执行以下操作:

    var data = {
      username: '<?php echo $username ?>',
      password: '<?php echo $password ?>'
    };
    
    $.ajax({
      type: "POST",
      url: "search.php",
      data: data,
      ...
    });
    

    jQuery将为您获取对象并形成数据字符串,并进行正确的转义。更容易阅读,更容易拼凑,更容易犯错误。