Beste,

Ik ben bezig met een project voor een bedrijf waar ik nu werkzaam ben, dit project is in principe afgerond, alleen ben ik nu bezig om het meer overzichtelijk te maken. Voor de geïnteresseerde onder ons, mijn project is het maken van een webshop.

Nu ben ik dus een probleem tegen gekomen, ik had mijn producten allemaal in één grote lijst staan, waarbij ik een pagina nummering had, die dus na elke 10 producten een nieuwe pagina maakte.

Nu heb ik bij al deze producten een categorie meegegeven (enkel een aantal testproducten). Vervolgens heb ik door middel van ajax een drop-down menu gemaakt, waarbij je kunt kiezen van welke categorie je producten wilt zien.

De functionaliteit hiervan werkt in principe half. Hij toont dus producten van de gekozen categorie, maar ik heb dus 4 producten in de lijst en hij toont er maar 3, terwijl hij er 10 moet tonen en dan pas een nieuwe pagina moet maken. Verder is nog een probleem dat hij 7 pagina's aan maakt, terwijl als hij er dus 3 toont, de 4e op een 2e pagina moet staan en dus geen 7 pagina's zijn.

Mijn laatste probleem is, dat als ik voor pagina 2 kies, deze link wel werkt, maar dan moet de keuze uit categorie weer opnieuw worden gekozen en op het moment dat dat gebeurt kom je weer op de eerste pagina met slechts 3 producten uit.

Ik hoop dat iemand mij hierbij kan helpen. Ik weet ook niet zeker of ik het zo goed beschreven heb, maar voor degene die een kijkje willen nemen, kunnen die hier kijken : Webshop.

Als volgt, de code:

Producten.php

<?php
	session_start();
	ob_start();	
	include("db_connect.php");
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
	<head>
		<script type="text/javascript" src="livesearch.js"></script>
		<script type="text/javascript" src="selectcat.js"></script>
		<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
			<title>Webshop @ College Groep Nederland</title>
		<link rel="stylesheet" type="text/css" href="style.css" />
		<style type="text/css">
			p {margin: 0px; padding: 0px;}
		</style>
	</head>
	<body>
		<div id="wrapper">
			<div id="header"></div>
			<div id="leftcolumn">		 
				<h2>Menu</h2><br>
					<?php 
						include 'menu.php' 
					?>
			</div>
			<div id="rightcolumn">
				<?php
					if(empty($_GET['ProductID'])) 
						{
				?>
							<a href='index.php'>Home</a> » <a href='producten.php'>Producten</a><br><br>
							<h2>Producten</h2><p>
							<br>
							Hieronder ziet u een overzicht van al onze producten. Klik op een product om gedetaileerde informatie van het product te lezen.<br><br>
							Om een product te zoeken typt u een zoekwoord in, in het invoerveld.<br>
							<table border="0">
								<tr>
									<td>
										<form action="zoek_product.php" method="post">
											<input type="text" name="naam" id="txt1" size="20" onkeyup="showResult(this.value)" />
											<input type="submit" value="Zoeken">
										</form>
									</td>
									<td>
										        <b>Categorie:</b>
									</td>
									<td>
										<form>
											<select name="cat" onchange="showStatus(this.value)">
												<option value="">Selecteer categorie</option>
												<option value="accp">Access Points</option>
												<option value="Notebook">Notebooks</option>
											</select>
										</form>
									</td>
								</tr>
							</table>
							<br>
							<div id="txtHint">
								<b>Producten worden hier getoond.</b>
							</div>
				<?php
						}
					else
						{
							$sql2 = "SELECT * FROM productgegevens WHERE ProductID = '".$_GET['ProductID']."'";
							$result2 = mysql_query($sql2);
							while ($rij2 = mysql_fetch_array($result2))
								{
									$get_prijs	= $rij2['prijs'];
									$rond_prijs	= round($get_prijs, 2);
									$prijs		= number_format($rond_prijs, 2, ',', '.');

									$product = stripslashes($rij2['productnaam']);

									echo "<a href='index.php'>Home</a> » <a href='producten.php'>Producten</a> » "; echo $product;
									echo "<br><br>";
									echo "<TABLE border='0' class='producten'>";
									echo (
										"<tr>" .
											"<td width='62%' class='producttitel'> <b>". $product . " </b> </td>" .
											"<td width='38%' class='producttitel'> <b>Prijs:</b> €". $prijs . " </td>" .
										"</tr>" .
										
										"<tr>" .
											"<td colspan='2' valign='top' class='products'>". stripslashes($rij2['omschrijving']) . " </td>" .
										"</tr>" .
										
										"<tr>" .
											"<td colspan='2' class='producttitel'>\n " 
										);
							if($array['level'] == 2)
								{
									echo ("<a href='productbestellen.php?ProductID=".$_GET['ProductID']."'>Product bestellen</a> ");
								}
							else
								{
									echo (" ");
								}
							if($array['level'] == 1)
								{
									echo ("<a href='producttoevaan.php?ProductID=".$_GET['ProductID']."'>Toevoegen aan aanbiedingen</a> ");
									echo (" | ");
									echo ("<a href='productaanpassen.php?ProductID=".$_GET['ProductID']."'>Product aanpassen</a> ");
									echo (" | ");
									echo ("<a href='product_verwijderen.php?ProductID=".$_GET['ProductID']."'>Product verwijderen</a> ");
								}
							else
								{
									echo (" ");
								}
									echo "</td>";
									echo "</tr>";
								}
						}
				?>

									</td>
								</tr>
							</table>

			</div>
		</div>
	</body>
