Aanpassen search script

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: 1 2 volgende »

Hans Hermes

Hans Hermes

02/07/2019 21:26:17
Quote Anchor link
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<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.

Alvast enorm bedankt
Gewijzigd op 02/07/2019 21:58:52 door - Ariën -
 
PHP hulp

PHP hulp

20/07/2019 08:10:31
 
- Ariën -
Beheerder

- Ariën -

02/07/2019 22:01:09
Quote Anchor link
Je script is vatbaar voor SQL-injectie, omdat je de invoer NIET is gëescaped! Zie ook 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.
Gewijzigd op 02/07/2019 22:03:55 door - Ariën -
 
Hans Hermes

Hans Hermes

02/07/2019 22:18:04
Quote Anchor link
Dank je maar het zegt mij helemaal niets ik ben nogmaals geen programeur.
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.
 
- SanThe -

- SanThe -

02/07/2019 22:40:43
Quote Anchor link
Je zal toch ondertussen wel wat zelf kunnen in PHP.
Je komt al sinds 2008 op dit forum.
 
Hans Hermes

Hans Hermes

02/07/2019 22:44:09
Quote Anchor link
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.
 
- Ariën -
Beheerder

- Ariën -

02/07/2019 22:50:02
Quote Anchor link
Zorg eerst dat je de code verplaatst naar boven je HTML-layout.
 
Stan Avoird

Stan Avoird

03/07/2019 12:41:15
Quote Anchor link
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?
 
Hans Hermes

Hans Hermes

03/07/2019 12:44:39
Quote Anchor link
Ja dat doet hij ook alleen geeft hij als je op de pagina komt eerst alle records aan.
Ik weet niet hoe je hier een afbeelding kan toevoegen anders zie je wat ik bedoel.
 
- Ariën -
Beheerder

- Ariën -

03/07/2019 13:26:01
Quote Anchor link
Een afbeelding is gewoon met HTML toe te voegen. Of wat bedoel je?
 
Hans Hermes

Hans Hermes

03/07/2019 13:29:22
Quote Anchor link
Ik heb een afbeelding waar je kan zien wat ik bedoel als ik deze kan uploaden dan begrijpen mensen wat ik bedoel.
 
- Ariën -
Beheerder

- Ariën -

03/07/2019 13:34:23
Quote Anchor link
Dat kan je op Imgbb.com uploaden.
Gewijzigd op 03/07/2019 13:37:24 door - Ariën -
 
Stan Avoird

Stan Avoird

03/07/2019 14:13:56
Quote Anchor link
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
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
$conn->real_escape_string();
ook toegevoegd in de code.

Laat maar weten of het werkt.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<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>
 
Hans Hermes

Hans Hermes

03/07/2019 14:20:49
Quote Anchor link
Dank je wel ga het vanavond proberen en u krijgt zeker een terugkoppeling
 
Thomas van den Heuvel

Thomas van den Heuvel

03/07/2019 14:25:06
Quote Anchor link
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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.
 
Hans Hermes

Hans Hermes

04/07/2019 12:21:57
Quote Anchor link
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
 
Stan Avoird

Stan Avoird

04/07/2019 12:40:10
Quote Anchor link
Het gaat dus mis wanneer
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
$_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
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
$row_end

Dit is het stukje van $row_end:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
$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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
$row_end = $per_page * $page;

aan te passen naar dit:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
$row_end = $per_page * intval($page);
Gewijzigd op 04/07/2019 12:40:24 door Stan Avoird
 
Hans Hermes

Hans Hermes

04/07/2019 12:45:57
Quote Anchor link
Helaas resultaat blijft hetzelfde
 
Stan Avoird

Stan Avoird

04/07/2019 12:54:23
Quote Anchor link
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
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
$sql .= " ORDER BY artiest ASC LIMIT $row_start ,$row_end ";

aan naar
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
$sql .= " ORDER BY artiest ASC LIMIT $row_start ,$per_page";


Dit geeft dus op page 1
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
LIMIT 0, 10

Dit geeft dus op page 2
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
LIMIT 10, 10

Dit geeft dus op page 3
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
LIMIT 20, 10
 
Hans Hermes

Hans Hermes

04/07/2019 13:02:04
Quote Anchor link
Nog steeds niet helaas
 
Stan Avoird

Stan Avoird

04/07/2019 13:05:21
Quote Anchor link
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
$sql .= " ORDER BY artiest ASC LIMIT $per_page OFFSET $row_start";
 
Hans Hermes

Hans Hermes

04/07/2019 13:14:07
Quote Anchor link
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
 

Pagina: 1 2 volgende »



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.