@0kan87, evet gözümden kaçmış düzenledim şimdi :) string yerine 1, 2 tipide gönderilebilir nasıl daha kolayınıza geliyorsa
Öncelikle beğen-beğenmeme olayını üye olmayanlara yani herkese açık yaparsan saydırman imkansız. IP adresine göre eklesen VPN ile IP değiştirmek çok kolay, cookie tutsan cookiler silinir, session belirlesen browser kapanınca ya da session gc çalışınca sessionlar uçar ve binlerce beğeni eklenebilir.
Bu yüzden sadece üyelerin bu işlemi yaptığından emin olman lazım. Veritabanında votes diye bir tablon olduğunu varsayalım.
| kolon | tur |
|---|---|
| vote_id | int(11) |
| vote_post_id | int(11) |
| vote_user_id | int(11) |
| vote_type | varchar(255) |
Ve bir post'u beğenip beğenmemeye yapacağını farz edelim. 2 butonun olacak bu aksiyon üzerine.
<button onClick="like(1, this)">Beğen <span>0</span></button>
<button onClick="dislike(1, this)">Beğen <span>0</span></button>
Burada 1 senin post id'n. artık onu php ile dinamik yazdırırsın :)
İlk olarak ilgili fonksiyonları bir oluşturalım javascrip tarafında.
function vote(postId, type, callback){
let data = {
type: type,
postId: postId
};
$.post('api.php', data, callback, 'json');
}
function like(postId, elem){
vote(postId, 'like', function(response){
if (response.error){
alert(response.error)
} else {
let span = $('span', elem)
let likes = parseInt(span.text())
span.text(likes + 1)
}
});
}
function dislike(postId, elem){
vote(postId, 'like', function(response){
if (response.error){
alert(response.error)
} else {
let span = $('span', elem)
let dislikes = parseInt(span.text())
span.text(dislikes - 1)
}
});
}
şimdi de api.php örneğinin nasıl olacağına bakalım
<?php
$type = $_POST['type'];
$response = [];
// üye girişi yapmamışsa süreci bitir
if (!isset($_SESSION['user_id'])){
die('Request denied.');
}
switch($type){
case 'like':
$post_id = $_POST['postId'];
$user_id = $_SESSION['user_id'];
$data = [
'post_id' => $post_id,
'user_id' => $user_id,
'type' => 'like'
];
// daha önce aynı kullanıcı postu beğenmiş mi kontrol et
$query = $db->prepend('SELECT * FROM votes WHERE vote_post_id = :post_id && vote_user_id = :user_id && vote_type = :type');
$query->execute($data);
$row = $query->fetch(PDO::FETCH_ASSOC);
if ($row){
$response['error'] = 'Zaten bu konuyu beğendin.';
} else {
$query = $db->prepend('INSERT INTO votes SET vote_post_id = :post_id, vote_user_id = :user_id, vote_type = :type');
$insert = $query->execute([
'post_id' => $_POST['postId'],
'user_id' => $_SESSION['user_id'], // sessindan gelmeli
'type' => 'like'
]);
if ($insert) {
$response['success'] = 'İçeriği beğendiniz.';
} else {
$response['error'] = 'Bir sorun oluştu.'
}
}
break;
case 'dislike':
$post_id = $_POST['postId'];
$user_id = $_SESSION['user_id'];
$data = [
'post_id' => $post_id,
'user_id' => $user_id,
'type' => 'dislike'
];
// daha önce aynı kullanıcı postu beğenmiş mi kontrol et
$query = $db->prepend('SELECT * FROM votes WHERE vote_post_id = :post_id && vote_user_id = :user_id && vote_type = :type');
$query->execute($data);
$row = $query->fetch(PDO::FETCH_ASSOC);
if ($row){
$response['error'] = 'Zaten bu konuyu beğendin.';
} else {
$query = $db->prepend('INSERT INTO votes SET vote_post_id = :post_id, vote_user_id = :user_id, vote_type = :type');
$insert = $query->execute([
'post_id' => $_POST['postId'],
'user_id' => $_SESSION['user_id'], // sessindan gelmeli
'type' => 'like'
]);
if ($insert) {
$response['success'] = 'İçeriği beğendiniz.';
} else {
$response['error'] = 'Bir sorun oluştu.'
}
}
break;
}
echo json_encode($response);
ek olarak tabi posts tablonda likes ve dislikes kolonları açıp sayıları orada tutabilirsin, her like ve disliketa ilgili konunun kolonlarını güncelleyebilirsin api.php de ki ilgili alanlarda. en basit olarak böyle bir yapı kurulabilir, tabi yapıyı kendine göre düzenlemen gerekir.
twig php için yazılmış bir template engine, yani sen ilgili twig dosyalarını php kullanarak localde okuyabilsen bile gönderdiği dataları vs. neler olduğunu bilmediğin için bu işlemi yapman zor.
bu tarz hazır e-ticaret sistemlerinin de problemi bu işte :) bilerek böyle sistemler yapıyorlar ki bunun için de ek ücret alsınlar, her şeyi kendileri yapıp ücretlendirmek istiyorlar.
Allow: / kısmını kaldırın gerek yok
CodeMirror --> https://codemirror.net/
Ace Editor --> https://ace.c9.io/
internette arayacağın anahtar kelimeler Tesseract OCR olmalı :)
Örnek bir javascript: https://tesseract.projectnaptha.com/
geriye $this return edip chain işlemini yapman gerekiyor. şöyle dener misin.
<?php
class HasDB extends PDO
{
public $sql = '';
public function __construct()
{
try {
parent::__construct("mysql:host=" . HOST . ";dbname=" . DBNAME, UNAME, PASSWD);
$this->query('SET CHARACTER SET ' . CHARSET);
$this->query('SET NAMES ' . CHARSET);
$this->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$this->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
} catch (PDOException $error) {
$error->getMessage();
}
}
public function query($query){
$this->sql = $query;
return $this;
}
public function result(){
return $this->query($this->sql)->fetch(PDO::FETCH_ASSOC)
}
}
ne yazık ki böyle bir durum söz konusu değil :) senin olmayan bir şeyi senin gibi gösteremezsin.
ha ben kendimi kandırmak istiyorum dersen host dosyasını düzenlersin, o zaman istersen google.com yazıp kendi sitene girersin hiç problem değil ama bir başkasına bunu yaptıramazsın :)
sidebar kodlarını şöyle yapabilirsin
<ul>
<li>
<a href="dashboard?sayfa=musteriyegitraporlar<?=isset($_GET['id'] ? '&id=' . $_GET['id'] : null)?>">Raporlar</a>
</li>
<li>
<a href="dashboard?sayfa=musteriyegitevraklar<?=isset($_GET['id'] ? '&id=' . $_GET['id'] : null)?>">Evraklar</a>
</li>
<li>
<a href="dashboard?sayfa=musteriyegitdosyalar<?=isset($_GET['id'] ? '&id=' . $_GET['id'] : null)?>">Dosyalar</a>
</li>
</ul>
böylece id diye bir get parametresi varsa linklerin sonuna ekleyecek, yoksa eklemeyecek.
çünkü her ajax isteğinde $dizi değişkenini tekrar oluşturuyor doğal olarak son değeri döndürüyor. Tek bir ajax request ile tüm fiyat ve adetleri gönderip ona göre hesap yaptırman gerekiyor.