Avatar billede Morten Professor
06. februar 2017 - 16:30 Der er 11 kommentarer og
1 løsning

Autocompleter mysqli søge boks

Hej Eksperter

Jeg har fundet et fint script til auto søg men har et problem med at få feks. fællesstykket frem det er en fiske plads.
Den kan godt finde andre ord med æ inde i ordet.

Min kode:
<?php 

if(isset($_POST["query"])) 

//Virker//
$con->set_charset("utf8");
//Virker ikke//
//$con->set_charset("iso-8859-1");
      $output = ''; 
      $query = "SELECT `id`, `mainid`, `menunavn`, `overskrift`, `billede`, `tekst`, `sted`, `forfatter`, `datetime` FROM `tbl_oversigt` WHERE overskrift LIKE '%".$_POST["query"]."%'"; 
      $result = mysqli_query($con, $query); 
      $output = '<ul class="list-unstyled">'; 
      if(mysqli_num_rows($result) > 0) 
      { 
          while($row = mysqli_fetch_array($result)) 
          { 
                $output .= '<li>'.$row["overskrift"].'</li>'; 
          } 
      } 
      else 
      { 
          $output .= '<li>Ingen resultater</li>'; 
      } 
      $output .= '</ul>'; 
      echo $output; 

?>
jeg bruger set_charset("utf8") for ellers vil den ikke komme frem i søgningen.
hvis jeg bruger $con->set_charset("iso-8859-1"); kommer ingen ting frem.

Er der nogen der har en svar på det og måske en løsning?

Med venlig hilsen
Morten
Avatar billede Morten Professor
06. februar 2017 - 16:32 #1
har også prøvet uden set_charset("utf8"); men der kommer fællesstykket ikke frem
Avatar billede olsensweb.dk Ekspert
06. februar 2017 - 17:02 #2
>Jeg har fundet et fint script til auto søg
hvor henne ?? kom med et link, andre kunne have gavn af det.

>Den kan godt finde andre ord med æ inde i ordet.
hvordan står det i databasen ??

prøv lige at lave et dump af tabellen tbl_oversigt

bare 5-6 poster: følgende skal være med fællesstykket, og et af det andre ord der virker.


jeg antaer du henter via ajax, det understøtter ikke andet charset end utf-8
Avatar billede Morten Professor
06. februar 2017 - 19:36 #3
Æøå står rigtig i databasen og de andre navne med æ står på samme måde. tbl er med utf8_danish_ci
Avatar billede Morten Professor
06. februar 2017 - 19:45 #4
-- Struktur-dump for tabellen `tbl_oversigt`
--

CREATE TABLE IF NOT EXISTS `tbl_oversigt` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `mainid` int(11) NOT NULL,
  `mid` int(11) NOT NULL,
  `menunavn` varchar(255) COLLATE utf8_danish_ci NOT NULL,
  `overskrift` varchar(255) COLLATE utf8_danish_ci NOT NULL,
  `billede` varchar(255) COLLATE utf8_danish_ci NOT NULL,
  `for_tekst` text COLLATE utf8_danish_ci NOT NULL,
  `tekst` text COLLATE utf8_danish_ci NOT NULL,
  `sted` varchar(255) COLLATE utf8_danish_ci NOT NULL,
  `forfatter` varchar(255) COLLATE utf8_danish_ci NOT NULL,
  `datetime` datetime NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_danish_ci AUTO_INCREMENT=1 ;

/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
Avatar billede olsensweb.dk Ekspert
06. februar 2017 - 20:47 #5
jeg prøvede for sjovs skyld dette setup, uden problemer
<?php
$con = new mysqli("localhost", "root", "", "test");
if (! $con) {
    echo 'Der opstod en fejl.';
    exit ();
}
$con->set_charset( "utf8" );
?>



