Avatar billede Morten Professor
25. januar 2017 - 15:20 Der er 19 kommentarer og
1 løsning

Søge maskine Mysqli

Hej Eksperter

Jeg er ved at lave en yders simpel søge maskine men den er nok alt for simpel for det virke ikke :-)

<form action="" method="post" id="soegeform">
<input name="ord" type="text" id="ord">
<input name="soeg" type="submit" id="soeg" value="S&oslash;g">
            <?php
            if(isset($_POST['soeg'])){
               
                $soegeord = $_POST['ord'];
    /* Soeg */
    if ($stmt = $con->prepare('SELECT `id`, `mainid`, `menunavn`, `overskrift`, `billede`, `tekst`, `sted`, `forfatter`, `datetime` FROM `tbl_oversigt` WHERE overskrift like = ?' )) {
        /* Bind parametre */
        $stmt->bind_param('s', $id);

        /* Sæt værdier på parametrene */
        $id = $_POST['ord'];

        /* Eksekver forespørgslen */
        $stmt->execute();

        /* Bind resultatet */
        $stmt->bind_result($S_id, $S_mainid, $S_menunavn, $S_overskrift, $S_billede, $S_tekst, $S_sted, $S_forfatter, $S_datetime);
        }
        while ($stmt->fetch()) {
            echo $S_overskrift;

            ;}}
            ?>
    </form>

Er der nogen der kan komme med et godt råd?

Med venlig hilsen
Morten
Avatar billede olsensweb.dk Ekspert
25. januar 2017 - 15:33 #1
hvad indeholder variablen id i
/* Bind parametre */
$stmt->bind_param('s', $id);


mon ikke der skal stå noget med
$stmt->bind_param('s', $soegeord);
Avatar billede olsensweb.dk Ekspert
25. januar 2017 - 15:37 #2
glem ovenstående

den får værdien her
$id = $_POST['ord'];

du har bare en dårlig navngivning af dine variable
Avatar billede olsensweb.dk Ekspert
25. januar 2017 - 15:41 #3
her er en fejl
overskrift like = ?'
Avatar billede olsensweb.dk Ekspert
25. januar 2017 - 15:49 #4
fra nogle gamle sql søtninger jeg havde liggende

Beskrivelse: henter fornavn, efternavn hvis efternavn er and
SELECT first_name, last_name FROM tbl_users WHERE last_name ='and'

Beskrivelse: henter fornavn, efternavn hvis efternavn starter med and
SELECT first_name, last_name FROM tbl_users WHERE last_name LIKE 'and%'

Beskrivelse: henter fornavn, efternavn hvis efternavn ender med and
SELECT first_name, last_name FROM tbl_users WHERE last_name LIKE '%and'

