Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/254.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用AJAX重新加载验证码_Php_Javascript_Ajax_Captcha_Reload - Fatal编程技术网

Php 使用AJAX重新加载验证码

Php 使用AJAX重新加载验证码,php,javascript,ajax,captcha,reload,Php,Javascript,Ajax,Captcha,Reload,这个问题可能已经被问过了,但不幸的是,我找不到任何令人满意的答案。我会问它我的具体情况,并要求管理员不要删除至少几天的问题,所以我可以尝试它 我有一页。它使用验证码。像这样: <?php session_start(); // the captcha saves the md5 into the session ?> <img src="captcha.php" onclick="this.src = this.src" /> 每次触发onclick事件时,都会随机生成

这个问题可能已经被问过了,但不幸的是,我找不到任何令人满意的答案。我会问它我的具体情况,并要求管理员不要删除至少几天的问题,所以我可以尝试它

我有一页。它使用验证码。像这样:

<?php
session_start(); // the captcha saves the md5 into the session
?>
<img src="captcha.php" onclick="this.src = this.src" />
每次触发
onclick
事件时,都会随机生成JavaScript变量
var ranNum
。它工作得很好,但是,我不喜欢这种可能性,如果两个数字连续两次是相同的,尽管这种可能性不大。虽然随机数在-50000和50000之间变化,但我仍然不喜欢它。我认为这种方法是不对的。我想知道通过AJAX实现的“更正确”的方法。我知道这是可能的。我希望你知道怎么可能那样的话,请告诉我

提前谢谢

顺便说一下,如果我拼写cap(t)cha的方式不同,没关系,对PHP文件的引用就在我的代码中:我使用randomImage.PHP

编辑:JavaScript中的随机数仅在图像重新加载时生成。php不关心$\u GET参数。字符串实际上是随机的


编辑:因此,我想知道的是,如何使浏览器在每次触发事件时重新标记图像,而不传递不同的get参数。

您是否考虑过使用时间戳

onclick="this.src='captcha.php?ts='+Math.round(new Date().getTime()/1000)"
只需使用:


您可以放弃时间参数并在PHP中生成随机数。:)

不幸的是,AJAX没有提供一种动态加载图像的好方法。即使使用javascript“预加载”技巧,浏览器也只能在每个URL上加载每个图像一次。让浏览器从同一来源加载另一个图像的唯一好方法是使用不同的参数,就像您现在所做的那样。而且,正如其他答案所述,时间戳应该足够了。

您还可以从Ajax请求base64编码中获取图像,并将其放入img标记中

当然,我认为这太过分了,base64编码的文件大约是原始文件大小的4/3。(在base64上,3KB的图像大约为4kb)

编辑: 将imgsrc属性设置为


数据:图像/png;base64,base64encodedimage

听起来很有趣。不存在重复编号的风险。尽管如此,我还是想知道AJAX是如何实现的。^^它是异步的,并且使用了JS,因此它是AJAX。@Nico:没有XML,也没有使用XMLHttpRequest,因此从技术上讲它不是AJAX。当浏览器检测到新的图像源时,它正在为您加载图像。您可以调用服务器发送新的图像源,这将是服务器生成的时间戳,例如
onclick=“captcha.php?ts=“
”。然而,我不认为这样做有什么真正的好处,这似乎是做同样事情的另一种方式。那是行不通的
time()
将在之前生成一次,但之后将是相同的,因此,源代码不会更改,图像也不会重新加载。谢谢。很抱歉,问题不清楚,我不考虑get参数。它仅用于强制浏览器重新标记图片;)不过,我还是想知道如何在不传递随机get参数的情况下强制浏览器重新对图片进行排序。@arik据我所知,没有办法做到这一点。如果浏览器看到图像的src相同,则不会重新加载图像。我最近研究了一个类似的问题,这几乎是我找到的唯一解决办法。当然,如果有人知道另一个选择,我会很高兴知道!好吧,我会等着,让问题留待讨论。也许有人会找到答案。嗯。。。那太不幸了。谢谢。看起来它不在语言(PHP)的范围内,也在web服务器的范围内。我还没有尝试过,但我认为如果您使用的是apache,您可以使用[rewrite]()之类的模块将任何请求映射到php中,例如,/captcha*,这样就不需要使用get参数。如果您还管理Web服务器,那么它就是apache。其他服务器可能有其他方式。是的,我想没有什么比读书更重要;)
onclick="this.src='captcha.php?ts='+Math.round(new Date().getTime()/1000)"