我正在尝试使用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秒。
答案 0 :(得分:4)
$connection
是一个特殊的php“类型”,称为资源。这些是由mysql_connect
,fopen
和imap_open
等函数创建的,并代表底层C库中的某种状态。这些资源仅在页面执行期间有效。 PHP完成页面执行后,资源就会被释放。这是问题的第一部分。
第二部分是当您打印资源时,它将转换为字符串。此字符串表示已丢失资源的基础状态,无法转换回资源。因此,没有办法做你想做的事。
您需要做的是在search.php中重新建立与imap服务器的连接,并从ajax调用中删除连接参数。
答案 1 :(得分:1)
这是因为您不应将&connection=<?php echo $connection ;?>
包含在您的网址中,因为它是一种资源,当您尝试将其回显到javascript中时,它会转换为字符串:Resource id #57
。您无法使用JavaScript传递PHP资源。
答案 2 :(得分:1)
这里有两个主要问题:
__toString()
方法。这通常会打印出对象的非常通用的描述,如您在此处所见。转换对象以传递到其他地方的正确方法是使用serialize()
函数。 See the docs for it。作为额外奖励:
您没有逃避dataString
中的任何值,如果其中包含?
或&
,则很容易导致值被误解。您应该对正在形成的每个值运行escape
,或者执行以下操作:
var data = {
username: '<?php echo $username ?>',
password: '<?php echo $password ?>'
};
$.ajax({
type: "POST",
url: "search.php",
data: data,
...
});
jQuery将为您获取对象并形成数据字符串,并进行正确的转义。更容易阅读,更容易拼凑,更容易犯错误。