</html>
	<?php 
		ob_end_flush();
	?>


selectcat.js

var xmlhttp;

function showStatus(str)
{
xmlhttp=GetXmlHttpObject();
if (xmlhttp==null)
  {
  alert ("Browser does not support HTTP Request");
  return;
  }
var url="getcat.php";
url=url+"?q="+str;
url=url+"&sid="+Math.random();
xmlhttp.onreadystatechange=stateChanged;
xmlhttp.open("GET",url,true);
xmlhttp.send(null);
}

function stateChanged()
{
if (xmlhttp.readyState==4)
{
document.getElementById("txtHint").innerHTML=xmlhttp.responseText;
}
}

function GetXmlHttpObject()
{
if (window.XMLHttpRequest)
  {
  // code for IE7+, Firefox, Chrome, Opera, Safari
  return new XMLHttpRequest();
  }
if (window.ActiveXObject)
  {
  // code for IE6, IE5
  return new ActiveXObject("Microsoft.XMLHTTP");
  }
return null;
}


getcat.php

<?php
	session_start();
	ob_start();	
	include("db_connect.php");
	error_reporting(E_ALL);

	if (isset($_GET["page"]))
		{
			$page  = $_GET["page"]; 
		}
	else 
		{
			$page=1; 
		};
	$start_from = ($page-1) * 10; 
	$q=$_GET["q"];
	$sql = "SELECT ProductID, productnaam, prijs, korteomschrijving, cat, omschrijving FROM `productgegevens` WHERE cat = '".$q."' AND `aanbprijs` = '' ORDER BY productnaam ASC LIMIT $start_from, 10"; 
	$rs_result = mysql_query ($sql);
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
	<head>
		<link rel="stylesheet" type="text/css" href="style.css" />
	</head>
	<?php
		$sql = "SELECT COUNT(productnaam) FROM productgegevens"; 
		$row = mysql_fetch_row($rs_result); 
		$total_records = $row[0]; 
		$total_pages = ceil($total_records / 10); 
		echo "Pagina ";
		for ($i=1; $i<=$total_pages; $i++)
			{
				echo "<a href='producten.php?page=".$i."&cat=".$q."'>".$i."</a> "; 
			}
	?>
	<table class='producttable' border='0'>
		<tr>
			<th align='left'  	class='producttitel' 	width="120">	Productnaam			</th>
			<th align='left'  	class='producttitel' 	width="200">	Korte omschrijving	</th>
			<th align='left'  	class='producttitel' 	width="155">	Categorie			</th>
			<th align='right' 	class='producttitel' 	width="75">		Prijs				</th>
		</tr>
		<?php 
			while ($rij = mysql_fetch_assoc($rs_result))
				{
					$get_prijs	= $rij['prijs'];
					$rond_prijs	= round($get_prijs, 2);
					$prijs		= number_format($rond_prijs, 2, ',', '.');

					echo ("<tr><td valign='top' class='productinfo'><a href='producten.php?ProductID=".$rij['ProductID']."'>". stripslashes($rij['productnaam']) . "</a> </td> " .
						"<td class='productoms'>" . stripslashes($rij['korteomschrijving']) . " </td> " .
						"<td class='productcat'>" . stripslashes($rij['cat']) . " </td> " .
						"<td align='right'>€ " . $prijs . " </td> " . " </tr>\n " );
				}

				?>
		<tr>
			<td colspan='4' class='producttitel'> </td>
		</tr>
	</table>
	<?php
	echo "Pagina ";
	for ($i=1; $i<=$total_pages; $i++)
		{
			echo "<a href='producten.php?page=".$i."'>".$i."</a> "; 
		}
	?>
