为了账号安全,请及时绑定邮箱和手机立即绑定

计数按钮将带有纯 javascript Ajax 的当前页面 URL 传递给 php 变量

计数按钮将带有纯 javascript Ajax 的当前页面 URL 传递给 php 变量

PHP
泛舟湖上清波郎朗 2022-07-02 16:52:40
我尝试使用纯 javascript Ajax将当前页面 URL ( window.location.href)传递给php 变量。我究竟做错了什么? $_REQUEST['url']计数器.js:'use strict';let clicks = document.querySelectorAll('.Counter-trigger'); // IE8let voted = localStorage.getItem('voted');let message = document.getElementById('Counter-message');let count = document.getElementById('Counter-count');let i;let url;let post;let xhr;for (let i = 0; i < clicks.length; i++) {  clicks[i].onclick = function () {    if (voted == 'voted') {      message.innerHTML = "Sorry, ...!!";    } else {      let url = window.location.href;      let post = url; // post string      let xhr = new XMLHttpRequest();      xhr.open('POST', './lib/Counter/CounterReq.php', true);      xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');      xhr.onreadystatechange = function () {        if (xhr.readyState != 4 || xhr.status != 200) return;        console.log(xhr.responseText);        message.innerHTML = "Thanks!!";        count.innerHTML = +count.textContent+1;      };      xhr.send(post);      localStorage.setItem('rate', 'voted');      voted = 'voted';    }  }}CounterReq.php$url = $_REQUEST['url']; // posted from page$origin = $_SERVER['DOCUMENT_ROOT'].parse_url($url,PHP_URL_PATH);$file = '_Counter.txt'; // counts is saved in this document$file_path = $origin.'_Counter.txt'; // counts is saved here$count = file_get_contents($file_path);if ($count == null){$count = 0; echo $count;}$count++; // increment count by 1$handle = fopen($file_path, "w+");flock($handle,LOCK_EX); // LOCK_EX (2) exclusive locking for write accessfwrite($handle, $count);flock($handle,LOCK_UN); // LOCK_EX (3) Releases a lockfclose($handle); // close file
查看完整描述

2 回答

?
哔哔one

TA贡献1854条经验 获得超8个赞

注意:未定义的索引:第 5 行 /var/www/dist/lib/Counter/CounterReq.php 中的 url


该通知意味着您正在寻找不存在的关联数组中的索引。

让我们解决这个问题。


将要发送的数据存储在FormData对象中。


let url = window.location.href;

const data = new FormData()

data.set('url', url);

将您的“内容类型”修改为'multipart/form-data'或将其全部删除。实例将FormData自动设置正确的标头。


xhr.setRequestHeader('Content-Type', 'multipart/form-data');

在方法中将数据发送到服务器.send。


xhr.send(data);

使用$_POST全局数组而不是$_GET,您正在通过该POST方法发送数据,因此它将在前者中。


您发送到服务器的数据现在已作为关联数组进行处理。检查密钥是否url存在,如果存在则存储。


$url = isset( $_POST['url'] ) ? $_POST['url'] : '';


查看完整回答
反对 回复 2022-07-02
?
呼唤远方

TA贡献1856条经验 获得超11个赞

您需要对要发送的变量进行urlencode并命名;将帖子更改为

let post = 'url=' + encodeURIComponent(url);

它应该可以正常工作。

编辑:我没有注意到您使用的是_GET数组而不是_POST. 正如另一个答案所说,也要进行更改。

但是,没有必要使用 JSON;application/x-www-form-urlencoded工作也很好。


查看完整回答
反对 回复 2022-07-02
  • 2 回答
  • 0 关注
  • 177 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号