Peršokti į turinį
  • ŽAIDIMAI
  • , ŽAIDIMAI
  • ŽAIDIMAI

PHP - mygtuko „patinka” sistema


NTQ

Ši tema yra neaktyvi. Paskutinis pranešimas šioje temoje buvo prieš 2260 dienas (-ų). Patariame sukurti naują temą, o ne rašyti naują pranešimą.

Už neaktyvių temų prikėlimą galite sulaukti įspėjimo ir pranešimo pašalinimo!

Recommended Posts

Aprašymas:

Papildinį galite panaudoti įvairiais tikslais, pavyzdžiui, sužinoti, ar parašyta kokia nors projekto informacija vartotojui buvo naudinga, taip pat galbūt panaudoti naujienų arba komentarų vertinimui ir kt. Veikimas yra ganėtinai paprastas. Reikia tik integruoti „like.php” failą kaip nuotrauką, su „HTML” žyme („<img>”) ir nurodyti tam tikrus atributus, kurios parašysiu vėliau.

Jeigu rasiu papildomo laiko, tai galėsiu išleisti versiją be „MySQL”.

Ypatybės:

  • Nereikia užregistruoti projekto ar failų pavadinimo(-ų), galėsite leisti ir kitiems puslapiams naudotis šia sistema;
  • yra keletą nustatymų, kurios galėsite lengvai pasikeisti (paveikslėlio fono permatomumas, rėmelių pašalinimas, autorizacijos kodo ilgis);
  • dideli skaičiai yra sutrumpinami, jog neiškraipytų lygiavimo paveikslėlyje.

 

Ekrano užfiksavimai:

1. Vaizdas, integravus įskiepio failą: nėra nustatytų „$_GET“ parametrų, todėl mygtukas yra atjungtas.

 Capture.png

2. Vaizdas, tinkamai integravus įskiepio failą:  visi parametrai yra nustatyti teisingai.

Capture.png

 

Kodas: skripte yra naudojamas „Roboto” šriftas ir 2 paveikslėliai. Juos atsisiųsti galite temos pabaigoje.

*Reikės sukurti duomenų bazės lentelę. „SQL“ kodas bus pateiktas žemiau.

<?php

# Duomenų bazės prisijungimo informacija.
define('DATABASE_SERVER', '127.0.0.1');
define('DATABASE_USER', 'root');
define('DATABASE_PASSWORD', '');
define('DATABASE_NAME', 'database');

# Prisijungimas prie duomenų bazės.
$mysqli_connect = new mysqli(DATABASE_SERVER, DATABASE_USER, DATABASE_PASSWORD, DATABASE_NAME);

# Prisijungimas nepavyko, atvaizduojame klaidą.
if ($mysqli_connect->connect_errno) {
	echo 'Script cannot connect to the MySQL server.';
	exit;
}

# Nustatome prisijungimo koduotę (pasirinkau numatytąją).
if (!$mysqli_connect->set_charset('latin1')) {
	echo 'Script failed to set MySQL charset.';
	exit;
}

# Įvairūs tikrinimai, siekiant gauti tikslų interneto protokolą adresą.
if (isset($_SERVER['HTTP_CLIENT_IP']) && !empty($_SERVER['HTTP_CLIENT_IP'])) {
	$ip = $_SERVER['HTTP_CLIENT_IP'];
} elseif (isset($_SERVER['HTTP_X_FORWARDED_FOR']) && !empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
	$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} else {
	$ip = (isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : '0.0.0.0');
}

# Patikriname, ar gautas protokolo adresas yra teisingas, priešingu atveju - atvaizduojame savo rezultatą („0.0.0.0“).
$ip = ((filter_var($ip, FILTER_VALIDATE_IP) === false) ? '0.0.0.0' : $ip);

# Žemiau ištraukiame, ar vartotojas buvo nukreiptas iš kito puslapio (jeigu ne, rezultatas bus „null“), naršykles informaciją.
$referer = (isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : 'null');

$referer = $mysqli_connect->real_escape_string($referer);
$browser = $mysqli_connect->real_escape_string($_SERVER['HTTP_USER_AGENT']);

$referer = htmlspecialchars($referer, ENT_QUOTES, 'UTF-8');
$referer = strip_tags($referer);
$referer = trim($referer);

$browser = htmlspecialchars($browser, ENT_QUOTES, 'UTF-8');
$browser = strip_tags($browser);

# Sukuriame kelis „$_GET“ kintamuosius, neutralius, kurios būtų galima visada panaudoti be papildomo filtravimo, juos apsaugome.
$id = ((isset($_GET['id'])) ? preg_replace('/[^a-zA-Z0-9_]+/', '', $_GET['id']) : null);
$id_2 = ((isset($_GET['id_2'])) ? preg_replace('/[^a-zA-Z0-9]+/', '', $_GET['id_2']) : null);

$id = htmlspecialchars($id, ENT_QUOTES, 'UTF-8');
$id = stripslashes($id);
$id = strip_tags($id);
$id = trim($id);

