Последно посетени 3 продукта

noxious

Registered
Здравейте!
Търся PHP script за последно посетени 3 продукта. Дали ще е със сесия или бисквитки, няма значение. Знам, че последните 3 продукта трябва да се направят с array_slice, но не знам как точно да се направи като цяло. Намирам за някакви готови CMS-и и ASP.NET, но ми трябва с PHP.

Благодаря предварително!
 
Те и готовите цмс-и са с php(90%). Няма универсален скрипт, всичко зависи как си си структурирал кода, какво записваш, имаш ли сесии, само за логнати потребители ли да е и .т.н.

Понеже не си дал, код и ние трябва да гадаем. Предполагам, че става дума за 'Гост' потребителя.

В такъв случай ще ти трябва една таблица, в която да записваш IP-то на посетителя, Ид-то на продукта и timestamp. И в продуктовата страница най-отгоре, правиш връзка с БД и вкарваш по един ред (не е нужно да проверяваш за съществуващ запис, ако не искаш) и в админа просто изкарваш информацията по timestamp DESC и ги групираш резултатите с Group By `product_id` (примерно, ако така си кръстил колоната на продукта в новата таблица)

И така, малко е кофти като не виждаш код и трябва да се чудиш кое, как и къде, нали, въпреки, че го обясних доста подробно ? Горе-долу е същото и от другата страна, когато ние, четем поста ти. За това е хубаво да кажеш дали си начинаещ, напреднал, да кажеш имам такъв и такъв код, и това е проблема, или това не тръгва, използвам ето такава система и т.н. Всичко това ние няма как го знаем и съответно като не го даваш, повечето пичове тук са се уморили да напомнят на пичове като теб да дават повече информация, съответно, колкото по-малко информация даваш -> по-малко вероятно е някой да ти отговори.

Не се заяждам, просто какзвам, за да знаеш как да процедираш и за да максимизираш отоговорите в темата си :)

Айде успех с скрипта - дано се справиш :?:
 
Нямам код, защото не знам как да го направя, но веднъж бях изпробвал is_checked за checkbox с бисквитки и те помнят без да е нужна таблица с ip адрес и timestamp.

Например това е чрез cookie за последно посетена страница, но на мен общо взето ми трябва: когато даден човек посети страниците http://saita.com/view/id:1 > id:27 > id:5 > id:6, да се помнят последните 3 посетени т.е. id:6, 5, 27 и там където са всички продукти да ги изведа. Или аз трябва във view.php да имам някъде setCookie, ако се задаваха с това. И products.php да извежда чрез getCookie посетените страници и с array_slice да показва последните 3. Но ми трябва някакъв примерен код. И също, ако вече е посетен дадения продукт да не го показва 2 пъти, а просто да го премести като първи. Т.е. на мен ми трябва само cookie за id-то на посетените

Edit: не знам това дали ще свърши работа
 
И това е вариант, но ако потребителя, си изтрие сесиите и бисквитките - край, за това е хубаво да имаш данните при теб в таблица, и така може да си направиш по - добра и точна статистика :) :idea: :?:
 
joTunkiq каза:
И това е вариант, но ако потребителя, си изтрие сесиите и бисквитките - край, за това е хубаво да имаш данните при теб в таблица, и така може да си направиш по - добра и точна статистика :) :idea: :?:
Ако потребителят си изтрие бисквитките как ще го вържеш с даден ред от таблицата? Остава ти само ИП-то.

А да държиш последните 3 посетени страници в таблица само заради онзи, който ще си изтрие бисквитките, не си струва.
Ако потребителят си изтрие бисквитките, значи просто не иска да му показваш последните 3 страници.
 
@anonimen Не разбрах какво искаш да кажеш. Искам само да кажа, че имах предвид, да използва IP като индификатор и да го записва в БД, не че е не се сменят IP-тата, но все пак е по-надеждно от само бисквитки. Най-добре е тази функция да е само за регистрирани потребители, но пича си знае. :idea: :?:
 
joTunkiq каза:
@anonimen Не разбрах какво искаш да кажеш. Искам само да кажа, че имах предвид, да използва IP като индификатор и да го записва в БД, не че е не се сменят IP-тата, но все пак е по-надеждно от само бисквитки. Най-добре е тази функция да е само за регистрирани потребители, но пича си знае. :idea: :?:
А да държиш последните 3 посетени страници в таблица само заради онзи, който ще си изтрие бисквитките, не си струва.
Ако потребителят си изтрие бисквитките, значи просто не иска да му показваш последните 3 страници.

по-надеждно от само бисквитки
Тук не търсиш надеждност, а удобство за юзера. Няма защо да му показваш [[ поправете ме, ако има ]], че като си изтрие бисквитките, още знаеш кой е и какво разглежда :)
 
@anonimen Ехе, мерси за копи-пейста :D Така е, прав си. Но, дадох това решение, защото повечето ми клиенти(примерно), когато искат такава функционалност - я искат, защото искат след това да могат да си направят някаква справка или нещо такова. Тъй като автора на темата не е споменал каква е целта му - просто дадох алтернатива.

