Jeśli nie chciałbyś tego napisać wyłącznie na PHP, to zostaje np. jeszcze Ajax lub inne techonologie, które spowodują, że strona nie będzie musiała się przeładowywać.
button:hover {
background: lightgreen;
}
<body style="background: darkgoldenrod;">
<form method="get" action="">
<button name="p_m" value="1">-20</button>
<button name="p_m" value="2">+20</button>
</form>
Z wykorzystaniem sesji.
<?php
session_start();
$points = 100;
$p_m = $_GET['p_m'] ?? 0;
if(!isset($_SESSION['points'])) {
$_SESSION['points'] = $points;
} else {
if($p_m == 1) {
$_SESSION['points'] -= 20;
} else if($p_m == 2) {
$_SESSION['points'] += 20;
}
}
if(isset($_SESSION['points'])) {
echo $_SESSION['points'];
}
?>
Z wykorzystaniem pliku.
<?php
$p_m = $_GET['p_m'] ?? 0;
$points = 0;
if($p_m == 1) {
$points = -20;
} else if($p_m == 2) {
$points = +20;
}
if(file_exists("scores.txt")) {
file_put_contents("scores.txt", file_get_contents("scores.txt") + $points);
} else {
$points = 0;
file_put_contents("scores.txt", $points);
}
if(file_exists("scores.txt")) {
echo file_get_contents("scores.txt");
}
?>
Z wykorzystaniem ciasteczek.
<?php
$p_m = $_GET['p_m'] ?? 0;
$points = 0;
if($p_m == 1) {
$points = -20;
} else if ($p_m == 2) {
$points = +20;
}
if(!isset($_COOKIE['scores'])) {
setcookie("scores", 0);
} else {
setcookie("scores", $_COOKIE['scores'] + $points);
}
if(isset($_COOKIE['scores'])) {
echo $_COOKIE['scores'];
}
if($_SERVER['QUERY_STRING']=='p_m=1') {
header('Location: http://127.0.0.1:8000/get1.php/?accepted_p_m=1');
} else if($_SERVER['QUERY_STRING']=='p_m=2') {
header('Location: http://127.0.0.1:8000/get1.php/?accepted_p_m=2');
}
?>
Nie wiem, czy da się to inaczej napisać bez przeładowywania strony, chodzi o te header(...). Jeśli nie byłoby header w kodzie, to po naciśnięciu kilka razy pod rząd tylko +20 wszystko byłoby OK, ale gdy nagle zmienilibyśmy na -20, to wtedy ukazałaby się nie aktualna wartość. Możliwe, że da się to lepiej napisać niż przekierowując stronę.
Z wykorzystaniem bazy danych.
<?php
$p_m = $_GET['p_m'] ?? 0;
$points = 0;
if($p_m == 1) {
$points = -20;
} else if($p_m == 2) {
$points = +20;
}
$mysql = new mysqli('localhost', 'root', 'mystrongpass', 'sc');
$query = 'SELECT points FROM scores where id = 1;';
if($mysql->query($query)->num_rows != 1) {
$mysql->query('INSERT INTO scores VALUES (null, 0)');
} else {
$mysql->query('UPDATE scores SET points = points + ' . $points);
}
echo $mysql->query($query)->fetch_row()[0];
?>
Jeśli chciałbyś skorzystać z tej opcji, to możesz kod przepisać na PDO.
</body>
Jak już powyżej wspomniałem. Do dynamicznego generowania/modyfikowania wartości z HTML potrzebowałbyś innych technologii jak np. JavaScript, czy czegoś co pozwoli na zaaktualizowanie kontentu bez przeładowania strony. Jednak, z tego, co opisałeś niemożliwe jest odwołanie się do elementu poprzez backend w stylu document.getElementById('my_id').... Do tego musisz skomunikować się z frontendem innej opcji nie ma. Gdyby taka opcja była, to wtedy język nie byłby backendem, a frontendem. Ewentualnie byłby językiem all-in-one - wszystko w jednym, czyli przemieszany frontend z backendem. Nie będę nadmieniał o parsowaniu elementów DOM np. z pliku, ponieważ to jest zupełnie coś innego niż taka dynamiczna modyfikacja.