Beste,
Ik heb een zoek script gevonden die ik voor mijn website kan gebruiken.
Dat is natuurlijk mooi maar het script laat de eerste 10 records zien, het totaal aantal records in getallen en het totaal aantal pagina's.
Ik ben geen held in php dus ik weet niet hoe ik dit kan wijzigen.
Wat ik wil is de searchbox wordt weergegeven en als er een record gevonden dat hij dan getoond wordt.

Het script is:

<html>
<head>
<title>Mijn titel</title>
</head>
<body>
<?php
	ini_set('display_errors', 1);
	error_reporting(~0);

	$strKeyword = null;

	if(isset($_POST["txtKeyword"]))
	{
		$strKeyword = $_POST["txtKeyword"];
	}
	if(isset($_GET["txtKeyword"]))
	{
		$strKeyword = $_GET["txtKeyword"];
	}
?>
<form name="frmSearch" method="post" action="index.php/hoefvinyl/">
  <table width="599" border="1">
    <tr>
      <th>Keyword
      <input name="txtKeyword" type="text" id="txtKeyword" value="<?php echo $strKeyword;?>">
      <input type="submit" value="Search"></th>
    </tr>
  </table>
</form>
<?php
   $serverName = "localhost";
   $userName = "gebruikersnaam";
   $userPassword = "wachtwoord";
   $dbName = "mijn database";

   $conn = mysqli_connect($serverName,$userName,$userPassword,$dbName);

	$sql = "SELECT * FROM muziek WHERE artiest LIKE '%".$strKeyword."%' OR songnummer LIKE '%".$strKeyword."%' ";
	$query = mysqli_query($conn,$sql);

	$num_rows = mysqli_num_rows($query);

	$per_page = 10;   // Per Page
	$page  = 1;
	
	if(isset($_GET["Page"]))
	{
		$page = $_GET["Page"];
	}

	$prev_page = $page-1;
	$next_page = $page+1;

	$row_start = (($per_page*$page)-$per_page);
	if($num_rows<=$per_page)
	{
		$num_pages =1;
	}
	else if(($num_rows % $per_page)==0)
	{
		$num_pages =($num_rows/$per_page) ;
	}
	else
	{
		$num_pages =($num_rows/$per_page)+1;
		$num_pages = (int)$num_pages;
	}
	$row_end = $per_page * $page;
	if($row_end > $num_rows)
	{
		$row_end = $num_rows;
	}

	$sql .= " ORDER BY artiest ASC LIMIT $row_start ,$row_end ";
	$query = mysqli_query($conn,$sql);

?>
<table width="600" border="1">
  <tr>
    <th width="200"> <div align="center">Artiest </div></th>
    <th width="250"> <div align="center">Titel </div></th>
    <th width="50"> <div align="center">Jaar </div></th>
  </tr>
<?php
while($result=mysqli_fetch_array($query,MYSQLI_ASSOC))
{
?>
  <tr>
    
    <td><?php echo $result["artiest"];?></td>
    <td><?php echo $result["songnummer"];?></td>   
    <td align="right"><?php echo $result["jaar"];?></td>
  </tr>
<?php
}
?>
</table>
<br>
Total <?php echo $num_rows;?> Record : <?php echo $num_pages;?> Page :
<?php
if($prev_page)
{
	echo " <a href='$_SERVER[SCRIPT_NAME]?Page=$prev_page&txtKeyword=$strKeyword'><< Back</a> ";
}

for($i=1; $i<=$num_pages; $i++){
	if($i != $page)
	{
		echo "[ <a href='$_SERVER[SCRIPT_NAME]?Page=$i&txtKeyword=$strKeyword'>$i</a> ]";
	}
	else
	{
		echo "<b> $i </b>";
	}
}
if($page!=$num_pages)
{
	echo " <a href ='$_SERVER[SCRIPT_NAME]?Page=$next_page&txtKeyword=$strKeyword'>Next>></a> ";
}
$conn = null;
?>
</body>
</html>



Wie kan mij hiermee helpen?


Alvast enorm bedankt
Dus als je op de pagina komt alleen eerst het zoekformulier laten zien. En pas wanneer je iets hebt gezocht en op "Zoek" drukt daadwerkelijk de resultaten laten zien.

Ik heb het script wat aangepast, maar zelf niet getest. Maar dit zou het moeten doen.
In een notendop:
Als er een $_GET of $_POST is geset (dus gezocht is) laat dan de tabel zien met resultaten. Als deze niet geset zijn, laat het dan niet zien.

Script is inderdaad heel simpel en is gevoelig voor mysql injections.
Heb daarom
$conn->real_escape_string();
ook toegevoegd in de code.

Laat maar weten of het werkt.

<html>
<head>
<title>Mijn titel</title>
</head>
<body>
<?php
    ini_set('display_errors', 1);
    error_reporting(~0);

    $strKeyword = null;

	$showResults = false;
    if(isset($_POST["txtKeyword"]))
    {
        $strKeyword = $_POST["txtKeyword"];
		$showResults = true;
    }
    if(isset($_GET["txtKeyword"]))
    {
        $strKeyword = $_GET["txtKeyword"];
		$showResults = true;
    }
?>
<form name="frmSearch" method="post" action="index.php/hoefvinyl/">
  <table width="599" border="1">
    <tr>
      <th>Keyword
      <input name="txtKeyword" type="text" id="txtKeyword" value="<?php echo addslashes($strKeyword);?>">
      <input type="submit" value="Search"></th>
    </tr>
  </table>
</form>
<?php
	if ($showResults === true) {
		   $serverName = "localhost";
		   $userName = "gebruikersnaam";
		   $userPassword = "wachtwoord";
		   $dbName = "mijn database";

		   $conn = mysqli_connect($serverName,$userName,$userPassword,$dbName);
		   //Beveilig input string
		   $strKeyword = $conn->real_escape_string($strKeyword); //Bijvoorbeeld O'neil wordt O\'neil 

			$sql = "SELECT * FROM muziek WHERE artiest LIKE '%".$strKeyword."%' OR songnummer LIKE '%".$strKeyword."%' ";
			$query = mysqli_query($conn,$sql);

			$num_rows = mysqli_num_rows($query);

			$per_page = 10;   // Per Page
			$page  = 1;
			
			if(isset($_GET["Page"]))
			{
				$page = $_GET["Page"];
			}

			$prev_page = $page-1;
			$next_page = $page+1;

			$row_start = (($per_page*$page)-$per_page);
			if($num_rows<=$per_page)
			{
				$num_pages =1;
			}
			else if(($num_rows % $per_page)==0)
			{
				$num_pages =($num_rows/$per_page) ;
			}
			else
			{
				$num_pages =($num_rows/$per_page)+1;
				$num_pages = (int)$num_pages;
			}
			$row_end = $per_page * $page;
			if($row_end > $num_rows)
			{
				$row_end = $num_rows;
			}

			$sql .= " ORDER BY artiest ASC LIMIT $row_start ,$row_end ";
			$query = mysqli_query($conn,$sql);

		?>
		<table width="600" border="1">
		  <tr>
			<th width="200"> <div align="center">Artiest </div></th>
			<th width="250"> <div align="center">Titel </div></th>
			<th width="50"> <div align="center">Jaar </div></th>
		  </tr>
		<?php
		while($result=mysqli_fetch_array($query,MYSQLI_ASSOC))
		{
		?>
		  <tr>
			
			<td><?php echo $result["artiest"];?></td>
			<td><?php echo $result["songnummer"];?></td>   
			<td align="right"><?php echo $result["jaar"];?></td>
		  </tr>
		<?php
		}
		?>
		</table>
		<br>
		Total <?php echo $num_rows;?> Record : <?php echo $num_pages;?> Page :
		<?php
		if($prev_page)
		{
			echo " <a href='$_SERVER[SCRIPT_NAME]?Page=$prev_page&txtKeyword=$strKeyword'><< Back</a> ";
		}

		for($i=1; $i<=$num_pages; $i++){
			if($i != $page)
			{
				echo "[ <a href='$_SERVER[SCRIPT_NAME]?Page=$i&txtKeyword=$strKeyword'>$i</a> ]";
			}
			else
			{
				echo "<b> $i </b>";
			}
		}
		if($page!=$num_pages)
		{
			echo " <a href ='$_SERVER[SCRIPT_NAME]?Page=$next_page&txtKeyword=$strKeyword'>Next>></a> ";
		}
		$conn = null;
}
?>
</body>
</html>
Dank je wel ga het vanavond proberen en u krijgt zeker een terugkoppeling
Ik hoop ook dat die kolommen FULLTEXT indexen hebben?

MySQL heeft trouwens ook een voorziening voor dit soort gepagineerde content. Het komt er op neer dat je niet direct alle resultaten hoeft op te halen, je kunt direct 10 items of wat dan ook ophalen.