Бисквитките ще свършат работа, но за детайлни справки и т.н, мисля, че не е това решението :D

Извинявам се за спама, преди малко станах - още спя явно :D
 
Объркана работа с това :D Пробвах по няколко начина и дори нищо не се извежда. Този код по-долу е напълно грешен може би и дори не показва 3 продукта, а само един, ако някой има предложение за някой работещ. Може би със сесия ще е най-добре.

[js]<script>
function setCookie(name, value) {
var today = new Date()
var expires = new Date()
expires.setTime(today.getTime() + 1000*60*60*24*30) // expires in a month
document.cookie = name + "=" + escape(value) + "; expires=" + expires.toGMTString() +";path=/"
}

function getCookie(Name) {
var search = Name + "="
if(document.cookie.length > 0) {
offset = document.cookie.indexOf(search)
if(offset != -1) {
offset += search.length
end = document.cookie.indexOf(";", offset)
if(end == -1) end = document.cookie.length
return unescape(document.cookie.substring(offset, end))
}
else return ""
}
}

//get information of previous item
var RecentlyViewNAME=getCookie("recNAME");
var RecentlyViewNO=getCookie("recNO");
var RecentlyViewIMAGE=getCookie("recIMAGE");

//set information for current item
proIMAGE="<ss:value source="$product.thumbnailImageName"/>";
proNAME="<ss:value source="$product.name"/>";
proNO="<ss:value source="$product.productNumber"/>";

if(RecentlyViewNO){ //if not the first viewed item

document.write('<table width="100%" align="center" cellpadding="2" cellspacing="2"><tr><td align="center">');
document.write('<b>Previous Viewed Item:</b><br>');

document.write('<img src="'+RecentlyViewIMAGE+'" border="0">');//the image path here maybe different in your site
document.write('<br>'+RecentlyViewNAME);


document.write('</td></tr></table>');

//update the previous vieded item
setCookie("recIMAGE",proIMAGE);
setCookie("recNAME",proNAME);
setCookie("recNO",proNO);


}else{ //if first vieded item

//set as previous vieded item
setCookie("recIMAGE",proIMAGE);
setCookie("recNAME",proNAME);
setCookie("recNO",proNO);

}

</script>[/js]
 
Само едно предложение - може да използваш обект или масив в бисквитката, за да не слагаш няколко бисквитки с един и същ ключ.

Пример:
[js]// слагаш информацията в обект
var data = {
lastViewedProduct: new Date(),
products: []

};


// записваш в сесията
setCookie("uinfo",data);[/js]

Разбира се винаги, може да си ползваш метода с по една бисквитка за всеки продукт - с няколко проверки :)

[js]
setCookie("product1", <?=$_GET['id'];?>);
setCookie("product2", <?=$_GET['id'];?>);
setCookie("product3", <?=$_GET['id'];?>);
[/js] :?:
 
Направих го така:

view.php
PHP:
if(!isset($_SESSION["lastviewed"])) {
	$_SESSION["lastviewed"] = array();
}
$maxelements = 3;
if(isset($productid) && $productid <> "") {// if we have url parameter
	if(in_array($productid, $_SESSION["lastviewed"])) { // if product id is already in the array
		$_SESSION["lastviewed"] = array_diff($_SESSION["lastviewed"], array($productid)) ; // remove it
		$_SESSION["lastviewed"] = array_values($_SESSION["lastviewed"]); //optionally, re-index the array
	}

	if(count($_SESSION["lastviewed"]) >= $maxelements) {//check the number of array elements
		$_SESSION["lastviewed"] = array_slice($_SESSION["lastviewed"], 1); // remove the first element if we have 5 already
		array_push($_SESSION["lastviewed"], $productid);//add the current itemid to the array
	} else {
		array_push($_SESSION["lastviewed"], $productid);//add the current itemid to the array
	}
}

products.php
PHP:
<?php
session_start();
$criteria = (isset($_SESSION["lastviewed"]) ? implode(", ", $_SESSION["lastviewed"]) : "-1");
?>
<?php 
$rslastviewed = new WA_MySQLi_RS("rslastviewed",$PowerCMSConnection_i,0);
$rslastviewed->setQuery("SELECT tblproducts.ProductID, tblproducts.ProductName, tblproducts.ProductImageTitle, tblproducts.ProductImage FROM tblproducts WHERE tblproducts.ProductID IN (?) ORDER BY FIELD (tblproducts.ProductID, ?)");
$rslastviewed->bindParam("il", "".$criteria  ."", "-1"); //criteria
$rslastviewed->bindParam("il", "".$criteria  ."", "-1"); //listorder
$rslastviewed->execute();
?>
<?php do { ?>
  <a href="productdetails.php?ProductID=<?php echo $row_rslastviewed['ProductID']; ?>"><img src="<?php echo $row_rslastviewed['ProductImage']; ?>" title="<?php echo $row_rslastviewed['ProductID']; ?>" width="150" alt="Image of <?php echo $row_rslastviewed['ProductImage']; ?>"/></a>
  <?php } while ($row_rslastviewed = mysql_fetch_assoc($rslastviewed)); ?>