$id_2 = htmlspecialchars($id_2, ENT_QUOTES, 'UTF-8');
$id_2 = stripslashes($id_2);
$id_2 = strip_tags($id_2);
$id_2 = trim($id_2);

# Sukuriame funkciją, kurią panaudosime žemiau. Jos tikslas yra sutrumpinti skaičius, kad neiškraipytų paveikslėlio teksto.
function prefix_number_convert($string = false) {

if ($string === false) {
    $result = 'Function “prefix_number_convert” needs the value.';
} else {

if ($string < 1000) {
	$result = number_format($string, 1, '.', '');
} elseif ($string < 1000000) {
	$result = number_format($string / 1000, 1, '.', '').'k';
} elseif ($string < 1000000000) {
	$result = number_format($string / 1000000, 1, '.', '').' m.';
} elseif ($string < 1000000000000) {
	$result = number_format($string / 1000000000, 1, '.', '').' b.';
} else {
	$result = number_format($string / 1000000000000, 1, '.', '').' t.';
}

$result = str_replace('.'.str_repeat(0, 1), '', $result);

}

return $result;

}

# --- Nustatymai ---

# Jeigu pageidaujate nustatyti, jog paveikslėlio fonas būtų permatomas, tada pakeiskite reikšmę į vieną.
$image_transparent = 0;

# Paveikslėlio rėmelis (1 - įjungtas, 0 - išjungtas).
$image_border = 1;

# Autorizacijos kodo ilgis (rekomenduoju palikti numatytąjį) arba padidinti, tačiau nesumažinti.
$setting_1 = 15;

# Jei dėl kažkokios priežasties nepavyks vartotoją perkelti į praėjusį puslapį, tai sistemai galima nurodyti atsarginį internetinio puslapio adresą, kurio galėtų pasinaudoti (neprivaloma). Nustatykite su „http://” arba „https://”.
$setting_2 = '';

# ------------------

$background_image = 'images/';

switch ($image_transparent) {
	case 0:
		$background_image .= 'background.png';
		break;
	default:
		$background_image .= 'background2.png';
		break;
}

# Dėl našumo, rekomenduoju apibrėžti paveikslėlio dydį rankiniu būdu.
$width = 100;
$height = 47;

/*
# Gauname nurodyto paveikslėlio dydį.
list($width, $height) = getimagesize($background_image);

# Išvalome talpyklą (po paveikslėlio dydžio gavimo).
clearstatcache();
*/

# Nustatome rėmelių poziciją, jeigu nustatymas yra įjungtas.
if ($image_border) {
	$border_width = $width - 1;
	$border_height = $height - 1;
}

# Sukuriame nuotrauką iš „PNG” paveikslėlio.
$image = ImageCreateFromPng($background_image);

# Svarbu, siekiant išsaugoti paveikslėlio permatomumą (išskyrus „ImageAlphaBlending”).
ImageAlphaBlending($image, false);
ImageSaveAlpha($image, true);

# Paveikslėlio sušvelninimas.
ImageAntiAlias($image, true);

# Mėlyna spalva.
$color_1 = ImageColorAllocate($image, 7, 91, 186);
# Juoda spalva.
$color_2 = ImageColorAllocate($image, 0, 0, 0);

/*
Jeigu norite kitos spalvos, pridėkite „$color_3” kintamąjį ir nurodykite RGB kodą, tada pakeiskite kintamojo pavaidinimą žemiau esančiame kode.
ImageColorAllocateAlpha($image, 0, 0, 0, 77) - nurodys spalvą su permatomumu. Pakeiskite 77 skaičių (50%) į pageidaujamą permatomumą (maksimalus - 127, visiškai permatomas).
*/

# Uždedame rėmelį, jei nustatymas yra įjungtas.
if ($image_border) {
	ImageRectAngle($image, 0, 0, $border_width, $border_height, $color_1);
}

# Patikriname, ar pateiktas per nuorodą autorizacijos kodas yra teisingas, jeigu ne - nėra tikslo apkrauti duomenų bazės su užklausa.
if (!empty($id) && strlen($id) >= $setting_1) {

# Jeigu yra „id_2“ nurodytas (su „request” atributu), pridedame įrašą į duomenų bazę.
if (!empty($id_2) && $id_2 === 'request') {

# Patikriname, ar vartotojas jau yra pridėtas su šiuo autorizacijos kodus, jeigu taip - ignoruojame užklausą.
$mysqli_select = $mysqli_connect->query("SELECT COUNT(`id`) FROM `likes` WHERE `authorization_code` = '$id' && `ip` = '$ip';");

if ($mysqli_select !== false && $mysqli_select->fetch_row()[0] == 0) {
	$mysqli_query = $mysqli_connect->query("INSERT INTO `likes` (`referer`, `authorization_code`, `ip`, `browser`, `time`) VALUES ('$referer', '$id', '$ip', '$browser', UNIX_TIMESTAMP());");
}

$mysqli_select->close();

# Grąžiname vartotoją atgal, jeigu yra galimybė.
if ($referer !== 'null') {
	header('Location: '.$referer);
} else {
	# Perkėlimas nebuvo nustatytas iš naršyklės, todėl patikriname, ar yra nustatytas atsarginis perkėlimo adresas.
	if (!empty($setting_2)) {
		header('Location: '.$setting_2);
	}
}

}

# Gauname informaciją iš duomenų bazės. „Prepared Statements” neapsimoka naudoti, kadangi tik 1 užklausa (be ciklo).
$mysqli_select = $mysqli_connect->query("SELECT COUNT(`id`) FROM `likes` WHERE `authorization_code` = '$id';");

if ($mysqli_select !== false) {
	$text = prefix_number_convert($mysqli_select->fetch_row()[0]);
} else {
	$text = 0;
}

$mysqli_select->close();

} else {
	# Tekstas, kurį atvaizduos, jeigu kažkas blogai. Neperženkite 6 simbolių (numatytasis turi 5).
	$text = '[---]';
}

