Премини към съдържанието
  • Добре дошли!

    Добре дошли в нашите форуми, пълни с полезна информация. Имате проблем с компютъра или телефона си? Публикувайте нова тема и ще намерите решение на всичките си проблеми. Общувайте свободно и открийте безброй нови приятели.

    Моля, регистрирайте се за да публикувате тема и да получите пълен достъп до всички функции.

     

Скрипт за брой четения на статия?


Препоръчан отговор


Здравейте,

трябва ми скрипт, с който да показвам колко пъти е била четена всяка една от статиите/публикациите. Да използва база данни.

Става сума за ето тази страница (примерно):

http://cheeseus.org/translations_read.php?trans_id=1

За всяко от различните ID-та да съхранява брой четения. Предполагам просто трябва да добавя колона в таблицата, която да се казва "views" например, но не ми е ясно как точно да напиша кода. Благодаря предварително за помощта ви!

Линк към този отговор
Сподели в други сайтове
Здравейте,

трябва ми скрипт, с който да показвам колко пъти е била четена всяка една от статиите/публикациите. Да използва база данни.

Става сума за ето тази страница (примерно):

http://cheeseus.org/translations_read.php?trans_id=1

За всяко от различните ID-та да съхранява брой четения. Предполагам просто трябва да добавя колона в таблицата, която да се казва "views" например, но не ми е ясно как точно да напиша кода. Благодаря предварително за помощта ви!

Сложи функцията в библиотеката си:

Приемаме, че библиотеката е в директория inc/

inc/lib.php

function updateCount($id) {

	$id = intval($id);

	if (!in_array($id,$_SESSION['viewed'])) {

		$query = "UPDATE articles SET views=views+1 WHERE id=$id";

		mysql_query($query) or custom_die("ERROR: in file: `".__FILE__."` on line: `".__LINE__."` DETAIL: `".mysql_error()."`");

		$_SESSION['viewed'][] = $id;

		return true;

	}

	else {

		return false;

	}

}
после, на страницата която ще я ползваш:
include(dirname(__FILE__).'/inc/lib.php');
приемаме, че вечеш имаш конекция към базата данни и си направил mysql_select_db(DATABASE_NAME); Също така приемаме, че си стартирал и сесията:
session_start();
Някъде преди да почнаш показването примерно, но СЛЕД като си се свързал с mysql + старт на сесия пишеш:
updateCount($trans_id);

Функцията custom_die() можеш да я изтриеш и да сложиш там каквото искаш да се случи.

В показания случай, може да си направиш такава функция и да и дадеш да пише в някакъв log грешките и / или да те уведомява по мейла ако има проблем.

Във самата функция може да промениш името на таблицата, с това което ти ползваш.

Сесията се използва, за да предотврати повторно броене за "видяно" на потребителя.*

*като му изтече сесията и отиде на страницата ще увеличи пак броя, но пък поне при рефреш или мултипъл вюс, без да затваря браузъра няма да ти цъка излишни updates

Редактирано от fubar (преглед на промените)
Линк към този отговор
Сподели в други сайтове

Благодаря!

Обаче нещо не ми се получи... sad.gif

Сложих това в самото начало на "translations_read.php":

<?php

include("publisher/config_publisher.php");

include(dirname(__FILE__)."/lib.php");

session_start();

updateCount($trans_id);

?>
Мога ли всъщност да добавя функцията от lib.php в config_publisher.php? Коригирах няколко първоначални мои грешки и сега страницата се зарежда без никакви съобщения за грешка, но и не ъпдейтва колоната в таблицата "translations.views". Колоната е "int(12)" - така правилно ли е? Направих само няколко "козметични промени" по lib.php:
<?php

function updateCount($trans_id) 

	{

		$trans_id = intval($trans_id);

		if (!in_array($trans_id,$_SESSION['viewed'])) 

			{

				$query = "UPDATE translations SET views=views+1 WHERE trans_id=$trans_id";

				mysql_query($query) or custom_die("ERROR: in file: `".__FILE__."` on line: `".__LINE__."` DETAIL: `".mysql_error()."`");

				$_SESSION['viewed'][] = $trans_id;

				return true;

			}

		else 

			{

				return false;

			}

	}

