Aanpassen search script
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:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
<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>
<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?
Edit:
Ik heb code-tags geplaatst. Gelieve dit in het vervolg zelf toe te voegen aan je bericht.
Zie ook: Veel gestelde vragen: Welke UBB-codes kan ik gebruiken.
Zie ook: Veel gestelde vragen: Welke UBB-codes kan ik gebruiken.
Alvast enorm bedankt
Gewijzigd op 02/07/2019 21:58:52 door - Ariën -
mysqli_real-escape_string
Met $num_rows kan je tellen hoeveel records er zijn (het is eerlijk gezegd niet de efficienste manier, omdat COUNT zinvoller is). Maar aan de hand van de waarde die deze variabele geeft kan je zien of je de searchbox moet tonen. Je moet wel even dan een goede scheiding tussen je logica en je layout maken, zodat je dit in je layout kan bepalen.
Je script is vatbaar voor SQL-injectie, omdat je de invoer NIET is gëescaped! Zie ook Met $num_rows kan je tellen hoeveel records er zijn (het is eerlijk gezegd niet de efficienste manier, omdat COUNT zinvoller is). Maar aan de hand van de waarde die deze variabele geeft kan je zien of je de searchbox moet tonen. Je moet wel even dan een goede scheiding tussen je logica en je layout maken, zodat je dit in je layout kan bepalen.
Gewijzigd op 02/07/2019 22:03:55 door - Ariën -
Wat ik zoek is een zoekscript voor php mysqli waarbij ik de artiest zoek of de titel van het nummer.
Dit moet dan worden weer gegeven en als ik meerdere nummers van de artiest heb dan moet hij de eerste 10 nummers laten zien en dan de link volgende of vorige.
Je komt al sinds 2008 op dit forum.
Wel op het forum maar lang niet meer mee bezig geweest voorheen werkte ik in dreamweaver waar de scripts zelf gegenereerd werden en je ze kon aanpassen maar tegenwoordig werk ik met wordpress en daar heb je allemaal plugins die je helpen. Behalve wat ik wil hebben dus ben ik op zoek naar iemand die mij verder kan helpen.
Zorg eerst dat je de code verplaatst naar boven je HTML-layout.
Quote:
Wat ik wil is de searchbox wordt weergegeven en als er een record gevonden dat hij dan getoond wordt.
Is dit niet precies wat dit script al doet?
Wat wil je hier aan aanpassen?
Ik weet niet hoe je hier een afbeelding kan toevoegen anders zie je wat ik bedoel.
Een afbeelding is gewoon met HTML toe te voegen. Of wat bedoel je?
Ik heb een afbeelding waar je kan zien wat ik bedoel als ik deze kan uploaden dan begrijpen mensen wat ik bedoel.
Gewijzigd op 03/07/2019 13:37:24 door - Ariën -
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 ook toegevoegd in de code.
Laat maar weten of het werkt.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
<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>
<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
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:
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:
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.
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
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
Dit is het stukje van $row_end:
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:
aan te passen naar dit:
Gewijzigd op 04/07/2019 12:40:24 door Stan Avoird
Helaas resultaat blijft hetzelfde
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
aan naar
Dit geeft dus op page 1
Dit geeft dus op page 2
Dit geeft dus op page 3
Nog steeds niet helaas
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:
Heel erg bedankt ik ben hier superblij mee.
Met vriendelijk groet,
Hans Hermes