Beskrivelse: henter fornavn, efternavn hvis efternavn indeholder and
SELECT first_name, last_name FROM tbl_users WHERE last_name LIKE '%and%'
Avatar billede olsensweb.dk Ekspert
25. januar 2017 - 15:59 #5
så denne linje
if ($stmt = $con->prepare('SELECT `id`, `mainid`, `menunavn`, `overskrift`, `billede`, `tekst`, `sted`, `forfatter`, `datetime` FROM `tbl_oversigt` WHERE overskrift like = ?' )) {
må se sådan ud
if ($stmt = $con->prepare('SELECT `id`, `mainid`, `menunavn`, `overskrift`, `billede`, `tekst`, `sted`, `forfatter`, `datetime` FROM `tbl_oversigt` WHERE overskrift = ?' )) {



du burde også få en fejl i din sql, hvis det er slået til.
Avatar billede Morten Professor
25. januar 2017 - 19:35 #6
Hej Olsen

Det virker fint med WHERE overskrift = ? Men det viste jeg godt, men så kan jeg ikke bruge det som søgning, for så skal der være et navn med præcis den linje jeg vil skrive i mit søge felt.

Det var derfor jeg prøvede at få det til at virke med like.

Jeg er virkelig glad for dine svar, og dejligt du vil bruge noget tid til at hjælpe mig.

Med venlig hilsen
Morten
Avatar billede olsensweb.dk Ekspert
25. januar 2017 - 19:55 #7
det er LIKE du vil bruge
http://stackoverflow.com/questions/28385145/correct-way-to-use-like-var-with-prepared-statements-mysqli
http://stackoverflow.com/questions/18527659/php-mysqli-prepared-statement-like


ref http://www.computerworld.dk/eksperten/spm/924002?k=7686258
$letters = '%' . $input . '%';
$stmt -> bind_param('s', $letters);



din code burde se sådan ud:
(utested)

<form action="" method="post" id="soegeform">
    <input name="ord" type="text" id="ord">
    <input name="soeg" type="submit" id="soeg" value="S&oslash;g">
</form>


<?php
if (isset($_POST['soeg'])) {
    /* Sæt værdier på parametrene */
    $soegeord = '%' . $_POST['ord'] . '%';
   
    /* Soeg */
    if ($stmt = $con->prepare("SELECT `id`, `mainid`, `menunavn`, `overskrift`, `billede`, `tekst`, `sted`, `forfatter`, `datetime` FROM `tbl_oversigt` WHERE overskrift LIKE ?")) {
        /* Bind parametre */
        $stmt->bind_param('s', $soegeord);

        /* Eksekver forespørgslen */
        $stmt->execute();

        /* Bind resultatet */
        $stmt->bind_result($S_id, $S_mainid, $S_menunavn, $S_overskrift, $S_billede, $S_tekst, $S_sted, $S_forfatter, $S_datetime);

        while ($stmt->fetch()) {
            echo $S_overskrift;
        }
    } else {
        /* Der er opstået en fejl */
        echo 'Der opstod en fejl i erklæringen: ' . $con->error;
    }
}
?>

hvad med dit søgeord, må det være blankt ??
kunne der være tegn der ikke må være i søgeordet ??
Avatar billede Morten Professor
25. januar 2017 - 20:02 #8
Jamen for den da det virkede :o)

Det med den er blank og med tegn.
Det ved jeg ikke helt altså der hvor det vil være aktuelt i en side om fiske pladser tror jeg ikke der sker noget ved det.
Men er der noget jeg skal tage højde for?
Du kan se siden her www.fluefiskersiden.morticms.dk
Avatar billede Morten Professor
25. januar 2017 - 20:06 #9
Ja puuuha det kan jeg godt se det med blank det er lidt skidt så kommer det hele
Avatar billede olsensweb.dk Ekspert
25. januar 2017 - 20:13 #10
ved tom string, vil din like se sådan ud:
LIKE '%%'
så vil den jo vise alle poster

special tegn feks *#'" må de være der ??
du skal tænke over om det skal "vaskes" ud.
Avatar billede Morten Professor
25. januar 2017 - 20:18 #11
Ja jeg kan godt se hvad du mener det er jo ikke så godt er der noget man kan gøre der??
Evt. ved du hvor jeg kan finde ud af det?
Vil ikke bruge for meget af din tid på mig.
Selv om den hjælp du giver mig er til stor gavn, jeg lære en masse af det.
Avatar billede olsensweb.dk Ekspert
25. januar 2017 - 20:28 #12
du kunne overveje at teste på længden af det indtastede ord.
(utested)

<?php
if (isset($_POST['soeg'])) {
    /* Sæt værdier på parametrene */
    $word = $_POST['ord'];
    // her bør $word "kogevaskes", så evt ulovlige tegn fjernes


    if (strlen($word) > 0) {
        $soegeord = '%' . $word . '%';

        /* Soeg */
        if ($stmt = $con->prepare('SELECT `id`, `mainid`, `menunavn`, `overskrift`, `billede`, `tekst`, `sted`, `forfatter`, `datetime` FROM `tbl_oversigt` WHERE overskrift LIKE ?')) {
            /* Bind parametre */
            $stmt->bind_param('s', $soegeord);

            /* Eksekver forespørgslen */
            $stmt->execute();

            /* Bind resultatet */
            $stmt->bind_result($S_id, $S_mainid, $S_menunavn, $S_overskrift, $S_billede, $S_tekst, $S_sted, $S_forfatter, $S_datetime);

            while ($stmt->fetch()) {
                echo $S_overskrift;
            }
        } else {
            /* Der er opstået en fejl */
            echo 'Der opstod en fejl i erklæringen: ' . $con->error;
        }
    }
}
?>
Avatar billede Morten Professor
25. januar 2017 - 20:33 #13
Det virker perfekt :o)