Uiteraard heb je ook het totaal aantal resultaten nodig om het aantal pagina's uit te kunnen rekenen. Dit doe je als volgt: allereerst voer je de query uit om de gegevens van de huidige pagina op te halen, dus inclusief LIMIT, maar ook met het speciale keyword SQL_CALC_FOUND_ROWS, dus zoiets:
SELECT SQL_CALC_FOUND_ROWS y, x, z, ...
FROM table
WHERE ...
LIMIT <offset>, <limit>

Nu heb je alle informatie voor de huidige pagina.
Vervolgens heb je nog het totale aantal records nodig voor bovenstaande query voor wanneer deze zonder LIMIT was uitgevoerd. Hiervoor heb je -vanwege SQL_CALC_FOUND_ROWS- nu de beschikking over de functie FOUND_ROWS() die precies dit doet. Voer direct na bovenstaande query de volgende query uit:
SELECT FOUND_ROWS() AS results

Nu bevat de "results" kolom het aantal records van de eerste query alsof deze zonder LIMIT was uitgevoerd.

Ik weet overigens niet of die berekening van $row_end wel klopt. Voor zover ik het begrijp is de constructie LIMIT <offset>, <limit>, en <limit> is altijd het aantal items per pagina, oftewel $per_page, maar in bovenstaande code lijkt $row_end elke pagina groter te worden? Ik weet niet of dat de bedoeling is? Het tweede argument van LIMIT is dus *niet* de eind-index van de records-van-interesse zoals de bovenstaande code doet vermoeden.
Beste allen,
Het script werkt nu op 1 ding na.
Als ik zoek dan laat hij idd de eerste 10 resultaten zien op de eerste pagina.
Als ik bijvoorbeeld zoek op the beatles (waar ik 28 nummers van heb) dan vindt hij idd 28 nummers verspreid over 3 pagina's wat ook klopt.
Maar op pagina 2 krijg ik 18 resultaten en op pagina 3, 8 resultaten.
Die 8 resultaten op pagina 3 zijn ook de laatste 8 resultaten van pagina 2.
Ik dacht dat hij op pagina 2 ook 10 resultaten moet laten zien en de rest op pagina 3.
Het wordt misschien duidelijker om dit te laten zien op https://www.mulasquez.nl/index.php/hoefvinyl/
en dan zoeken op beatles.
Maar bedankt met de hulp ik ben nu een stuk verder.
Met vriendelijke groet,
Hans Hermes
Het gaat dus mis wanneer
$_GET['page'] = 2;

Want op de eerste page laat hij netjes eerste 10 records zien, op 3e page netjes laatste 8.
Maar op page 2 laat hij de 10e t/m 28e rijen zien, maar dit moet zijn 10e t/m 20e rij

Het zit hem dus in
$row_end

Dit is het stukje van $row_end:

$row_end = $per_page * $page;
            if($row_end > $num_rows)
            {
                $row_end = $num_rows;
            }


Op page 2 zijn de variabelen $per_page = 10; en $page = 2;
Dan krijg je dus $row_end = 10 * 2 = 20;
$num_rows moet als het goed is 28 zijn.
if (20 > 28) wat niet is, dan zet $row_end = $num_rows;

Het lijkt erop, dat hij wel de $row_end op $num_rows zet, wat vreemd is.

Probeer eens deze code:

$row_end = $per_page * $page;

aan te passen naar dit:

$row_end = $per_page * intval($page);

Helaas resultaat blijft hetzelfde
Ik denk dat ik hem zie.

De query gebruikt een "LIMIT (offset), (show_records)" structuur.
Degene die jouw zoekcode heeft geschreven denkt dat de LIMIT anders werkt. Namelijk LIMIT begin, eind

Pas eens regel
 $sql .= " ORDER BY artiest ASC LIMIT $row_start ,$row_end ";

aan naar
 $sql .= " ORDER BY artiest ASC LIMIT $row_start ,$per_page";


Dit geeft dus op page 1
LIMIT 0, 10

Dit geeft dus op page 2
LIMIT 10, 10

Dit geeft dus op page 3
LIMIT 20, 10

Nog steeds niet helaas
Weet je zeker dat je het opgeslagen hebt en gepusht naar je server?
Ik ben vrij zeker dat dit de oplossing is.

Daarnaast, dezelfde code maar andere syntax: (LIMIT row_count OFFSET offset)
Kan je nog proberen die regel te vervangen door:
$sql .= " ORDER BY artiest ASC LIMIT $per_page OFFSET $row_start";

Ja het zat idd nu bij mij fout cache geleegd en etc nu werkt alles zoals het moet zijn.
Heel erg bedankt ik ben hier superblij mee.

Met vriendelijk groet,
Hans Hermes

Reageren