Avatar billede Six Nybegynder
06. juni 2006 - 21:51 Der er 10 kommentarer og
1 løsning

Ajax: Google suggest.

Hej eksperter.

Hvordan kan jeg med ajax lave noget ala google suggest?

Jeg skal have det til at lave opslag i en mysql database, med noget php.

Jeg har en database med vejnavne og havde så forestillet mig at når man skrev f.eks. de første 3 bogstaver af et vejnavn, så skulle den lave et opslag i databasen og vælge alle de vejnavne der begynder med de 3 bogstaver... - og igen, ved 4 bogstaver lave et nyt opslag.

Det jeg er mest bange for er at det kommer til at spatte helt af, hvis man skriver navnet for hurtigt. Så der skal vel være en form for "Afslut opslag af 3 bogstaver, hvis der er 4 bogstaver at søge efter nu" Jeg ved ikke lige ellers hvordan jeg skal forklare mig. Men håber der er nogle der kan komme med eksempler og hjælpe mig til en løsning af det. :D

På forhånd tak.
Avatar billede olebole Juniormester
06. juni 2006 - 22:10 #1
<ole>

Søg på Google - der er flere AJAX-libs, derude  ;o)

Derudover bør du ikke teste for hvert tegn - det gør Google-suggest heller ikke. Søg i stedet én gang i sekundet, hvilket performer bedre  :)

/mvh
</bole>
Avatar billede Six Nybegynder
06. juni 2006 - 22:18 #2
Hej ole :D - tak for din hurtige henvendelse. Tak for rådet, med at søge engang i sekundet.

Jeg har pt. dette ajax halløj, som næsten i teorien gør det jeg vil have. Det er et script der tjekker i min database for om username er i brug.

Html og javascript---------------------------------------

<style>
span.hidden{
  display: none;
}

span.error{
  display: inline;
  color: black;
  background-color: pink; 
}

</style>
<script type="text/javascript" language="javascript">

var req;
function processReqChange()
{
    // only if req shows "complete"
    if (req.readyState == 4) {
        // only if "OK"
        if (req.status == 200) {
            // ...processing statements go here...
            response  = req.responseXML.documentElement;
       
            method    = response.getElementsByTagName('method')[0].firstChild.data;

            result    = response.getElementsByTagName('result')[0].firstChild.data;
       
            eval(method + '(\'\', result)');
        } else {
            alert("There was a problem retrieving the XML data:\n" + req.statusText);
        }
    }
}
function loadXMLDoc(url)
{
    // branch for native XMLHttpRequest object
    if (window.XMLHttpRequest) {
        req = new XMLHttpRequest();
        req.onreadystatechange = processReqChange;
        req.open("GET", url, true);
        req.send(null);
    // branch for IE/Windows ActiveX version
    } else if (window.ActiveXObject) {
        req = new ActiveXObject("Microsoft.XMLHTTP");
        if (req) {
            req.onreadystatechange = processReqChange;
            req.open("GET", url, true);
            req.send();
        }
    }
}
function checkName(input, response)
{
  if (response != ''){
    // Response mode
    message  = document.getElementById('nameCheckFailed');
    if (response == 1){
      message.className = 'error';
    }else{
      message.className = 'hidden';
    }
  }else{
    // Input mode
    url  = 'CheckUserName.php?q=' + input;
    loadXMLDoc(url);
  }

}

</script>

<input id="username" name="username" type="text" onblur="checkName(this.value,'')" />
<br />
<span class="hidden" id="nameCheckFailed">
  This name is in use, please try another.
</span>

PHP delen----------------------------------------


<?php
header('Content-Type: text/xml');

/*function nameInUse($q)

  if (isset($q)){
    switch(strtolower($q))
    {
      case  'drew' :
          return '1';
          break;
      case  'fred' :
          return '1';
          break;
      default:
          return '0';
    }
  }else{
    return '0';
  }
 
}*/