1000 tak :o)

Du har altid kommet med de bedste løsninger og svar.
Avatar billede arne_v Ekspert
26. januar 2017 - 17:48 #14
Bemaerk at LIKE '%noget' bliver en meget langsom soegning naar database bliver meget stor.

MySQL har ligesom mange andre databaser en full text mulighed som er beregnet til den slags soegninger.
Avatar billede Morten Professor
26. januar 2017 - 20:02 #15
Hej arne_v

Hvordan vil du sidde det op, min far har rigtig mange fiskepladser han ligger på siden.
Og der bliver en del søgning ved jeg, da der er mange der leder efter et godt sted at fiske.
Avatar billede arne_v Ekspert
26. januar 2017 - 20:15 #16
Maaske skulle jeg ikke have brugt et saa upraecist udtryk som "naar database bliver meget stor". Det er ikke et problem med nogle faa hundrede raekker.  Men med nogle faa hundrede millioner raekker, saa ...
Avatar billede arne_v Ekspert
26. januar 2017 - 20:19 #17
Men der er masser af materiale omkring MySQL full text hvis du vil laese lidt om det.
Avatar billede Morten Professor
26. januar 2017 - 20:42 #18
ok rart at vide :o)

Jamen tak det vil jeg da lige lige få kigget på, da det vil gøre at jeg er lidt på forkant med det, når der nu er mulighed for at brug andre metoder.
Avatar billede olsensweb.dk Ekspert
26. januar 2017 - 21:19 #19
ref google mysql fulltext search query example   
https://dev.mysql.com/doc/refman/5.7/en/fulltext-natural-language.html

prøvede lige eks i phpmyadmin (bare for sjov)

CREATE TABLE `articles` (
  `id` int(10) UNSIGNED NOT NULL,
  `title` varchar(200) CHARACTER SET latin1 DEFAULT NULL,
  `body` text CHARACTER SET latin1
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_danish_ci;
INSERT INTO `articles` (`id`, `title`, `body`) VALUES
(1, 'MySQL Tutorial', 'DBMS stands for DataBase ...'),
(2, 'How To Use MySQL Well', 'After you went through a ...'),
(3, 'Optimizing MySQL', 'In this tutorial we will show ...'),
(4, '1001 MySQL Tricks', '1. Never run mysqld as root. 2. ...'),
(5, 'MySQL vs. YourSQL', 'In the following database comparison ...'),
(6, 'MySQL Security', 'When configured properly, MySQL ...');
ALTER TABLE `articles`
  ADD PRIMARY KEY (`id`);
ALTER TABLE `articles` ADD FULLTEXT KEY `title` (`title`,`body`);
ALTER TABLE `articles`
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=7;



// søger i kollonnerne title og body efter ordet 'database' // OK
SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('database' IN NATURAL LANGUAGE MODE)

// søger i kollonnerne title og body efter orderne 'database' eller 'tutorial' // OK
SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('database tutorial' IN NATURAL LANGUAGE MODE)

// søger i kollonnerne title og body efter orderne 'data' eller 'tut' // ingen resultater da orderne ikke findes, så man er afh brugeren skriver hele ordet
SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('data tut' IN NATURAL LANGUAGE MODE)
Avatar billede Morten Professor
26. januar 2017 - 21:36 #20
Ej hvor fedt det giver et godt overblik over hvad der forgår, mange tak, vil lige lege med det :o)
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