15. marts 2012 - 22:59Der er
37 kommentarer og 1 løsning
Løber panden imod, så ser frem til ...
..at en behjertet sjæl lige hjælper mig videre. Måske min ubehjælpelige kode allerede beskriver hvad jeg vil, men ellers:
Når jeg indtaster tlf, skal det tjekkes om det er et korrekt nr (det har jeg styr på, derfor det afstumpede tjek). derefter skal der tjekkes i min lille tabel "data" om jeg allerede kender personen. Hvis ja skrives navnet i navnefeltet, ellers skal hun bede om det (fx. skrive "be om" ved siden af feltet).
jeg ville nok kigge på AJAX jstest skulle så via ajax kalde serveren med value som parameter, og få svaret retur feks 0 hvis nummeret ikke er kendt og 1 hvis nummeret er kendt, så er det "bare" i js gøre noget med det svar
function GetAjaxData(Val){ var url = "request.php"; var params = "id="+Val;
http = new XMLHttpRequest(); http.open("POST", url, true); //Send the proper header information along with the request http.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); http.setRequestHeader("Content-length", params.length); http.setRequestHeader("Connection", "close"); http.send(params); http.onreadystatechange = function() {//Call a function when the state changes. if(http.readyState == 4 && http.status == 200) { // her sker alt det sjove :) var values = JSON.parse(http.responseText); var lng = values.length; if (lng > 0){ alert("nummeret kendt"); document.jette.navn.value = values; } else{ alert("nummeret ukendt, du skal indtaste flerer data"); } } } } </script> </head> <body> <form name="jette" action="#" > Tlf: <input type="text" name="tlf" onblur="jstest(this.value);"> Navn: <input type="text" name="navn"> </form> </body> </html>
request.php
<?php $id = $_POST['id']; $navn =""; $sql_navn="SELECT navn FROM data WHERE tlf=$id"; $rs = mysql_query($sql_navn); if($rs){ $row = mysql_fetch_assoc($rs); $name = $row['navn']; } echo json_encode($navn); ?>
her retunerer jeg bare et navn, og hvis det er blankt er brugeren ukendt
nb du bør nok overveje at bruge mysqli istedet for den gamle mysql API, læs feks olebole's guide om mysqli Prepared Statements under MySQLI - kom igang, også selvom du ikke anvender Prepared Statements bør du anvende mysqli, om ikke andet for at vende dig til det, kunne jo også være du ville bruge oop tilgangen som er i mysqli
1) jo den kan godt lide æøå, men det kræver du kører UTF-8, ajax understøtter ikke andre, så kør UTF-8 hele vejen rundt så får du ikke problemer en nød løsning på dit nuværende problem, hvis det ikke er nok bare at angive et mysql_set_charset('utf8',$conn); i din db connection $navn = $row['navn']; laves om til $navn = utf8_encode($row['navn']);
men det er kun en nødløsning, "det svare til at pisse i bukserne, det varmer kortvarigt", få styr på dit tegnsæt istedet, dvs * dine sider skal værer encodet med UTF-8 * din side skal værer gemt som UTF-8 uden BOM * dit meta tag på siden skal være <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> * dine data i db skal være i UTF-8 * din DB skal levere data i UTF-8 format
2) havde ikke tested med db, så bliver navn jo NULL :( prøv dette
<?php include "db_conn.php"; $id = $_POST['id']; $navn =""; $sql_navn="SELECT navn FROM data WHERE tlf=$id"; $rs = mysql_query($sql_navn); if($rs){ $row = mysql_fetch_assoc($rs); $navn = $row['navn']; } if(strlen($navn)==0)$navn =""; echo json_encode($navn); ?>
db_conn.php
<?php $conn = mysql_connect ("localhost", "root", "", true); if (! $conn ) die( 'Could not connect: ' . mysql_error ()); mysql_select_db("test") or die('Could not select database '); mysql_set_charset('utf8',$conn); ?>
test db
CREATE TABLE IF NOT EXISTS `data` ( `tlf` int(11) NOT NULL, `navn` text COLLATE utf8_danish_ci NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_danish_ci; INSERT INTO `data` (`tlf`, `navn`) VALUES (123, 'Palle Gulvballe'), (456, 'Åse æøå'), (789, 'Calle5463'), (963, 'RonOls');
RonOls: Damn! Jeg er vist kommet i menneskehænder.
Nødløsninger er nødløsninger og på sigt dur det ikke - så dem undgår jeg helst.
Data i min tabel er INT(11) og utf8_danish_ci (var latin1_danish_ci). Den ligger hos one.com. De oplyser "MySQL Tegnsæt: UTF-8 Unicode (utf8)"
Om mine sider er encodet med UTF-8 og gemt som UTF-8 uden BOM er jeg har jeg pt ingen anelse om.
Det virkede i første forsøg undtagen på tabel-linier med æøå i navn - nu virker det slet ikke (dvs. jeg er udfordret lidt lige nu)
Når jeg har flg. meta-tag: <meta http-equiv="content-type" content="text/html; charset=utf-8"/> viser den firkanter i stedet for æøå - så her har jeg klart en udfordring.
hvis man viser din side i FireFox, får man kun firkanter istedet for æøå årsagen er du mangler at angive et charset <meta http-equiv="content-type" content="text/html; ISO-8859-1"/> så burde det virke i FF også
så kortvarigt du forsøgte dig med <meta http-equiv="content-type" content="text/html; charset=utf-8"/> som du bør, og der viser den også forkert æøå
den sætter tilsyneladende Collation til latin1_danish_ci. Så skal jeg "bare" have det andet til at virke på samme måde.
Jeg kan ikke helt forstå det du skriver om min hjemmeside - når jeg ser på den, viser den nydeligt æøå i både IE9 og FF. Men jeg har klart behov for at få valideret siderne inden længe, så måske jeg skulle bede om hjælp til det her på eksperten på et tidspunkt.
Sommetider er det godt at kunne påberåbe sig uvidenhed - man er ikke forpligtet udover evner. Og lige nu har jeg ikke overblik nok til at finde fejlen - jeg kan ikke i detaljer forstå hvad ajax'en laver. Er stadig lidt usikker på om data i min tabel kan bruges, men her virker det - får en liste med både æ, ø og å:
function GetAjaxData(Val){ var url = "request.php"; var params = "id="+Val;
http = new XMLHttpRequest(); http.open("POST", url, true); //Send the proper header information along with the request http.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); http.setRequestHeader("Content-length", params.length); http.setRequestHeader("Connection", "close"); http.send(params); http.onreadystatechange = function() {//Call a function when the state changes. if(http.readyState == 4 && http.status == 200) { // her sker alt det sjove :) var values = JSON.parse(http.responseText); var lng = values.length; if (lng > 0){ alert("nummeret kendt"); document.jette.navn.value = values; // OK } else { alert("nummeret ukendt, du skal indtaste flerer data"); } } } } </script> </head> <body> <form name="jette" action="#" > Tlf: <input type="text" name="nr" onblur="jstest(this.value);"> Navn: <input type="text" name="navn"> </form> </body> </html>
// Er nedenstånede korrekt - hvordan gøres det i GetAjaxData()? // Det må kunne gøres mere effektivt - men først skal det her virke // echo json_encode($adresse1); // echo json_encode($adresse2); // echo json_encode($postnr); // echo json_encode($by); // echo json_encode($firma); // echo json_encode($cvr); // echo json_encode($tlf); // echo json_encode($mob); // echo json_encode($email); // echo json_encode($www);
#9 Jeg kan ikke helt forstå det du skriver om min hjemmeside min browser var fucked up :(, var nød til at lave en ny brugerprofil på maskinen, så virker den igen
det nemmeste vil værer at overfører et Associative array, jeg har her brugt et array af Associative array, hvis man på et tidspunkt vil retunerer flere kunder samtidig jeg har ikke taget alle felterne med i min test, men du kan se princippet.
for at overfører speciel tegn med AJAX feks æøå skal de værer UTF-8 incodet, du kan så decode disse clientside med utf8_decode så de bliver iso
men prøv at få det til at virke på din lokale maskine først, og så kan du ligge det op på one.com, og evt slås med dem vedr. tegnsæt
lidt hurtigt lavet request.php
<?php include "db_conn.php"; $id = $_POST['id']; $info=array(); // $sql_navn="SELECT kNr, kNavn, kAdresse1, kAdresse2, kPostnr, kBy, kFirma, kCVR, kTlf, kMob, kEmail, kWWW FROM Kunde WHERE kNr=$id"; $sql_navn="SELECT kNr, kNavn, kPostnr, kBy FROM Kunde WHERE kNr=$id"; $rs = mysql_query($sql_navn); while($row = mysql_fetch_assoc($rs)){ $info[]=array("Navn"=>$row['kNavn'], "Postnr"=>$row['kPostnr'], "Bynavn"=>$row['kBy']); } echo json_encode($info); ?>
function GetAjaxData(Val){ var url = "request.php"; var params = "id="+Val;
http = new XMLHttpRequest(); http.open("POST", url, true); //Send the proper header information along with the request http.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); http.setRequestHeader("Content-length", params.length); http.setRequestHeader("Connection", "close"); http.send(params); http.onreadystatechange = function() {//Call a function when the state changes. if(http.readyState == 4 && http.status == 200) { // her sker alt det sjove :) var values = JSON.parse(http.responseText); var lng = values.length; if (lng > 0){ // hvis der havde været flere poster skulle der være en for løkke her // for (var j=0,i=lng; j<i; j++) { alert("nummeret kendt"); document.jette.postnummer.value = values[0]['Postnr']; // values[j]['Postnr']; document.jette.bynavn.value = values[0]['Bynavn']; document.jette.navn.value = values[0]['Navn']; //} } else{ alert("nummeret ukendt, du skal indtaste flerer data"); } } } }
test data
CREATE TABLE IF NOT EXISTS `kunde` ( `kNr` int(11) NOT NULL, `kNavn` text COLLATE utf8_danish_ci NOT NULL, `kPostnr` int(4) NOT NULL, `kBy` text COLLATE utf8_danish_ci NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_danish_ci;
2 som jquery ( index_jq.html ) hvis du på sigt vil bruge jquery, du skal dog være opmærksom at jquery fylder 100K, så lige nu er det meget overhead for så lidt.
#15 læg index1.html op på din side så jeg kan se den, du må have lavet en fejl i den for den virker hos mig vi burde kunne udelukke fejlen ligger i request.php da index_jq.html virker, og de anvender jo samme request.php.
#17 ja det er da klart, at der skal laves 2 felter mere, det regnede jeg med du havde lavet. (havde regnet med du tog filen fra kunder.zip som jeg lavede i #11) men fik de løst dit problem med æøå ??
hurtigt gennemset og ikke tested index1.html vs index_jq.html: du skriver index_jq virker og der anvender du request_kundedata.php som request fil men i index1 anvender du request.php er request_kundedata.php og request.php ens ?? det skal de være så prøv at ændre request.php til request_kundedata.php i index1.html
i index.html bruger du request.php peger den på den rigtige db ??
nb: xkundeliste og xsagsliste kan jeg ikke bruge til ret meget, så skal jeg selv lave hele db alligevel for at teste, skulle det være noget skulle det være et sql udtræk
men jeg glæder mig da over du på udtrækket med jquery får æøå med :)
- har læst dine forslag igennem igen, men er desværre ikke skarp nok til at kunne gennemskue, så selv stavefejl/stort/lille bogstav kan drille mig - jeg forsøger men må beklage (prøver selvfølgelig igen)
men i index.html, bør man nok slette indholdet af adresse1, postnummer, bynavn hvis nummeret er ukendt, ellers står der jo stadig data fra den tidligere post utested
- underligt. Nu har ovenstående ajax-løsning fungeret et stykke tid, og pludselig virker det ikke mere: 'JSON' er ikke defineret. Jeg har tilføjet et script - kollidere de?
function toggleButtons(caller) { if (formOldValues[caller.name] != caller.value) { var myButtons = document.getElementById("FormButtons"); myButtons.style.display = ""; } }
function enableValidation() { var myForm = document.getElementById("jette"); var fieldTypes = ["input", "textarea"];
for (var i=0,j=fieldTypes.length; i<j; i++) { var fields = myForm.getElementsByTagName(fieldTypes[i]); for (var m=0,n=fields.length; m<n; m++) { var field = fields.item(m); if (field.className.indexOf("NoValidate") < 0) { field.onchange = toggleButtons; } } } }
function toggleButtons(caller) { if (this.defaultValue != this.value) { var myButtons = document.getElementById("FormButtons"); myButtons.style.display = ""; } }
ved 4 ukendt sag document.jette.kNavn.value = ""; feltet ikke findes, samt den mangler at slette indholdet af de resterende felter, det sidste kan værer en følgefejl af at document.jette.kNavn.value ikke findes, (js stopper med at kører scriptet)
FF blanker felterne hos mig (Eyeopener) Iøvrigt kan jeg bedre lide FF's "skarpere" visning. Shit - jeg havde ændret på kompatibilitetsvisning i IE - nu virker det
Synes godt om
Ny brugerNybegynder
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.