</html>
Om te beginnen, stap eens af van die ob_start() en ob_end_flush()

EDIT

Ah, ik zie het.
Jij stuurt een hele html pagina als request. Dat is niet de bedoeling.

In getcat.php mag je geen html opmaak hebben. Geen <html><head>... <body> ...

Stuur enkel de html die nodig is binnen de div.

Emmanuel Delay schreef op 25.08.2009 13:37
Om te beginnen, stap eens af van die ob_start() en ob_end_flush()


Nou dat is gebeurd. Maar dit veranderd verder niks, verder nog ideeën?

EDIT: Ow zie nu jou edit pas, ik zal even kijken of dat zal lukken, moet echter zo weg dus denk dat ik morgen pas kan kijken. Alvast bedankt!

EDIT2: Heb nog even tijd gehad, maar ik heb nu dus alle HTML tags weggehaald, op mijn table na. Maar er is niks veranderd. Ik zit nog steeds met exact hetzelfde probleem.
Toon nog eens hoe getcat.php er nu uit ziet.

Je mag dus trouwens wel html tags in je request zetten, dat is geen probleem.
Wat je niet mag doen, is een volledige pagina sturen, met doctype, <html>, <head>, <body>. Stuur dus enkel door wat je tussen <body> en </body> zou kunnen zetten. divs, tables, ... allemaal geen probleem.
Oké, mijn getcat.php is nu als volgt:

<?php
	session_start();
	include("db_connect.php");
	error_reporting(E_ALL);

	if (isset($_GET["page"]))
		{
			$page  = $_GET["page"]; 
		}
	else 
		{
			$page=1; 
		};
	$start_from = ($page-1) * 10; 
	$q=$_GET["q"];
	$sql = "SELECT ProductID, productnaam, prijs, korteomschrijving, cat, omschrijving FROM `productgegevens` WHERE cat = '".$q."' AND `aanbprijs` = '' ORDER BY productnaam ASC LIMIT $start_from, 10"; 
	$rs_result = mysql_query ($sql);

	$sql = "SELECT COUNT(productnaam) FROM productgegevens"; 
	$row = mysql_fetch_row($rs_result); 
	$total_records = $row[0]; 
	$total_pages = ceil($total_records / 10); 
	echo "Pagina ";
	for ($i=1; $i<=$total_pages; $i++)
		{
			echo "<a href='producten.php?page=".$i."&cat=".$q."'>".$i."</a> "; 
		}
?>
	<table class='producttable' border='0'>
		<tr>
			<th align='left'  	class='producttitel' 	width="120">	Productnaam			</th>
			<th align='left'  	class='producttitel' 	width="200">	Korte omschrijving	</th>
			<th align='left'  	class='producttitel' 	width="155">	Categorie			</th>
			<th align='right' 	class='producttitel' 	width="75">		Prijs				</th>
		</tr>
		<?php 
			while ($rij = mysql_fetch_assoc($rs_result))
				{
					$get_prijs	= $rij['prijs'];
					$rond_prijs	= round($get_prijs, 2);
					$prijs		= number_format($rond_prijs, 2, ',', '.');

					echo ("<tr><td valign='top' class='productinfo'><a href='producten.php?ProductID=".$rij['ProductID']."'>". stripslashes($rij['productnaam']) . "</a> </td> " .
						"<td class='productoms'>" . stripslashes($rij['korteomschrijving']) . " </td> " .
						"<td class='productcat'>" . stripslashes($rij['cat']) . " </td> " .
						"<td align='right'>&euro; " . $prijs . " </td> " . " </tr>\n " );
				}

		?>
		<tr>
			<td colspan='4' class='producttitel'>&nbsp;</td>
		</tr>
	</table>
	<?php
	echo "Pagina ";
	for ($i=1; $i<=$total_pages; $i++)
		{
			echo "<a href='producten.php?page=".$i."'>".$i."</a> "; 
		}
	?>