$mysql_host = "localhost";
$mysql_user = "livret";
$mysql_password = "ryan";
mysql_connect($mysql_host,$mysql_user,$mysql_password);
mysql_select_db("livretten");
function nameInUse($q){
    if (isset($q)){
        $r = mysql_fetch_row( mysql_query("SELECT * FROM `xmltest` WHERE navn LIKE '$q'"));
        if ($r == (false))  {
            return '0';
        } else {
            return '1';
        }

    };
};
?>
<?php echo '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>'; ?>
<response>
  <method>checkName</method>
  <result><?php
    echo nameInUse($_GET['q']) ?>
  </result>
</response>
-------------------------------------------

Jeg skal vel i bund og grund bare have rettet sqlstrengen til, og så have javascript til at køre den funktion der tjekker i db'en, 1 gang i sekundet?

eller er jeg helt ude hvor jeg ikke kan bunde?

(Ja der er jo selvfølge alle smårettelserne, for at det kører. Men det skulle jeg da kunne klare hehe.)
Avatar billede jokkejensen Novice
06. juni 2006 - 23:58 #3
http://developer.yahoo.com/ypatterns/parent.php?pattern=transition

Ude i menuen er der en der hedder "auto completion" <-

Yahoo har lavet et fedt JS framework !!
Avatar billede jokkejensen Novice
07. juni 2006 - 00:00 #4
Avatar billede olebole Juniormester
07. juni 2006 - 00:21 #5
Nuvel ... den sidste kan vist kun irritere en bruger. Et rigtig godt eksempel på elendig/misforstået brug af AJAX. Hvem i alverden kan dog finde på, man skal downloade kilometervis af JavaScripts - blot for at lave en AJAX-autocomplete?

Sorry, jokkejensen - men det JS-lib (og hvad der skal til at bruge det) sutter BIG TIME! Det er der _absolut_ intet fedt ved ... bortset fra, det er et fedt eksempel på rigtig ufed kode  :)
Avatar billede Six Nybegynder
07. juni 2006 - 10:20 #6
Hej jokke, tak for dit indslag :D - det ser også ud til at kunne bruges, men jeg vil nu lige kigge:
http://www.phpriot.com/d/articles/php/application-design/google-suggest-ajaxac/ - igennem først, når jeg har tid til det i aften.

Jeg forsøgte selv at ændre den kode jeg pastede igår, men det blev noget værre rod og den måde jeg ville gøre det på kan ikke lade sig gøre, eftersom php bliver kørt før javascripten. :(
Avatar billede Six Nybegynder
27. juni 2006 - 11:18 #7
Det var da vidst en smutter det her. Det må i undskylde gutter. Vær venlig at lægge et svar, så jeg kan få lukket spørgsmålet :D - Tak for jeres hjælp og ledetråde :D
Avatar billede jokkejensen Novice
30. juni 2006 - 21:49 #8
Hey ole - ja det kan godt være det sutter bigtime..

MEn hos os ligger en typisk timeløn på omkring de 1000kr + moms..

Tror kunden er 1000000% ligeglad med om JS sutter eller ej, de ønsker hurtige resultater der virker....

Så hvorfor ikke bruge det ? - jeg vil nu heller ikke sige yahoo's udviklerer laver lort - så mener du vel også atlas.net er noget pis ?
Avatar billede jokkejensen Novice
30. juni 2006 - 21:50 #9
for ikke at tale om det elendige markup asp.net's controller generere... så skal vi måske alle gå tilbage til asp/php og skrive vores eget ?
Avatar billede Six Nybegynder
06. juli 2006 - 17:33 #10
Jeg lukker spørgsmålet nu. :D - hvis i vil have point for det, så smid en comment og jeg skal gerne oprette en pointtråd til jer.
Avatar billede Six Nybegynder
06. juli 2006 - 17:33 #11
Og mange gange tak for hjælpen :D
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

IT-JOB