<!DOCTYPE html>
<HTML lang="da">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>demo</title>
</head>
<body>
<?php
if(isset($_POST["query"])) 
{    $output = ''; 
      $query = "SELECT `id`, `mainid`, `menunavn`, `overskrift`, `billede`, `tekst`, `sted`, `forfatter`, `datetime` FROM `tbl_oversigt` WHERE overskrift LIKE '%".$_POST["query"]."%'"; 
     
     
     
      $result = mysqli_query($con, $query); 
      $output = '<ul class="list-unstyled">'; 
      if(mysqli_num_rows($result) > 0) 
      { 
          while($row = mysqli_fetch_array($result)) 
          { 
                $output .= '<li>'.$row["overskrift"].'</li>'; 
          } 
      } 
      else 
      { 
          $output .= '<li>Ingen resultater</li>'; 
      } 
      $output .= '</ul>'; 
      echo $output; 
     

?>

<form method="post" action="">
<input name="query" type="text" >
<input type="submit" name="button" id="button">
</form>

</body>
</html>


CREATE TABLE `tbl_oversigt` (
  `id` int(11) NOT NULL,
  `mainid` int(11) NOT NULL,
  `mid` int(11) NOT NULL,
  `menunavn` varchar(255) COLLATE utf8_danish_ci NOT NULL,
  `overskrift` varchar(255) COLLATE utf8_danish_ci NOT NULL,
  `billede` varchar(255) COLLATE utf8_danish_ci NOT NULL,
  `for_tekst` text COLLATE utf8_danish_ci NOT NULL,
  `tekst` text COLLATE utf8_danish_ci NOT NULL,
  `sted` varchar(255) COLLATE utf8_danish_ci NOT NULL,
  `forfatter` varchar(255) COLLATE utf8_danish_ci NOT NULL,
  `datetime` datetime NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_danish_ci;
INSERT INTO `tbl_oversigt` (`id`, `mainid`, `mid`, `menunavn`, `overskrift`, `billede`, `for_tekst`, `tekst`, `sted`, `forfatter`, `datetime`) VALUES
(1, 1, 1, 'test', 'fællesstykket', 'fællesstykket.gif', 'jajrqs qweriq juwehjr ', 'asdaedkq qæwq ejok wqeopå4', 'home', 'unknown', '2017-02-06 00:00:00'),
(2, 2, 2, 'test 2', 'æøå', 'æøå.jpeg', 'jqwr wejr', 'werwrj ', 'erwr wre', 'werw', '2017-02-13 00:00:00');
ALTER TABLE `tbl_oversigt`
  ADD PRIMARY KEY (`id`);
ALTER TABLE `tbl_oversigt`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=3;

 
men det er noget gammel code du har fået fat i, alene det at den er skrevet proceduralt, den er piv åben for sql injection.

så hvis du vil anvende coden fremover skal du opdaterer den sikkerheds mæssigt
Avatar billede Morten Professor
06. februar 2017 - 22:01 #6
Så skal den i hvert fald omskrives skal ikke have noget sikkerheds mæssigt ikke virker, det må jeg lige kigge på at få lavet om.
Nu har jeg sørget for alle andre steder at have dem lukket så det skal ikke laves om på.
Avatar billede Morten Professor
06. februar 2017 - 22:18 #7
Ja nu virker det, men skal lige have lavet om i koden.
Tak for du ville kigge på det og endnu en gang tak for hjælpen.
Jeg får lige lukket de huller med den gode mysqli formel.
Avatar billede Morten Professor
06. februar 2017 - 22:45 #8
Okay jeg prøvede lige for sjovt at gøre det online på hjemmesiden, men så vil det ikke med æøå, den vil kun på wampserver
Avatar billede Morten Professor
06. februar 2017 - 22:52 #9
Jeg har slettet det igen vil ikke have noget åben. Holder mig bare indtil videre med det gode gamle søge metode indtil videre :o)
Avatar billede olsensweb.dk Ekspert
07. februar 2017 - 09:39 #10
nu har du skrevet det andet code i Prepare Statement, så denne code kunne du passende også omskrive.
har du lavet i dit næste spm https://www.computerworld.dk/eksperten/spm/1015497


hvis du pakkede dine sql kald ind i functioner du har liggende i en seperat fil, og bare lade dem retunerede et array, ville du kunne genbruge mange af dem, der er ikke nogle grund til at opfinde hjulet 2 gange
fordelen ved bare at retunerer et array/string/obj, er at alt formatering sker uden for functionen, og derved øges chancen for genbrug.
fordelen ved at samle alle sql functionerne i en fil er at du bare includerer denne fil og har derved adgang til alle dine functioner, og når du skifter API så er det kun en fil du retter i, istedet for mange filer.

jeg prøvede for sjov at omskrive coden i #5, der var nogle ting jeg lige skulle prøve.

model.php
<?php
/* usikker, variabel direkte i sql, potientielt sql injection
  function oversigt_search($con, $search){
  $query = "SELECT `id`, `mainid`, `menunavn`, `overskrift`, `billede`, `tekst`, `sted`, `forfatter`, `datetime` FROM `tbl_oversigt` WHERE overskrift LIKE '%".$search."%'";
  $result = mysqli_query($con, $query);
  return $result->fetch_all (MYSQLI_ASSOC);
  }
*/

function oversigt_search($con, $word) {
    // $sql = "SELECT `id`, `mainid`, `menunavn`, `overskrift`, `billede`, `tekst`, `sted`, `forfatter`, `datetime` FROM `tbl_oversigt` WHERE overskrift LIKE ?";
    $sql = "SELECT * FROM `tbl_oversigt` WHERE overskrift LIKE ?";
    $ar = array();
    $soegeord = '%' . $word . '%';
    /* Soeg */
    if ($stmt = $con->prepare($sql)) {
        /* Bind parametre */
        $stmt->bind_param('s', $soegeord);
        /* Eksekver forespørgslen */
        $stmt->execute();
        $result = $stmt->get_result();
        $ar = $result->fetch_all(MYSQLI_ASSOC);
    }
    return $ar;
}

$con = new mysqli("localhost", "root", "", "test");
if (!$con) {
    echo 'Der opstod en fejl.';
    exit();
}
$con->set_charset("utf8");
?>



<?php
require_once("model.php");
?>
<!DOCTYPE html>
<HTML lang="da">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
        <title>demo</title>
    </head>
    <body>
        <?php
        if (isset($_POST["query"])) {
            $output = '';
            $output = '<ul class="list-unstyled">';
            $ar = oversigt_search($con, $_POST["query"]);
            $lng = count($ar);
            if ($lng > 0) {
                for ($i = 0; $i < $lng; $i++) {
                    $output .= '<li>' . $ar[$i]["overskrift"] . '</li>';
                }
            } else {
                $output .= '<li>Ingen resultater</li>';
            }
            $output .= '</ul>';
            echo $output;
        }
        ?>

        <form method="post" action="">
            <input name="query" type="text" >
            <input type="submit" name="button" id="button">
        </form>

    </body>
</html>
Avatar billede Morten Professor
07. februar 2017 - 10:02 #11
Det sender fin forspørgelse, men den der menu der skulle komme kommer ikke når man skriver.
Kan det være noget med min js jeg har hentet?
Avatar billede olsensweb.dk Ekspert
07. februar 2017 - 10:32 #12
>Kan det være noget med min js jeg har hentet?
det kunne det godt, hvor har du den oprindelige code fra ??
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

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