Bij het berekenen van het aantal pagina's gebruik je dit:
SELECT COUNT(productnaam) FROM productgegevens

Dit gaat dan wel over alle producten.
Moet je hier ook niet iets zetten van
WHERE cat = '".$q."' ?

Dan wordt het aantal pagina's berekend enkel op de producten die geselecteerd zijn.
Heb je inderdaad een goed punt, waar ik later tegen aan zou lopen.
Echter werkt dit ook niet. Verder heb ik ook maar 4 producten in mijn database staan momenteel, dus op dit moment zou het ook geen probleem zijn.

Helaas krijg ik nog steeds dezelfde resultaten. Op de site die ik in mijn beginpost heb staan, daar upload ik ook continue de vernieuwde pagina's op. Dus kun je daar kijken als er eventueel aanpassingen zijn. Maar momenteel werkt het nog hetzelfde, helaas.
Ja, ik zie nu net wat je fout doet.

Vervang eens jouw lijnen 17 -> 23 door dit.
<?php
$rs_result = mysql_query ($sql);
// aantal pagina's
$sql = "SELECT COUNT(productnaam) FROM productgegevens WHERE cat = '". $q ."' AND aanbprijs = '' ";
$aantalPaginas_result = mysql_query ($sql);
$row = mysql_fetch_row($aantalPaginas_result);
$total_records = $row[0];
$total_pages = ceil($total_records / 10);
//
echo "Pagina ";
?>

Wat jij doet, is het aantal pagina's berekenen uit $rs_result. Wat je eigenlijk doet, is het eerste record opofferen (en dan krijg je nog een mis resulaat).

Zie zelf eens wat je in de WHERE moet zetten. Ik zou verwachten de zelfde WHERE clausules als in de eerste $sql.

Werkt dit?
Geweldig!

Je hebt zojuist 1 van mijn problemen opgelost, hartstikke bedankt!
Helaas heb ik nu nog mijn tweede probleem, die zal iets moeilijker zijn vrees ik, en misschien wel onmogelijk.

Ik quote:
Mijn laatste probleem is, dat als ik voor pagina 2 kies, deze link wel werkt, maar dan moet de keuze uit categorie weer opnieuw worden gekozen en op het moment dat dat gebeurt kom je weer op de eerste pagina met slechts 3 producten uit.


Het is dus het geval dat als ik naar een volgende pagina wil gaan, dan neemt de pagina de categorie van het ajax drop-down menu'tje niet mee. Waardoor die dus opnieuw moet worden gekozen, waardoor ik weer op pagina 1 kom.

Ik heb eigenlijk het idee dat het onmogelijk is (met php dan). Maar misschien dat u, of iemand anders hier wel een oplossing weet.
Bij producten:

<?php
$_GET['cat'] = (! empty($_GET['cat']) ? $_GET['cat'] : ''); // ternary operator
echo '
<select name="cat" onchange="showStatus(this.value)">
<option '. ($_GET['cat'] == '' ? 'selected="selected" ' : '').'value="">Selecteer categorie</option>
<option '. ($_GET['cat'] == 'accp' ? 'selected="selected" ' : '').'value="accp">Access Points</option>
<option '. ($_GET['cat'] == 'Notebook' ? 'selected="selected" ' : '').'value="Notebook">Notebooks</option>
</select>
'
?>
Dit werkt helaas niet, momenteel doet hij nog hetzelfde als van tevoren.
Het drop-down menu'tje gaat nog steeds terug naar zijn standaard waarde.

Reageren