# Suskaičiuojame turinio ilgį.
$count_text = strlen($text);

# Parenkame tinkamiausią teksto atvaizdavimo X poziciją (pagal turinio ilgį).
switch ($count_text) {
	case 1:
		$x = 60;
		break;
	case 2:
		$x = 57;
		break;
	case 3:
		$x = 55;
		break;
	case 4:
		$x = 54;
		break;
	case 5:
		$x = 52;
		break;
	case 6:
		$x = 50;
		break;
	default:
		# Nepalaikoma.
		$x = 0;
		break;
}

# Šrifto dydis.
$text_size = 11;

# Šrifto šeima.
$text_font = __DIR__.'/fonts/Roboto.ttf';

# Atvaizduojame tekstą.
ImageTtfText($image, $text_size, 0, $x, 30, $color_1, $text_font, $text);

# Talpyklų atsisakymas (pasirinktinis).
# header('Cache-Control: no-cache, must-revalidate');

# Siunčiame antraštę, kad failą atvaizduotų kaip paveikslėlį.
header('Content-type: image/png');

ImagePng($image);
ImageDestroy($image);

?>

 

„SQL“ kodas:

CREATE TABLE IF NOT EXISTS `likes` (
`id` int(75) PRIMARY KEY AUTO_INCREMENT,
`referer` varchar(250) NOT NULL,
`authorization_code` varchar(250) NOT NULL,
`ip` varchar(150) NOT NULL,
`browser` varchar(250) NOT NULL,
`time` int(75) NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1;

 

Naudojimas:

*INDENTIFIKACIJOS_KODAS - gali būti parašytas bet koks tekstas, įskaitant ir skaičius, tačiau neturi būti mažiau simbolių negu nurodyta „$setting_1“.

*Nenurodykite „<img>“ žymėje „id_2=request”, kitaip skriptas neveiks tinkamai.

<a href="like.php?id=IDENTIFIKACIJOS_KODAS&amp;id_2=request" title="Patinka"><img src="like.php?id=IDENTIFIKACIJOS_KODAS" alt="Image, .PNG"></a>

 

Atsisiuntimas:

Temos failai.zip

Redaguota , nario District
Riktų pataisymai.
Nuoroda į komentarą
Dalintis per kitą puslapį

(redaguota)

Truputį pataisiau temą ir patobulinau kodą, nes rašiau mažai miegojęs. Ši tema yra pamoka, kitaip nerašyčiau jokių komentarų (įsk. papildomo kodo, kuris yra uždėtas komentare).

Dauguma kodo yra iš atminties, tačiau naudojau http://php.net/ (perskaityti paveikslėlių bibliotekos funkcijų aprašymus, kadangi retai naudojau).

Manau nėra reikalo tiksliai aprašyti viso pamokos kodo, kada galima susirasti visų funkcijų aprašymus internete, būtent todėl aprašau tik veikimą.

Redaguota , nario Tautedorus
Nuoroda į komentarą
Dalintis per kitą puslapį

Ši tema yra neaktyvi. Paskutinis pranešimas šioje temoje buvo prieš 2260 dienas (-ų). Patariame sukurti naują temą, o ne rašyti naują pranešimą.

Už neaktyvių temų prikėlimą galite sulaukti įspėjimo ir pranešimo pašalinimo!

Prisijungti prie diskusijos

Palikti atsakymą galite iš karto, o užsiregistruoti vėliau. Jeigu jau turite paskyrą mūsų forume, Prisijunkite.

Svečias
Atsakyti šioje temoje...

×   Įklijuotas tekstas turi teksto formatavimą.   Pašalinti teksto formatavimą

  Galimi tik 75 veidukai.

×   Nuoroda buvo automatiškai įterpta.   Įterpti nuorodą paprastai

×   Jūsų ankstesnis pranešimas buvo atkurtas.   Išvalyti redaktorių

×   Jūs negalite įkelti nuotraukas tiesiogiai.Įkelkite arba įdėkite nuotraukas iš URL.

Skelbimai


×
×
  • Sukurti naują...