Avatar billede miss-g Seniormester
16. marts 2018 - 16:29 Der er 5 kommentarer og
1 løsning

Rette i søgescript

Kan nogle hjælpe med at rette denne kode til, så den også søger i

ord_engelsk og ord_svensk

--------------------------------------------------------------------

<?php
// get the q parameter from URL
$q = $_REQUEST["q"];

$hint = "";
include ("../../../Connections/conn.php");
$fname=array();
$query=mysqli_query($conn,"select * from `ordliste`");
while($row=mysqli_fetch_array($query)){
    $fname[]=$row['ord_dansk'];
}

// lookup all hints from array if $q is different from ""
if ($q !== "") {
    $q = strtolower($q);
    $len=strlen($q);
    foreach($fname as $name) {
        if (stristr($q, substr($name, 0, $len))) {
            if ($hint === "") {
                $hint = $name;
            } else {
                $hint .="<br> $name
                ";
            }
        }
    }
}
echo $hint === "" ? "" : $hint;
?>
Avatar billede olsensweb.dk Ekspert
16. marts 2018 - 18:16 #1
hvorfor bruger du $_REQUEST ??
den læser jo både post og get samtidig, og du anvender jo get 
$q = $_REQUEST["q"];


hvorfor laver du ikke en where betingelse i denne sql ??
$query=mysqli_query($conn,"select * from `ordliste`");
kunne se ca sådan ud: (utested)
$sql = "select * from `ordliste` where $q IN (`ord_engelsk`, `ord_dansk`, `ord_svensk`)";
$query=mysqli_query($conn, $sql);

lige nu henter du alle ord ud og sorterer / filtrerer derefter, det smarteste er at lave filtrering i din sql.



hvordan ser din structur ud for ordliste ??
jeg gætter på noget ala
CREATE TABLE `ordliste` (
  `id` int(11) NOT NULL,
  `ord_engelsk` varchar(255) COLLATE utf8_danish_ci NOT NULL,
  `ord_dansk` varchar(255) COLLATE utf8_danish_ci NOT NULL,
  `ord_svensk` varchar(255) COLLATE utf8_danish_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_danish_ci;

ALTER TABLE `ordliste`
  ADD PRIMARY KEY (`id`);

ALTER TABLE `ordliste`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;

 

hvad ønsker du kommer ud fra din sql ??,
kun det danske ord
while($row=mysqli_fetch_array($query)){
    $fname[]=$row['ord_dansk'];
}


eller hele rækken
while($row=mysqli_fetch_array($query)){
    $fname[]=$row; // id, ord_engelsk, ord_dansk, ord_svensk
}



>mysqli_fetch_array
hvorfor henter du data ud som både nummerisk og assoative array ??, du bruger jo kun det ene.
Avatar billede Slater Ekspert
16. marts 2018 - 18:33 #2
#1: Hvorfor skulle man ikke bruge $_REQUEST?

At præcisere hvilken metode man vil have dataene fra tilføjer ingen sikkerhed eller performance, men gør det mere besværligt hvis man i fremtiden ønsker at kalde det på en anden måde, samt tilføjer muligheden for en irriterende fejl, hvis man lige kommer til at skrive det forkerte.

Men enig, jeg håber godt nok det er en meget kort ordliste, hvis man henter ALLE data ud af databasen for hver søgning, for at sortere dem i PHP. Det skal naturligvis gøres i SQL.
Selv hvis man har behov for en mere teknisk avanceret søgning end SQL giver mulighed for (hvilket ikke er tilfældet her), så laver man en grundlæggende filtrering i SQL først, så man skærer størstedelen væk fra den side.
Avatar billede olsensweb.dk Ekspert
16. marts 2018 - 18:55 #3
#2 >Hvorfor skulle man ikke bruge $_REQUEST?
hvorfor åbne for noget man ikke skal bruge ??, hvis data kommer som get (står i URL'en jf kommentar), er der ikke nogle grund til at også læse post, hvilke ville være utilsigtede data

@miss-g
nu når du er kommet over på mysqli syntes jeg du skulle kigge på Prepare Statement som er noget af det nye i mysqli og klart forbedret i PDO
https://www.computerworld.dk/uploads/eksperten-guider/1480-Prepared-Statements-under-MySQLI-kom-igang.pdf
fordelen ved Prepare Statement er at du er bedre sikret mod sql injection, som det er nu er din sql piv åben for sql injection
Avatar billede Slater Ekspert
16. marts 2018 - 20:02 #4
#3: Igen, hvorfor ikke? Hvis nogen har lyst til at tilgå dit end-point via POST, hvad er der så galt i det? Det åbner ikke for anderledes data, det er udelukkende en anden HTTP metode. Who cares?

Hvis man ønsker at begrænse hvilke metoder der kan tilgå et end-point, bør man gøre det i stedet. Det giver ikke mening at tillade adgang til det fra alle metoder, men nægte at læse data fra andre end ét.
Avatar billede miss-g Seniormester
16. marts 2018 - 21:11 #5
Koden er her fra, jeg har ikke selv skrevet den: https://www.sourcecodester.com/tutorials/php/11576/how-create-simple-search-mysql-table-using-php-mysqli-and-ajax.html

Jeg kan ikke programmere, derfor finder jeg koder på nettet og prøver at rette, hvor jeg kan....
Avatar billede olsensweb.dk Ekspert
17. marts 2018 - 10:06 #6
jeg har omskrevet deres code lidt, det er ikke optimalt, bla:
de retunerer html hvilke ikke er meningem med ajax, man bør kun udskrive / retunerer rå data i json eller xml format, og lave alt formateringen af data via js

man bør anvende Prepare Statement (kommet til i mysqli og forbedret i PDO)


getresult.php
<?php
// get the q parameter from URL
//q skal måske trimmes 
// http://php.net/manual/en/function.trim.php
$q = $_GET["q"];
$hint = "";
require('conn.php');
$name = array();
if ($q != "") {
    $sql = "SELECT * FROM `ordliste` WHERE `ord_dansk` like '%" . $q . "%' or `ord_engelsk` like '%" . $q . "%'";
    $query = mysqli_query($conn, $sql);
    while ($row = mysqli_fetch_assoc($query)) {
        $name[] = $row;
    }
    $lng = count($name);
    if ($lng) {
        for ($i = 0; $i < $lng; $i++) {
            $hint .= $name[$i]['ord_dansk'] . " " . $name[$i]['ord_engelsk'] . "<br>";
        }
    }
    else {
        $hint = "no suggestion";
    }   
}
echo $hint;
?>



test tabel

CREATE TABLE `ordliste` (
  `id` int(11) NOT NULL,
  `ord_engelsk` varchar(255) COLLATE utf8_danish_ci NOT NULL,
  `ord_dansk` varchar(255) COLLATE utf8_danish_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_danish_ci;

INSERT INTO `ordliste` (`id`, `ord_engelsk`, `ord_dansk`) VALUES
(1, 'cat', 'kat'),
(2, 'dog', 'hund'),
(3, 'horse', 'hest'),
(4, 'pig', 'gris'),
(5, 'goat', 'ged'),
(6, 'rabbit', 'kanin');

ALTER TABLE `ordliste`
  ADD PRIMARY KEY (`id`);

ALTER TABLE `ordliste`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=7;



her er en gammel tut om ajax, den retunerer desværer  også html, den skal rettes til at anvende mysqli eller PDO hvis du anvender PHP7, men læs den igennem og se om du bliver klogere på det 
http://www.udvikleren.dk/artikler/374/dynamisk-indhold-med-ajax-og-php/
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester