Supponendo di avere già una tabella per gli utenti ed una per le foto, entrambe con un campo id numerico, bisogna creare una tabella che rappresenti la relazione di like tra utenti e foto (relazione con attributi, molti a molti):
Codice:
CREATE TABLE IF NOT EXISTS `like` (
`user_id` INT(11) NOT NULL,
`photo_id` INT(11) NOT NULL,
`timestamp` TIMESTAMP DEFAULT NOW(),
PRIMARY KEY(`user_id`, `photo_id`)
);
A fare i fini andrebbe anche indicato che user_id e photo_id sono chiavi esterne che referenziano le tabelle degli utenti e delle foto.
Dopodiché serve la parte PHP per interfacciarsi con la base di dati. Le funzioni da prevedere sono (almeno):
- aggiunta di un like ad una foto da parte di un utente
- rimozione di un like da una foto da parte di un utente (dislike)
- recuperare la lista di utenti che ha espresso like per una foto
- recuperare la lista di foto per cui un utente ha espresso un like
- un predicato che indica se ad un utente piace una foto
Che si traduce:
Codice PHP:
// Si suppone di avere le opportune funzioni di connessione alla base di dati, ecc.
function database_connect() {
$link = mysqli_connect(...);
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
return $link;
}
function add_like($user_id, $photo_id) {
$link = database_connect();
$query = "INSERT INTO like (user_id, photo_id) VALUES ($user_id, $photo_id)";
$result = mysqli_query($link, $query);
if (!$result) {
die (mysqli_error($link) . " while executing query: " . $query);
}
}
function remove_like($user_id, $photo_id) {
$link = database_connect();
$query = "DELETE FROM like WHERE user_id = $user_id AND photo_id = $photo_id";
$result = mysqli_query($link, $query);
if (!$result) {
die (mysqli_error($link) . " while executing query: " . $query);
}
}
function photo_get_like_information($photo_id) {
$link = database_connect();
// Recupera le informazioni dalla base di dati
$query = "SELECT user_id, timestamp FROM like WHERE photo_id = $photo_id";
$result = mysqli_query($link, $query);
if (!$result) {
die (mysqli_error($link) . " while executing query: " . $query);
}
// Inserisce le informazioni in un vettore
$data = array();
while ($row = mysqli_fetch_assoc($result)) {
$data[] = $row;
}
return $data;
}
function user_get_like_information($user_id) {
$link = database_connect();
// Recupera le informazioni dalla base di dati
$query = "SELECT photo_id, timestamp FROM like WHERE user_id = $user_id";
$result = mysqli_query($link, $query);
if (!$result) {
die (mysqli_error($link) . " while executing query: " . $query);
}
// Inserisce le informazioni in un vettore
$data = array();
while ($row = mysqli_fetch_assoc($result)) {
$data[] = $row;
}
mysqli_free_result($result);
return $data;
}
function user_likes_photo($user_id, $photo_id) {
$link = database_connect();
$query = "SELECT * FROM like WHERE user_id = $user_id AND photo_id = $photo_id";
$result = mysqli_query($link, $query);
if (!$result) {
die (mysqli_error($link) . " while executing query: " . $query);
}
return mysqli_num_rows($result) != 0;
}
Potrebbero esserci errori di sintassi, e in ogni caso sarebbe bene usare i prepared statement.
Ti serve quindi la logica di un controller:
Codice PHP:
if (isset($_POST['action'])) {
$user_id = ... // letto probabilmente dalla sessione
$photo_id = $_POST['photo_id'];
$action = $_POST['action'];
if ($action == 'like') {
add_like($user_id, $photo_id);
}
elseif ($action == 'dislike') {
remove_like($user_id, $photo_id);
}
}
ed infine la vista con i moduli del caso:
Codice PHP:
<?php
$user_id = ... // Letto probabilmente dalla sessione
$photo_id = ... // Letto probabilmente da un parametro GET, rappresenta l'id della foto che si sta visualizzando
$users_who_liked = photo_get_like_information($photo_id);
?>
<div class="home-foto-wrapper">
<img src="http://forum.it.altervista.org/php-mysql-e-apache-htaccess/path..." alt="...">
<?php if (user_likes_photo($user_id, $photo_id): ?>
<!-- Pulsante "non mi piace" -->
<form method="POST">
<button type="submit" class="btn-nonmipiace">Non mi piace</button>
<input type="hidden" name="action" value="dislike">
<input type="hidden" name="photo_id" value="<?php echo $photo_id; ?>">
</form>
<?php else: ?>
<!-- Pulsante "mi piace" -->
<form method="POST">
<button type="submit" class="btn-mipiace">Mi piace</button>
<input type="hidden" name="action" value="like">
<input type="hidden" name="photo_id" value="<?php echo $photo_id; ?>">
</form>
<?php endif; ?>
<!-- Informazioni sulla foto -->
<span>La foto piace a <?php echo count($users_who_liked); ?> utenti</span>
</div>
Anche qui occhio a possibili errori di sintassi.
Questo è più o meno il succo, i dettagli dipendono poi da cosa ti servirà.