Sveno: PHP Code mit AJAX aufrufen/ausführen

Hallo zusammen,

ich möchte mit einem onclick-Event einen Datenbankeintrag tätigen.
Der DB Eintrag wird über ein PHP-Code ausgeführt der funktioniert wenn ich die PHP-Datei im Browser aufrufe.

Ich scheitere nun daran die PHP-Datei mit Ajax auszuführen. Hier mal mein bisheriger Code

  
echo'<script type="text/javascript">  
     <!--  
		function hideAnnouncement() {  
			document.getElementById("announcement").style.display = "none";  
  
		var xmlhttp;  
		if (window.XMLHttpRequest)  {  
			// code for IE7+, Firefox, Chrome, Opera, Safari  
		  	xmlhttp=new XMLHttpRequest();  
		}  
		else  {  
			// code for IE6, IE5  
		  	xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");  
		}  
		xmlhttp.onreadystatechange=function() {  
		  	if (xmlhttp.readyState==4 && xmlhttp.status==200){  
		    	document.getElementById("myDiv").innerHTML=xmlhttp.responseText;  
		    }  
		}  
		xmlhttp.open("GET","test.php",true);  
		xmlhttp.send();  
		}			  
     //-->  
	 </script>';  
echo '<div id="announcement">'.$ua['text'].'<div id="close_announcement" onclick="hideAnnouncement();">X</div></div>';

Den Code hab ich bei google gefunden, aber es funktioniert leider nicht.
Über Hilfe wäre ich sehr dankbar :)

