Всем привет! Не получается Применить аякс функцию.
<?php
$DB = new Database();
$likes = "";
$likes = ($ROW['likes'] > 0) ? $ROW['likes'] : "" ;
?>
<a onclick="like_post(event)" href="<?=ROOT?>like/post/<?php echo $ROW['postid'] ?>"><img src="/icons/like.png" style="height:25px"><?php echo $likes ?></a> .
Вышеописанный код показывает количество лайков. А аякс мне нужно применить чтобы операция выполнялась без перезагрузки страницы. Посмотрев несколько туториалов я прописал следующие строчки кода
<script type="text/javascript">
function ajax_send(data,element){
var ajax = new XMLHttpRequest();
ajax.addEventListener('readystatechange', function(){
if(ajax.readyState == 4 && ajax.status == 200){
response(ajax.responseText,element);
}
});
data = JSON.stringify(data);
ajax.open("post","<?=ROOT?>ajax.php",true);
ajax.send(data);
}
function response(result,element){
if(result != ""){
var obj = JSON.parse(result);
if(typeof obj.action != 'undefined'){
if(obj.action == 'like_post'){
var likes = "";
if(typeof obj.likes != 'undefined'){
likes = (parseInt(obj.likes) > 0) ? "Like(" +obj.likes+ ")" : "Like" ;
element.innerHTML = likes;
}
if(typeof obj.info != 'undefined'){
var info_element = document.getElementById(obj.id);
info_element.innerHTML = obj.info;
}
}
}
}
}
function like_post(e){
e.preventDefault();
var link = e.target.href;
var data = {};
data.link = link;
data.action = "like_post";
ajax_send(data,e.target);
}
</script>
ajax.php
<?php
include("classes/autoload.php");
$data = file_get_contents("php://input");
if($data != ""){
$data = json_decode($data);
}
if(isset($data->action) && $data->action == "like_post")
{
include "ajax/like.ajax.php";
}
like.ajax.php
<?php
include("classes/autoload.php");
$URL = split_url_from_string($data->link);
$_GET['type'] = isset($URL[5]) ? $URL[5] : null;
$_GET['id'] = isset($URL[6]) ? $URL[6] : null;
$_SESSION['userid'] = isset($_SESSION['userid']) ? $_SESSION['userid'] : 0;
$login = new Login;
$user_data = $login->check_login($_SESSION['userid'],false);
//check if not logged in
if($_SESSION['userid'] == 0){
$obj = (object)[];
$obj->action = "like_post";
echo json_encode($obj);
die;
}
/*
$query_string = explode("?", $data->link);
$query_string = end($query_string);
$str = explode("&", $query_string);
foreach ($str as $value) {
# code...
$value = explode("=", $value);
$_GET[$value[0]] = $value[1];
}
*/
$_GET['id'] = addslashes($_GET['id']);
$_GET['type'] = addslashes($_GET['type']);
if(isset($_GET['type']) && isset($_GET['id'])){
$post = new Post();
if(is_numeric($_GET['id'])){
$allowed[] = 'post';
$allowed[] = 'user';
$allowed[] = 'comment';
if(in_array($_GET['type'], $allowed)){
$post = new Post();
$user_class = new User();
$post->like_post($_GET['id'],$_GET['type'],$_SESSION['userid']);
if($_GET['type'] == "user"){
$user_class->follow_user($_GET['id'],$_GET['type'],$_SESSION['userid']);
}
}
}
//read likes
$likes = $post->get_likes($_GET['id'],$_GET['type']);
//create info
/////////////////
$likes = array();
$info = "";
$i_liked = false;
if(isset($_SESSION['userid'])){
$DB = new Database();
$sql = "select likes from likes where type='$type' && contentid = '$id' limit 1";
$result = $DB->read($sql);
if(is_array($result)){
$likes = json_decode($result[0]['likes'],true);
$user_ids = array_column($likes, "userid");
if(in_array($_SESSION['userid'], $user_ids)){
$i_liked = true;
}
}
}
$like_count = count($likes);
if($like_count > 0){
$info .= "<a id='info_$_GET[postid]' href='likes.php?type=post&id=$_GET[postid]'>";
$info .= "<br/>";
if($like_count == 1){
if($i_liked){
$info .= "<div style='text-align:left;'>You liked this post </div>";
}else{
$info .= "<div style='text-align:left;'> 1 person liked this post </div>";
}
}else{
if($i_liked){
$text = "others";
if($like_count - 1 == 1){
$text = "other";
}
$info .= "<div style='text-align:left;'> You and " . ($like_count - 1) . " $text liked this post </div>";
}else{
$info .= "<div style='text-align:left;'>" . $like_count . " other liked this post </div>";
}
}
}
/////////////////////////
$obj = (object)[];
$obj->likes = count($likes);
$obj->action = "like_post";
$obj->info = $info;
$obj->id = "info_$_GET[id]";
echo json_encode($obj);
}
Ошибка заключается в том что при нажатии на эту ссылку аякс не получает данные поста как url и id.
<a onclick="like_post(event)" href="<?=ROOT?>like/post/<?php echo $ROW['postid'] ?>"><img src="/icons/like.png" style="height:25px"><?php echo $likes ?></a> .
По последовательности своего написания я могу сказать что я допустил ошибку либо здесь
$obj = (object)[];
$obj->likes = count($likes);
$obj->action = "like_post";
$obj->info = $info;
$obj->id = "info_$_GET[id]";
echo json_encode($obj);
Либо здесь
<script type="text/javascript">
function ajax_send(data,element){
var ajax = new XMLHttpRequest();
ajax.addEventListener('readystatechange', function(){
if(ajax.readyState == 4 && ajax.status == 200){
response(ajax.responseText,element);
}
});
data = JSON.stringify(data);
ajax.open("post","<?=ROOT?>ajax.php",true);
ajax.send(data);
}
function response(result,element){
if(result != ""){
var obj = JSON.parse(result);
if(typeof obj.action != 'undefined'){
if(obj.action == 'like_post'){
var likes = "";
if(typeof obj.likes != 'undefined'){
likes = (parseInt(obj.likes) > 0) ? "Like(" +obj.likes+ ")" : "Like" ;
element.innerHTML = likes;
}
if(typeof obj.info != 'undefined'){
var info_element = document.getElementById(obj.id);
info_element.innerHTML = obj.info;
}
}
}
}
}
function like_post(e){
e.preventDefault();
var link = e.target.href;
var data = {};
data.link = link;
data.action = "like_post";
ajax_send(data,e.target);
}
</script>
Сколько искал никак не смог найти в чём заключается ошибка. Сам браузер обрабатывает аякс функции.
"info_$_GET[id]"будет работать некорректно, замените на"info_" . $_GET['id']или на"info_{$_GET['id']}". – Simon Feb 20 '24 at 09:47