?>

Ако можеш да ми кажеш къде ми е грешката, ще е супер :)

Редактирано от dalai.lamia (преглед на промените)
Линк към този отговор
Сподели в други сайтове

Да, можеш да сложиш функцията във всеки файл който поискаш.

Значи, варианти:

1. имаш registered_globals = off -> тогава на функцията подавай:

updateCount($_GET['trans_id'])
2. Преди извикването на функцията, все още нямаш връзка с базата данни:
$CONNECTION = mysql_connect($SERVER,$USERNAME,$PASSWORD);
3. Имаш валидна конекция, но в кода си използваш depreciated още във php 4.06 функцията:
mysql_db_query($DATABASE,$query,$CONNECTION);
-решението е да сложиш вътре във функцията:
mysql_db_query("име_на_БД",$query)
вместо
mysql_query($query)
-най-добре да използваш само веднъж
mysql_select_db($DATABASE);
-или най-най-добре е да ползваш за всяка заявка името на базата данни вътре:
$query = "SELECT * FROM `база_данни`.`моя_таблица` WHERE `нещо`='друго_нещо'";

mysql_query($query);
4. Има проблем със сесията и in_array, трябва да добавиш следния ред:
if (!isset($_SESSION['viewed'])) $_SESSION['viewed'] = array();

$trans_id = intval($trans_id);

...................................

Линк към този отговор
Сподели в други сайтове

Хм...

Не съм сигурен, че разбирам всичко (нов съм в PHP), но...

registered_globals = on;

Всъщност, заявките, които използвам са със следната структура:

<?php

function updateCount($trans_id) 

	{

		$trans_id = intval($trans_id);

		if (!isset($_SESSION['views'])) $_SESSION['views'] = array();


			{

				$query = mysql_query("UPDATE translations SET views=views+1 WHERE trans_id=$trans_id",$connect);

					while ($rrow = mysql_fetch_array($query))

					{

						$_SESSION['views'][] = $trans_id;

						return true;

					}

			}


	}

?>
Но в начина, по който съм променял твоя код очевидно има грешки. Самата ми връзка става така:
$connect = mysql_connect($dbhost, $dbusername, $dbpassword);

mysql_select_db($dbname,$connect) or die ("Could not select database");

Там е работата, че не ми е ясно как точно да напиша функцията updateCount, та да работи... sad.gif

Редактирано от dalai.lamia (преглед на промените)

Линк към този отговор
Сподели в други сайтове
function updateCount($trans_id)

{

	/*функцията няма достъп до тази променлива, трябва да си я вземем.*/

	global $connect;


	/*каквото и да пуснеме като ID, винаги ще го направи на число, най-простата защита срещу какъвто и да е sql injection*/

	$trans_id = intval($trans_id); 


	$result = mysql_query("UPDATE translations SET views=views+1 WHERE trans_id=$trans_id",$connect);

	if ($result) {

			$_SESSION['views'][] = $trans_id;

			return true;

	}

	else {

		   return false;

	}

}

Редактирано от fubar (преглед на промените)
Линк към този отговор
Сподели в други сайтове

Добавете отговор

Можете да публикувате отговор сега и да се регистрирате по-късно. Ако имате регистрация, влезте в профила си за да публикувате от него.

Гост
Напишете отговор в тази тема...

×   Вмъкнахте текст, който съдържа форматиране.   Премахни форматирането на текста

  Разрешени са само 75 емотикони.

×   Съдържанието от линка беше вградено автоматично.   Премахни съдържанието и покажи само линк

×   Съдържанието, което сте написали преди беше възстановено..   Изтрий всичко

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Добави ново...

Информация

Поставихме бисквитки на устройството ви за най-добро потребителско изживяване. Можете да промените настройките си за бисквитки, или в противен случай приемаме, че сте съгласни с нашите Условия за ползване