MfG Sven

  1. Es tut mir leid... ich Dusel hab vergessen das ich in der Datei die ich aufrufe meine Verbindungsdaten für die DB neu zu includen -.-

    Es geht also... sorry für den Spam

  2. Hallo,

    ich möchte mit einem onclick-Event einen Datenbankeintrag tätigen.
    Der DB Eintrag wird über ein PHP-Code ausgeführt der funktioniert wenn ich die PHP-Datei im Browser aufrufe.

    dann ist also die Server-Seite schon mal prinzipiell funktionstüchtig.

      function hideAnnouncement() {  
      	document.getElementById("announcement").style.display = "none";  
    
      var xmlhttp;  
      if (window.XMLHttpRequest)  {  
      	// code for IE7+, Firefox, Chrome, Opera, Safari  
        	xmlhttp=new XMLHttpRequest();  
      }  
      else  {  
      	// code for IE6, IE5  
        	xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");  
      }  
      xmlhttp.onreadystatechange=function() {  
        	if (xmlhttp.readyState==4 && xmlhttp.status==200){  
          	document.getElementById("myDiv").innerHTML=xmlhttp.responseText;  
          }  
      }  
      xmlhttp.open("GET","test.php",true);  
      xmlhttp.send();  
      }  
    

    Willst du wirklich ein Script, das etwas in deiner Datenhaltung verändert, mit GET aufrufen? Das ist keine gute Idee. Dafür verwendet man besser POST. Man vermeidet so, dass die Aktion durch mehrfaches Reload mehrfach ausgeführt wird, oder dass sie durch crawlende Suchmaschinen-Bots "aus Versehen" ausgelöst wird.

    Und willst du wirklich noch IE5 und IE6 bedienen? Die würde ich inzwischen links liegenlassen.

    Aber was macht deine test.php eigentlich so ganz ohne Parameter?

    Den Code hab ich bei google gefunden, aber es funktioniert leider nicht.

    Und das heißt was? "Funktioniert nicht" ist keine Fehlerbeschreibung, und die Treffsicherheit von Kristallkugeln oder Kaffeesatz lässt doch zu wünschen übrig. Zumindest kann ich an deinem Code keinen offensichtlichen Fehler erkennen.

    Über Hilfe wäre ich sehr dankbar :)

    "Für". Man ist dankbar _für_ etwas. Man freut sich _über_ etwas.
    Aber Voraussetzung für Hilfe ist, dass du das Problem beschreibst.

    Ciao,
     Martin

    --
    Sozial ist, wenn andere bezahlen.
    Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
    1. Hello,

      Aber was macht deine test.php eigentlich so ganz ohne Parameter?

      Ich tippe mal darauf, dass sie für dieses emulierte "onblur" einträgt, dass der User das "Fenster" (das DIV) geschlossen hat, es also angezeigt bekommen hatte. :-)

      Liebe Grüße aus dem schönen Oberharz

      Tom vom Berg

      --
       ☻_
      /▌
      / \ Nur selber lernen macht schlau
      Die ultimative Seite für Selbermacher
    2. Hey

      Aber was macht deine test.php eigentlich so ganz ohne Parameter?

      ich habe ein Infofenster welches jeder User für sich ausblenden kann die test.php speichert die IP-Adresse oder falls eingeloggt userID in eine Datenbank, so das nicht bei jeden neuen Seitenaufruf das Infofenster eingeblendet wird.

      Willst du wirklich ein Script, das etwas in deiner Datenhaltung verändert, mit GET aufrufen? Das ist keine gute Idee. Dafür verwendet man besser POST. Man vermeidet so, dass die Aktion durch mehrfaches Reload mehrfach ausgeführt wird, oder dass sie durch crawlende Suchmaschinen-Bots "aus Versehen" ausgelöst wird.

      OK, das ist ein Argument. um auf Post umzustellen brauch ich nur
      xmlhttp.open("GET","infofenster.php?action=hide",true); mit xmlhttp.open("POST","infofenster.php",true); ersetzen oder?
      Aber wir übertrage ich dann mein Post "hide"?
      Ganz normal per html im Infofenster?
      <input name="hidden" type="hidden" value="1" />

      oder muss das dann in den
      xmlhttp.send();
      mit rein?

      1. Hallo,

        Aber wir übertrage ich dann mein Post "hide"?
        Ganz normal per html im Infofenster?
        <input name="hidden" type="hidden" value="1" />

        oder muss das dann in den
        xmlhttp.send();
        mit rein?

        Ja. Und zwar im Format application/x-www-form-urlencoded. Das beispielsweise so aufgebaut: foo=1&bar=2&qux=3

        Solange du nur einen Wert überträgst, ist das einfach:

        var wert = document.WieAuchImmerDuAufDasFormularFeldZugreifst.value;  
        var body = 'hidden=' + encodeURIComponent(wert);  
        xhr.send(body);
        

        Darüber hinaus empfehle ich jQuerys params.

        Grüße
        Mathias

        1. Solange du nur einen Wert überträgst, ist das einfach:

          var wert = document.WieAuchImmerDuAufDasFormularFeldZugreifst.value;

          var body = 'hidden=' + encodeURIComponent(wert);
          xhr.send(body);

            
          Danke, aber ich hab gar kein Formular was irgendwelche Daten überträgt :)  
          es soll ja nur bewirken, das das mir PHP per SQL die IP des Besuchers in die Datenbank einträgt, damit dieser nicht bei jedem Seitenwechsel erneut das Infofenster zu Gesicht bekommt.  
            
          meine Demoseite -> <http://spielwiese.zwante.de>  
            
          wenn du oben rechts auf das auf schließen drückst wird per Ajax die php angestoßen die wiederum in die Datenbank einträgt das du die Infobox nicht mehr sehen willst.  
            
          Ist für mich dann überhaupt relevant ob ich get oder post nehme?
          
          1. Hallo,

            Danke, aber ich hab gar kein Formular was irgendwelche Daten überträgt :)

            Achso, dann hatte ich dein Hinweis <input type="hidden"> falsch verstanden.

            Du brauchst natürlich kein Formular, wenn du nur einen festen Wert übertragen willst. Dann reicht etwas wie

            xhr.send('action=hide');

            Oder du modellierst diese Aktion mit HTTP-Verben bzw. in der URL, indem du einen POST auf /announcement/hide.php oder so machst.

            Ist für mich dann überhaupt relevant ob ich get oder post nehme?

            Es sollte ein POST sein, ja. Für alles, was serverseitig den Status ändert, sollte nicht GET verwendet werden. In Fachsprache: Alle nicht idempotenten Anfragen. GET sollte wiederholbar sein und immer dieselbe Ressource zurückgeben (solange sie nicht anderweitig geändert wird). GET sollte keine Nebeneffekte auf dem Server haben.

            Mathias

            1. Hallo Mathias,
              ich muss nochmal nachfragen...

              xhr.send('action=hide');

              meine Zeilen sehen nun wie folgt aus

              xmlhttp=new XMLHttpRequest();  
              xmlhttp.open("POST","user_announcement.php",true);  
              xmlhttp.send(\'action=hide\');
              

              und den Post frage ich dann so ab if (isset($_POST['action']))
              aber der php code der danach kommt wird nicht ausgeführt :(

              ist das ist das oben mit dem send() korrekt so?

              Viele Grüße aus Hamburg

              Sven

      2. Tach Post

        Aber was macht deine test.php eigentlich so ganz ohne Parameter?
        ich habe ein Infofenster welches jeder User für sich ausblenden kann die test.php speichert die IP-Adresse oder falls eingeloggt userID in eine Datenbank, so das nicht bei jeden neuen Seitenaufruf das Infofenster eingeblendet wird.

        Das macht man ganz einfach mit einem http://de.selfhtml.org/javascript/objekte/document.htm@title=Cookie, meinetwegen einer Session statt dazu noch eine Datenbank anzuwerfen. Zu dem erfüllt die IP den Zweck nicht, denn:

        * Millionen von Benutzern (denken wir an Mobiltelefone....) können über einen Proxy kommen und aus Serversicht die gleiche IP haben.
        * Ein Benutzer kann verschiedene IPs haben. Z.B. weil sich dessen "Modem" nach einer Pause neu einwählt.

        Jörg Reinholz

        1. Hello Fastix,

          Das macht man ganz einfach mit einem http://de.selfhtml.org/javascript/objekte/document.htm@title=Cookie,

          Wie geht das mit einem Cookie ohne Datenbank, dass das Meldungs-DIV nur dann bei weiteren Seitenbesuchen nicht wieder angezeigt wird, wenn der User es bewusst zugeklickt hat, es also wahrgenommen haben muss?

          Auch wenn das jetzt gehen sollte: ein "Nachweis" fehlt dem Server dann (bei registrierten Usern - davon war auch die Rede) aber trotzdem, dass _dieser_ User die Meldung schon angezeigt bekommen hat.

          #-----

          Ich gehe davon aus, dass wir die geschilderte Aufgabenstellung hier im Moment nur als Basisübungen für mehr ansehen sollten. Die Fragestellung "wie geht es mit Post?" ist doch als Entwicklungsansatz schon mal ganz hilfreich.

          Und wenn man im Self-Raum nach "Ajax" sucht, findet man leider noch nicht sehr viel Hilfreiches. Irgendwann kommt man dann zu einem Artikel von Mathias http://molily.de/js/ajax.html, der vielleicht weitergeführt werden sollte als Wiki-Artikel mit "Schritt-für-Schritt"-Anleitungen.

          In Anbetracht von Websockets werden Ajax und JavaScript sicherlich nochmal wieder stärker ins Bewusstsein gerückt werden. Da wäre es mMn nicht falsch, sich nochmal verstärkt damit zu beschäftigen.

          Liebe Grüße aus dem schönen Oberharz

          Tom vom Berg

          --
           ☻_
          /▌
          / \ Nur selber lernen macht schlau
          Die ultimative Seite für Selbermacher
          1. Om nah hoo pez nyeetz, Tom!

            Wie geht das mit einem Cookie ohne Datenbank, dass das Meldungs-DIV nur dann bei weiteren Seitenbesuchen nicht wieder angezeigt wird, wenn der User es bewusst zugeklickt hat, es also wahrgenommen haben muss?

            Obwohl du es ganz bestimmt weißt: Ein Cookie ist browserbezogen, nicht userbezogen.

            In diesem Forum gibts auch die Möglichkeit, eine Einstellung per Cookie zu setzen.

            Das JavaScript dazu: http://forum.de.selfhtml.org/stylewahl.js

            Matthias

            --
            Der Unterschied zwischen Java und JavaScript ist größer als der zwischen TeX und Textmarker.

            1. Hello,

              Om nah hoo pez nyeetz, Tom!

              Wie geht das mit einem Cookie ohne Datenbank, dass das Meldungs-DIV nur dann bei weiteren Seitenbesuchen nicht wieder angezeigt wird, wenn der User es bewusst zugeklickt hat, es also wahrgenommen haben muss?

              Obwohl du es ganz bestimmt weißt: Ein Cookie ist browserbezogen, nicht userbezogen.

              Du verdirbst den ganzen Spaß!

              In diesem Forum gibts auch die Möglichkeit, eine Einstellung per Cookie zu setzen.

              Das JavaScript dazu: http://forum.de.selfhtml.org/stylewahl.js

              Und die ist auch benutzerunabhängig, oder?

              Liebe Grüße aus dem schönen Oberharz

              Tom vom Berg

              --
               ☻_
              /▌
              / \ Nur selber lernen macht schlau
              Die ultimative Seite für Selbermacher
              1. Om nah hoo pez nyeetz, Tom!

                In diesem Forum gibts auch die Möglichkeit, eine Einstellung per Cookie zu setzen.
                Und die ist auch benutzerunabhängig, oder?

                dafür aber browserabhängig ;-)

                Nur mal nebenbei: Auch das Cookie hat inzwischen bessere, gerade für solche Kleinigkeiten weit einfacher zu handhabende Alternativen: Web- bzw. DOM-Storage

                Matthias

                --
                Der Unterschied zwischen Java und JavaScript ist größer als der zwischen Lauda und Laudatio.

        2. Moin

          Das macht man ganz einfach mit einem http://de.selfhtml.org/javascript/objekte/document.htm@title=Cookie, meinetwegen einer Session statt dazu noch eine Datenbank anzuwerfen. Zu dem erfüllt die IP den Zweck nicht, denn:

          * Millionen von Benutzern (denken wir an Mobiltelefone....) können über einen Proxy kommen und aus Serversicht die gleiche IP haben.
          * Ein Benutzer kann verschiedene IPs haben. Z.B. weil sich dessen "Modem" nach einer Pause neu einwählt.

          ja das ist richtig, aber das Hauptaugenmerk liegt hier eindeutig bei den registrierten und angemeldeten Nutzern, bei deren dann die User-ID gespeichert wird

    3. Und das heißt was? "Funktioniert nicht" ist keine Fehlerbeschreibung, und die Treffsicherheit von Kristallkugeln oder Kaffeesatz lässt doch zu wünschen übrig.

      Hehe. Das kommt darauf an, wer damit wirft.

      Jörg Reinholz

      1. Hallo,

        Und das heißt was? "Funktioniert nicht" ist keine Fehlerbeschreibung, und die Treffsicherheit von Kristallkugeln oder Kaffeesatz lässt doch zu wünschen übrig.

        Hehe. Das kommt darauf an, wer damit wirft.

        Grade beim Kaffeesatz kann man durch die Streuung sehr viel treffen!

        Gruß
        Kalk