Javascript/Ajax und Daten aus Db lesen

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Javascript/Ajax und Daten aus Db lesen

    Hallo

    ich habe ein Js mit mehreren Funktionen die Funktonen bekommen zb auch die ID eines users. Jetzt will ich die Id nutzen und sachen aus der DB auslesen und zurrück geben und mit der Var werte zb werte[1] dann die ID erscheinen. Hoffentlich kann mir jemand helfen.

    Javascript:

    Quellcode

    1. getUserNodeString: function(userID, userName, userRole) {
    2. if(this.userNodeString && userID == this.userID) {
    3. return this.userNodeString;
    4. } else {
    5. /////////////////////////////////
    6. ////////////////////////////////
    7. try{
    8. req = new XMLHttpRequest();
    9. }catch (ms){
    10. try{
    11. req = new ActiveXObject("Msxml2.XMLHTTP");
    12. }catch (nonms){
    13. try{
    14. req = new ActiveXObject("Microsoft.XMLHTTP");
    15. }catch (failed){
    16. req = null;
    17. }
    18. }
    19. }
    20. req.onreadystatechange = getUserNodeStringCallback;
    21. req.open("GET",'user_data.php?userid='+userID, true);
    22. req.send(null);
    23. //////////////////////////////
    24. /////////////////////////
    25. if(userID == this.userID) {
    26. this.userNodeString = getUserNodeStringCallback();
    27. }
    28. return getUserNodeStringCallback();
    29. }
    30. },
    31. getUserNodeStringCallback: function() {
    32. var erg = req.responseText;
    33. var dd = erg.substr(0,erg.indexOf(" "));
    34. erg = erg.substr(erg.indexOf(" ") + 1).split("|");
    35. for each(var i in erg) {
    36. if(i != "") {
    37. var werte = i.split("#");
    38. var moz = 1;
    39. var encodedUserName = this.scriptLinkEncode(userName);
    40. var str = '<div id="'
    41. + this.getUserDocumentID(userID)
    42. + '"><a href="javascript:ajaxChat.toggleUserMenu(\''
    43. + this.getUserMenuDocumentID(userID)
    44. + '\', \''
    45. + encodedUserName
    46. + '\', '
    47. + userID
    48. + ');" class="'
    49. + this.getRoleClass(userRole)
    50. + '" title="'
    51. + this.lang['toggleUserMenu'].replace(/%s/, userName)
    52. + '">'
    53. + userName
    54. + werte[1] + // test
    55. + '</a>'
    56. + '<ul class="userMenu" id="'
    57. + this.getUserMenuDocumentID(userID)
    58. + '"'
    59. + ((userID == this.userID) ?
    60. '>'+this.getUserNodeStringItems(encodedUserName, userID, false) :
    61. ' style="display:none;">')
    62. + '</ul>'
    63. +'</div>';
    64. return str;
    65. },
    Alles anzeigen


    Die PHP datei:

    Quellcode

    1. <?php
    2. ob_start();
    3. session_start();
    4. @include("sql.php")
    5. $sql = 'SELECT * FROM `users` WHERE `id` = ' . mysql_escape_string($_GET["userid"]);
    6. $ergb = mysql_fetch_object(mysql_query($sql));
    7. $ausg .= htmlentities($ergb->username) . "#" . $ergb->id ;
    8. echo $ausg;
    9. mysql_close();
    10. ?>
    Alles anzeigen
  • Quellcode

    1. $sql = 'SELECT * FROM `users` WHERE `id` = ' . mysql_escape_string($_GET["userid"]);

    Das ist gut gemeint, aber leider absolut ineffektiv gegen SQL Injections.
    Beispiel:

    Quellcode

    1. $_GET['userid'] = "1 OR password = 1234"


    Wenn du Zahlen erwartest, musst du floatval oder intval anwenden. escape_string schützt deinen String nur vor dem Ausbruch aus den Anführungszeichen.

    Ansonsten verstehe ich bei deiner Frage nicht ganz das Problem? Woran hängts denn?
    Du kannst beliebige viele Variablen via AJAX übergeben... ajax.php?userid=1&werte[1]=foo&werte[2]=laa
  • ok das gut zu wissen mit der Sicherheit =) danke dafür erstma ^^

    Also ich habe die Funktion getUserNodeString: function(userID, userName, userRole) {}
    Dort bekomme ich ja die ID des Users, die möchte ich nun nutzen, übergeben und weitere Daten vom User die in der DB gespeichert sind abrufen und zurrück in die Funktion geben um sie dort zu nutzen. Aber irgendwas muss ich falsch machen und ich weis nicht was
  • du machst aber ziemlich viel Logik clientseitig.
    Dass das nicht sicher ist, weißt du auch, oder? Jeder kann die userdaten also abfragen.

    Im folgenden Konstruct rufst die die Callback Funktion 1x asynchron und 2x direkt auf.
    Das funktioniert auf jeden Fall nicht.

    Quellcode

    1. req.onreadystatechange = getUserNodeStringCallback;
    2. req.open("GET",'user_data.php?userid='+userID, true);
    3. req.send(null);
    4. if(userID == this.userID) {
    5. this.userNodeString = getUserNodeStringCallback();
    6. }
    7. return getUserNodeStringCallback();
  • Hm ok bin kein Profi daher wäre es gut wenn man mir bisschen Helfen kann, beispiele zeigt und natürlich auch sagt wie und warum.
    Soweit funktioniert das ansich ja auch (Das orginal ohne meine bearbeitung siehe unten im Code) die daten die ich bekomme werden mir ausgegeben (ist für eine Online anzeige im Chat) alles wunderbar.
    Nun bekomme ich ja mit der Funktion die ID des Users, die id will ich haben damit ich sachen aus der Db lese diese zurrück in die Funktion gebe und sie mit einbaun kann um sie am ende auszugeben.

    also das orginal ist:

    Quellcode

    1. getUserNodeString: function(userID, userName, userRole) {
    2. if(this.userNodeString && userID == this.userID) {
    3. return this.userNodeString;
    4. } else {
    5. var encodedUserName = this.scriptLinkEncode(userName);
    6. var str = '<div id="'
    7. + this.getUserDocumentID(userID)
    8. + '"><a href="javascript:ajaxChat.toggleUserMenu(\''
    9. + this.getUserMenuDocumentID(userID)
    10. + '\', \''
    11. + encodedUserName
    12. + '\', '
    13. + userID
    14. + ');" class="'
    15. + this.getRoleClass(userRole)
    16. + '" title="'
    17. + this.lang['toggleUserMenu'].replace(/%s/, userName)
    18. + '">'
    19. + userName
    20. /*
    21. + ' <img src="'
    22. + this.dirs['sonstige']
    23. + this.sonstigeFiles[1]
    24. + '" alt="'
    25. + this.sonstigeFiles[1]
    26. + '" title="'
    27. + this.sonstigeFiles[1]
    28. + '"/>'
    29. */
    30. + '</a>'
    31. + '<ul class="userMenu" id="'
    32. + this.getUserMenuDocumentID(userID)
    33. + '"'
    34. + ((userID == this.userID) ?
    35. '>'+this.getUserNodeStringItems(encodedUserName, userID, false) :
    36. ' style="display:none;">')
    37. + '</ul>'
    38. +'</div>';
    39. if(userID == this.userID) {
    40. this.userNodeString = str;
    41. }
    42. return str;
    43. }
    44. },
    Alles anzeigen


    weis net wie ich meine daten aus der Db nun mit dadrine verarbeiten kann.
  • was willst du denn nun wissen? Wenn du die Logik weiter clientseitig machen willst, dann musst du nur den AJAX Aufruf nochmal sauber machen.
    In deiner PHP Datei gibst du das Array dann via json zurück.

    Quellcode

    1. echo json_encode($row);


    und in deiner PHP Callback Datei kannst du dann darauf zugreifen:

    Quellcode

    1. var data = eval('(' + req-responseText+ ')');
    2. alert(data.username);
    3. alert(data.id);


    Bei einem kompletten Rewrite solltest du versuchen auf MVC zu setzen und nur die Session des eingeloggten Users zwischen Client und Server auszutauschen. Aber das Thema ist zu groß für einen Beitrag ;)
  • Hm also ich brauch wirklich sehr viel Hilfe, es klappt einfach nicht...

    Ich habe hier den orginal Code (nicht von mir)

    Quellcode

    1. getUserNodeString: function(userID, userName, userRole) {
    2. if(this.userNodeString && userID == this.userID) {
    3. return this.userNodeString;
    4. } else {
    5. var encodedUserName = this.scriptLinkEncode(userName);
    6. var str = '<div id="'
    7. + this.getUserDocumentID(userID)
    8. + '"><a href="javascript:ajaxChat.toggleUserMenu(\''
    9. + this.getUserMenuDocumentID(userID)
    10. + '\', \''
    11. + encodedUserName
    12. + '\', '
    13. + userID
    14. + ');" class="'
    15. + this.getRoleClass(userRole)
    16. + '" title="'
    17. + this.lang['toggleUserMenu'].replace(/%s/, userName)
    18. + '">'
    19. + userName
    20. + '</a>'
    21. + '<ul class="userMenu" id="'
    22. + this.getUserMenuDocumentID(userID)
    23. + '"'
    24. + ((userID == this.userID) ?
    25. '>'+this.getUserNodeStringItems(encodedUserName, userID, false) :
    26. ' style="display:none;">')
    27. + '</ul>'
    28. +'</div>';
    29. if(userID == this.userID) {
    30. this.userNodeString = str;
    31. }
    32. return str;
    33. }
    34. },
    Alles anzeigen


    wie mache ich nun die Abfrage & Baue alles richtig ein... ich komme einfach net mehr weiter verstehe nur noch bahnhof =(

    Habe es so versucht:

    Quellcode

    1. getUserNodeString: function(userID, userName, userRole) {
    2. if(this.userNodeString && userID == this.userID) {
    3. return this.userNodeString;
    4. } else {
    5. ///////////////////////////////////////////////////
    6. //////////////////////////////////////////////////
    7. /////////////////////////////////////////////////
    8. var req = null;
    9. try{
    10. req = new XMLHttpRequest();
    11. }catch (ms){
    12. try{
    13. req = new ActiveXObject("Msxml2.XMLHTTP");
    14. }catch (nonms){
    15. try{
    16. req = new ActiveXObject("Microsoft.XMLHTTP");
    17. }catch (failed){
    18. req = null;
    19. }
    20. }
    21. }
    22. req.open("POST",'user_data.php?userid='+userID, true);
    23. req.onreadystatechange = function(){
    24. ///////////////////////////////////////////////////
    25. ///////////////////////////////////////////////////
    26. ///////////////////////////////////////////////////
    27. var data = eval('(' + req.responseText+ ')');
    28. var encodedUserName = this.scriptLinkEncode(userName);
    29. var str = '<div id="'
    30. + this.getUserDocumentID(userID)
    31. + '"><a href="javascript:ajaxChat.toggleUserMenu(\''
    32. + this.getUserMenuDocumentID(userID)
    33. + '\', \''
    34. + encodedUserName
    35. + '\', '
    36. + userID
    37. + ');" class="'
    38. + this.getRoleClass(userRole)
    39. + '" title="'
    40. + this.lang['toggleUserMenu'].replace(/%s/, userName)
    41. + '">'
    42. + userName
    43. + '</a>'
    44. + '<ul class="userMenu" id="'
    45. + this.getUserMenuDocumentID(userID)
    46. + '"'
    47. + ((userID == this.userID) ?
    48. '>'+this.getUserNodeStringItems(encodedUserName, userID, false) :
    49. ' style="display:none;">')
    50. + '</ul>'
    51. +'</div>';
    52. if(userID == this.userID) {
    53. this.userNodeString = str;
    54. }
    55. return str;
    56. }
    57. }
    58. },
    Alles anzeigen


    Aber auch dies geht nicht er zeigt mir in der onlineliste dann nur undefine an...
  • Ich empfehle die an dieser Stelle noch ein bisschen die Wiki Seiten für AJAX und auch für Objektorientierung zu studieren.

    Also
    * AJAX nutzt 4 HTTP Ready States, dein Callback darf nur in State 4 ausgeführt werden
    * Du hast einfach den Code deiner Klasse in den Callback gesteckt, der Callback hat bei "this" aber nicht mehr die Klassenreferenz, sondern den AJAX Callback.
    * Stattdessen sollte deine Anzeigelogik weiterhin in der Klasse bleiben und nur von der Callback Methode aufgerufen werden
    * Um von der Callback Methode auf die Klasse zu kommen, benutzt du entweder den Namen der Instanz (wenn es nur eine gibt)
    * Schöner ist es jedoch eine Closure zu nutzen, die this als Objektreferenz übergibt und damit als benannten Parameter verfügbar macht

    Hier nun also nochmal der komplette Code:

    Quellcode

    1. function Easy() {
    2. this.setUserData = function(data) {
    3. document.getElementById('user-username').innerHTML = data.username;
    4. document.getElementById('user-age').innerHTML = data.age;
    5. };
    6. this.getUserNodeString = function(userID, userName, userRole) {
    7. ajaxPost('user_data.php?userid='+userID, null, function(ref) {
    8. return function() {
    9. var data = eval('(' + this.responseText+ ')');
    10. ref.setUserData(data);
    11. }
    12. }(this));
    13. };
    14. }
    Alles anzeigen


    Bitte bearbeite deine Postings bitte nochmal und füge überall die syntax Tags für JavaScript ein.
    Die ajaxPost Methode findest du wie oben geschildert unter easy-coding.de/wiki/html-ajax-…x-und-ohne.html#headline7
  • Also ich habs nun das es funktioniert, nun noch eine frage, ich lese das geschlecht aus und möchte ein images wieder geben (Zeile 31). wenn ich in die variable "geschlecht_anzeige" nur Frau reinschreibe zeigt er es mir an sobald ich aber ein Bild einbinden will wird das nicht angezeigt warum?

    Funktionierender code

    Quellcode

    1. getUserNodeString: function(userID, userName, userRole) {
    2. if(this.userNodeString && userID == this.userID) {
    3. return this.userNodeString;
    4. } else {
    5. var encodedUserName = this.scriptLinkEncode(userName);
    6. // ajax-aufruf starten ...
    7. var req = null;
    8. try{
    9. req = new XMLHttpRequest();
    10. }catch (ms){
    11. try{
    12. req = new ActiveXObject("Msxml2.XMLHTTP");
    13. } catch (nonms){
    14. try{
    15. req = new ActiveXObject("Microsoft.XMLHTTP");
    16. } catch (failed){
    17. req = null;
    18. }
    19. }
    20. }
    21. req.open("POST", 'load_separate_data.php', true);
    22. req.onreadystatechange = function(){
    23. switch(req.readyState) {
    24. case 4:
    25. if(req.status==200) {
    26. var response = req.responseText;
    27. var werte = response.split("|");
    28. var geschlecht_anzeige = "";
    29. if(werte[1]=='man'){
    30. geschlecht_anzeige += "<img src=\"man.png\" border=\"0\" width=\"17\" height=\"17\">"; // DAS FUNKTIONIERT NICHT
    31. }else{
    32. geschlecht_anzeige += "FRAU"; // DAS FUNKTIONIERT
    33. }
    34. document.getElementById("geschlecht_" + werte[0]).innerHTML = geschlecht_anzeige;
    35. }
    36. break;
    37. default:
    38. return false;
    39. break;
    40. }
    41. }
    42. req.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
    43. req.overrideMimeType("text/plain; charset=ISO-8859-1"); //nötig zur korrekten umlaut- und sonderzeichen-darstellung
    44. req.send("docId="+this.getUserDocumentID(userID)+"&menId="+this.getUserMenuDocumentID(userID)+"&uid="+userID);
    45. var str = '<div id="'
    46. + this.getUserDocumentID(userID)
    47. + '"><a href="javascript:ajaxChat.toggleUserMenu(\''
    48. + this.getUserMenuDocumentID(userID)
    49. + '\', \''
    50. + encodedUserName
    51. + '\', '
    52. + userID
    53. + ');" class="'
    54. + this.getRoleClass(userRole)
    55. + '" title="'
    56. + this.lang['toggleUserMenu'].replace(/%s/, userName)
    57. + '">'
    58. + userName // ok kurz testen?
    59. + '<span id="geschlecht_' + userID + '">-</span>' // würde dann nach dem aufruf von dem script oben angesteuert werden.
    60. + '</a>'
    61. + '<ul class="userMenu" id="'
    62. + this.getUserMenuDocumentID(userID)
    63. + '"'
    64. + ((userID == this.userID) ?
    65. '>'+this.getUserNodeStringItems(encodedUserName, userID, false) :
    66. ' style="display:none;">')
    67. + '</ul>'
    68. +'</div>'; // wo würde das geschlecht stehen?
    69. if(userID == this.userID) {
    70. this.userNodeString = str;
    71. }
    72. return str;
    73. }
    74. },
    Alles anzeigen