Как мога това в products да го направя с нормален MySQL.
Кода е вземан от тук

Моя опит:
PHP:
<?php
	$criteria = (isset($_SESSION["lastviewed"]) ? implode(", ", $_SESSION["lastviewed"]) : "-1");

	foreach($_POST as $key => $value) {
		$new_product[$key] = filter_var($value, FILTER_SANITIZE_STRING);
	}

	$rslastviewed = $mysqli_conn->prepare("SELECT * FROM `products` WHERE id IN (?) ORDER BY FIELD (id, ?)");
	$rslastviewed->bind_param("ss", $criteria, "-1");
	$statement->execute();

	while($statement->fetch()) {
	?>
	<div class="container">
		<div class="row">
			<div class="col-xs-12 col-sm-6 col-md-4">
				<div class="card<?php
						if($new_product['discount'] <= 7 && $new_product['discount'] != 0) {
							echo " card-outline-secondary";
						} else if($new_product['discount'] > 7 && $new_product['discount'] <= 35) {
							echo " card-outline-warning";
						} else if($new_product['discount'] > 35 && $new_product['discount'] <= 100) {
							echo " card-outline-danger";
						}
						?> product-box">
					<div class="imghover">
						<figure>
							<a href="view/<?php echo $new_product['id']; ?>"><?php
							if($new_product['image1'] == NULL) {
								echo "<img src=\"images/nopicture358x250.png\" class=\"card-img-top\" style=\"width: 100%; height: 250px;\" alt=\"Няма изображение\" />";
							} else {
								echo "<img src=\"images/uploads/preview/thumbs/".$new_product['image1']."\" class=\"card-img-top\" style=\"width: 100%; height: 250px;\" alt=\"".$new_product['name']."\" />";
							}
							?></a>
						</figure>
					</div>
					<div class="card-block">
						<h4 class="card-title"><a href="view/<?php echo $new_product['id']; ?>"><?php $string = $new_product['name']; if(mb_strlen($string) <= 20) { echo $string; } else { echo mb_substr($string, 0, 20).'...'; } ?></a> <?php
						if($new_product['discount'] <= 7 && $new_product['discount'] != 0) {
							echo "<span class=\"badge badge-info\">-".$new_product['discount']."%</span>";
						} else if($new_product['discount'] > 7 && $new_product['discount'] <= 35) {
							echo "<span class=\"badge badge-warning\">-".$new_product['discount']."%</span>";
						} else if($new_product['discount'] > 35 && $new_product['discount'] <= 100) {
							echo "<span class=\"badge badge-danger\">-".$new_product['discount']."%</span>";
						}
						?></h4>
						<p class="card-text"></p>
						<p class="card-text" style="padding-top: 8px; font-size: 16px; text-align: center;"><?php
						$product_price = $new_product['price'];
						$product_discount = $new_product['discount'];
						$percentage = $product_price*($product_discount/100);
						$total_price = $product_price-$percentage;
						$product_price = number_format($product_price, 2);
						$total_price = number_format($total_price, 2);
						
						if($product_discount == 0) {
							echo $product_price." ".$currency;
						} else {
							echo "<s style=\"color: #e51c23;\">".$product_price." ".$currency."</s> ";
							echo $total_price." ".$currency;
						}
						?></p>
						<p class="card-text" style="font-size: 16px; text-align: center;"><?php if($new_product['instock'] == "Да") { ?><font style="color: #5cb85c;">В наличност</font><?php
						} else {
						?>
						<font style="color: #d9534f;">Не е в наличност</font>
						<?php
						}
						?></p>
						<p class="card-text"><small class="text-muted">Прегледано <?php echo $new_product['views']; ?> път(и)</small></p>
					</div>
				</div>
			</div>
		</div>
	</div>
	<?php
	}
	?>

и грешка Fatal error: Cannot pass parameter 3 by reference in...
 
Замести си таблицата и името на колоните при извеждането :)
Код:
<?php
session_start();
$criteria = (isset($_SESSION["lastviewed"]) ? implode(", ", $_SESSION["lastviewed"]) : "-1");


if($criteria != '-1')
{

	$q = mysqli_query($db, "SELECT * FROM `products` WHERE `id` IN (".$criteria.")");

	while($p = mysqli_fetch_assoc($q))
	{
	?>
		<a href="view.php?id=<?php echo $p['id']; ?>"><?php echo $p['title']; ?></a> <br/>
	<?php
	 }  
}
?>
И разбира се драйвъра, ако ползваш PDO, замести с завката с PDO или mysql - кавото ползваш, като не забравиш да направиш връзка с ДБ :?:
 

Back
Горе