【发布时间】:2012-02-07 23:04:03
【问题描述】:
我有以下脚本。在远程 php 脚本中,一条记录被添加到数据库表中。 当我在这个脚本中留下最后一行(打印 $html;)时,添加了 2 条记录!
当我省略该行时,只会添加一条记录。但是显然我没有任何输出。
如果我将输出写入文件,则只会添加一条记录。输出是一个 html 页面。
<?php
$ch = curl_init();
// set URL and other appropriate options
curl_setopt($ch, CURLOPT_URL, 'http://somedomain.nl/some.php?PARAMS=blabla');
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
// cookie settings
curl_setopt($ch, CURLOPT_COOKIEJAR, 'some.txt');
curl_setopt($ch, CURLOPT_COOKIEFILE, 'some.txt');
// set data to be posted
curl_setopt($ch, CURLOPT_POSTFIELDS, $_POST);
// perform the request
$html = curl_exec($ch);
// close the connection
curl_close($ch);
print $html;
?>
有什么建议吗?
克。韩
/** 更新
<select class="p_ssyskey_mke" name=P_SSYSKEY_MKE onchange="MerkSubmitP()">
<option value="">selecteer een merk</option>
<option value="A0001E2Q">Subaru</option>
<option selected value="A0001E2S">Toyota</option>
<option value="A0001E2T">Volkswagen</option>
</select>
这是一个$html的sn-p,整个页面比较大。 打印 html 的子字符串表明脚本将在 '
@Poonam:当我在 ob_clean_end() 之后再次打印 $html 时,会添加第二条记录。
现在我已经实现了一个非常粗略的解决方法。由于记录有时间戳,如果最后一条记录不是至少 1 秒,我会阻止添加第二条记录。我讨厌它,但现在它有效。
克。韩
/** 更新
这个问题不是来自 cURL,用 file_get_contents 尝试同样的事情会做同样的事情。
也许原因在于我正在使用的 mod_rewrite。
克。韩
/** 更新
很可能是 mod_rewrite。当使用直接 URL 而不是通过重写规则时,它的行为符合预期。
这些是我正在使用的重写规则:
RewriteEngine On
RewriteRule ^zoek/(.*)$ parts.php?PARAMS=$1 [L]
Parts.php 是上面贴的脚本。
克。韩
【问题讨论】:
-
你能显示
$html变量的内容吗? -
完全不知道,但是每当您将 curl_exec($ch) 存储在其打印数据的变量中,然后在第二次编写 print 时,为避免这种情况,您可以执行 ob_start(); curl_exec($ch); $html = ob_get_contents(); ob_end_clean();
-
@Poonam,把它写下来作为答案,因为我认为这将是他的解决方案。似乎 $html 正在获取对该函数的引用并重新运行它,但文档建议没有这种可能的行为。
-
@Poonam 当前代码中没有理由两次调用远程 URL,这可能是为什么将两条记录插入数据库的原因。添加输出缓冲不会解决问题,只会增加内存使用量。我怀疑上面的脚本被调用了两次,我怀疑我知道为什么,这就是我要求查看 HTML 的原因。
-
@HanTimmers 我真的可以看整个页面,如果你不把它放在这里,你可以把它贴在pastebin。除其他外,我要寻找的是带有空
src=的<script>标签、带有空src=的<image>标签和带有空href=的<link>标签。