Daten von MySQL Datenbank mit AJAX abrufen

forsterm

Erfahrenes Mitglied
Hallo,
mit php generiere ich eine Tabelle mit Daten aus einer Datenbank. Nun möchte ich,
dass wenn auf einen Link (rechts neben der Tabellenzeile) geklickt wird die Tabllenzeile
durch Inputfelder ersetzt wird, wo dann die Daten aus der Datenbank drin stehen.
Hab dazu auch schon das hier gefunden und hab versucht es so umzusetzten:
Code:
<?php
    require('connect.php');
    
    if (isset($_GET['link'])){
        if ($_GET['link'] == 'edit'){
            $sql = 'SELECT * FROM tabelle WHERE id = '.intval($_GET['id']);
            $query = mysql_query($sql) or die(mysql_error());
            $ds = mysql_fetch_object($query);
            
            echo '
            <div id="'.$ds->id.'">
                <td>
                    <form method="POST" name="edit" action="test.php">
                        <input type="text" name="feld1" value="'.$ds->feld1.'" size="20">
                        <input type="text" name="feld2" value="'.$ds->feld2.'" size="20">
                        <input type="text" name="feld3" value="'.$ds->feld3.'" size="20">
                        <input type="text" name="feld4" value="'.$ds->feld4.'" size="20">
                        <input type="hidden" name="id" value="'.$ds->id.'">
                    </form>
                </td>
            </div>
            ';
            exit;
        }
    }
    
?>
<html>
    <head>
        <script type="text/Javascript">
        <!--
        
            function AjaxManager() {
             var self = this;
             self.RequestComplete = null;
             this.RequestComplete = self.RequestComplete;
             self.RequestFailed = null;
             this.RequestFailed = self.RequestFailed;
            
            
             // Wird aufgerufen von post und erzeugt ein RequestObjekt je nach Browser
            
             this.XmlHttpRequest = function() {
              var Request = null;
              try {Request = new ActiveXObject("Msxml2.XMLHTTP");} catch(e) {
               try {Request = new ActiveXObject("Microsoft.XMLHTTP");} catch(oc) {
               Request = null;}
              }
              if (!Request && typeof(XMLHttpRequest) != "undefined") Request = new XMLHttpRequest();
              return Request;
             };
            
             // Wird vom Requestobjekt aufgerufen wenn sich dessen ReadyState ändert (also eine Rückmeldung vom Server kommt)
             this.ResponseHandler = function(Request){
             
              var ResHandler = function() {
               if (Request.readyState == 4) {
                if (Request.status == 200) {self.RequestComplete(Request);}
                else
                {self.RequestFailed(Request);}
                }
               }
             
              ResHandler.Request = Request;
              ResHandler.RequestComplete = self.RequestComplete;
              ResHandler.RequestFailed = self.RequestFailed;
              return ResHandler;
             }
            };
             
             // Postet Daten (parameters) an die URL
             this.PostData = function(url,Parameters){
             var Request = this.XmlHttpRequest();
             if (Request != null) {
              try {
               Request.onreadystatechange = this.ResponseHandler(Request);
               Request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
               Request.setRequestHeader("Content-length", parameters.length);
               Request.setRequestHeader("Connection", "close");
               Request.open("GET", DataSource, true);
               Request.send(Parameters);
              } catch(oc) {alert(oc);}
             }
             };
            
            }; // Ende Ajax Klasse
        
        
            // Dies sollte via <a href aufgerufen werden. Es sendet einen Request zum Server
            // der als Ergebniss das Ändern Formular für den passenden Datensatz mit der "id" zurückliefern sollte
            function editdata(id){
             var url = "test.php?link=edit&id=" id;  // Dieser Aufruf sollte nur das Edit Fomurlar erzeugen welches
                             // den Teil der Webseite ersetzt welches den Anzeigepart enthält
             var myAjax = new AjaxManager();
             myAjax.RequestComplete=fillForm(id);
             myAjax.RequestFailed=window.alert("Remote Request Error");
             myAjax.PostData(url,null);
            }
            
            // füllt beim Erhalt des Formulars das passende DIV aus
            function fillForm(Request,id){
             obj=document.getElementById(id);
             if ((obj) && (Request)){
              obj.innerHTML = Request.responseText;
             }
            }
        </script> 
    </head>
    <body>
<?php    
    $sql = 'SELECT * FROM tabelle';
    $query = mysql_query($sql) or die(mysql_error());
    
    echo '<table border="1" bordercolor="#000000" width="100%" style="border-collapse: collapse">';
    while ($ds = mysql_fetch_object($query)){
        echo '<tr>
                    <div id="'.$ds->id.'">
                        <td>'.$ds->feld1.'</td>
                        <td>'.$ds->feld2.'</td>
                        <td>'.$ds->feld3.'</td>
                        <td>'.$ds->feld4.'</td>
                        <td><a href="#" onclick="editdata('.$ds->id.')">edit</a></td>
                    </div>
                </tr>';
    }
    echo '</table>';
?>
    </body>
</html>
Nur leider funktioniert das anscheinend so nicht. :rolleyes: Denn es passiert rein gar nichts.
Weiß von euch eventuell jemand, was ich falsch mache?

mfg
forsterm
 
Sven Mintel hat gesagt.:
Könntest du bitte mal die HTML-Ausgabe der Sache Posten?
HTML:
<table border="1" bordercolor="#000000" width="100%" style="border-collapse: collapse">
    <tr>
        <div id="1">
            <td>Zeile1 - Feld1</td>
            <td>Zeile1 - Feld2</td>
            <td>Zeile1 - Feld3</td>
            <td>Zeile1 - Feld4</td>
            <td><a href="#" onclick="editdata(1)">edit</a></td>
        </div>
    </tr>
    <tr>
        <div id="2">
            <td>Zeile2 - Feld1</td>
            <td>Zeile2 - Feld2</td>
            <td>Zeile2 - Feld3</td>
            <td>Zeile2 - Feld4</td>
            <td><a href="#" onclick="editdata(2)">edit</a></td>
        </div>
    </tr>
    <tr>
        <div id="3">
            <td>Zeile3 - Feld1</td>
            <td>Zeile3 - Feld2</td>
            <td>Zeile3 - Feld3</td>
            <td>Zeile3 - Feld4</td>
            <td><a href="#" onclick="editdata(3)">edit</a></td>
        </div>
    </tr>
    <tr>
        <div id="4">
            <td>Zeile4 - Feld1</td>
            <td>Zeile4 - Feld2</td>
            <td>Zeile4 - Feld3</td>
            <td>Zeile4 - Feld4</td>
            <td><a href="#" onclick="editdata(4)">edit</a></td>
        </div>
    </tr>
</table>
 
Hallo,
ok also ich hab das Script nun so über arbeitet:
Javascript:
function AjaxManager()
{
	var self = this;
	self.RequestComplete = null;
	this.RequestComplete = self.RequestComplete;
	self.RequestFailed = null;
	this.RequestFailed = self.RequestFailed;

	// Wird aufgerufen von post und erzeugt ein RequestObjekt je nach Browser
	this.XmlHttpRequest = function()
	{
		var Request = null;
		try {
			Request = new ActiveXObject("Msxml2.XMLHTTP");
		}
		catch(e) {
			try {
				Request = new ActiveXObject("Microsoft.XMLHTTP");
			}
			catch(oc) {
				Request = null;
			}
		}
		if (!Request && typeof(XMLHttpRequest) != "undefined") Request = new XMLHttpRequest();
		return Request;
	};

	// Wird vom Requestobjekt aufgerufen wenn sich dessen ReadyState ändert (also eine Rückmeldung vom Server kommt)
	this.ResponseHandler = function(Request)
	{
		var ResHandler = function() {
			if (Request.readyState == 4) {
				if (Request.status == 200) {
					self.RequestComplete(Request);
				} else {
					self.RequestFailed(Request);
				}
			}
		}
		ResHandler.Request = Request;
		ResHandler.RequestComplete = self.RequestComplete;
		ResHandler.RequestFailed = self.RequestFailed;
		return ResHandler;
	}
};

// Postet Daten (parameters) an die URL
this.PostData = function(url,Parameters)
{
	var Request = this.XmlHttpRequest();
	if (Request != null) {
		try {
			Request.onreadystatechange = this.ResponseHandler(Request);
			Request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
			Request.setRequestHeader("Content-length", parameters.length);
			Request.setRequestHeader("Connection", "close");
			Request.open("GET", DataSource, true);
			Request.send(Parameters);
		}
		catch(oc) {
			alert(oc);
		}
	}
}; // Ende Ajax Klasse

// Dies sollte via <a href aufgerufen werden. Es sendet einen Request zum Server
// der als Ergebniss das Ändern Formular für den passenden Datensatz mit der "id" zurückliefern sollte
function editdata(id)
{
	var url = "test.php?link=edit&id=" + id;  // Dieser Aufruf sollte nur das Edit Fomurlar erzeugen welches
	// den Teil der Webseite ersetzt welches den Anzeigepart enthält
	var myAjax = new AjaxManager();
	myAjax.RequestComplete=fillForm(id);
	myAjax.RequestFailed=window.alert("Remote Request Error");
	myAjax.PostData(url,null);
}
// füllt beim Erhalt des Formulars das passende DIV aus
function fillForm(Request,id)
{
	var obj = document.getElementById(id);
	if ((obj) && (Request)){
		obj.innerHTML = Request.responseText;
	}
}

FireBug gibt jetzt nur noch einen Fehler aus der wie folgend lautet:
myAjax.PostData is not a function
Ich habe schon Folgendes getestet:
Javascript:
// Postet Daten (parameters) an die URL
this.PostData = function PostData(url,Parameters)
{
	var Request = this.XmlHttpRequest();
	if (Request != null) {
		try {
			Request.onreadystatechange = this.ResponseHandler(Request);
			Request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
			Request.setRequestHeader("Content-length", parameters.length);
			Request.setRequestHeader("Connection", "close");
			Request.open("GET", DataSource, true);
			Request.send(Parameters);
		}
		catch(oc) {
			alert(oc);
		}
	}
};
und
Javascript:
// Postet Daten (parameters) an die URL
function PostData(url,Parameters)
{
	var Request = this.XmlHttpRequest();
	if (Request != null) {
		try {
			Request.onreadystatechange = this.ResponseHandler(Request);
			Request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
			Request.setRequestHeader("Content-length", parameters.length);
			Request.setRequestHeader("Connection", "close");
			Request.open("GET", DataSource, true);
			Request.send(Parameters);
		}
		catch(oc) {
			alert(oc);
		}
	}
};

beide Varianten haben jedoch nichts gebracht.
Kann mir bei diesem Problem denn wirklich niemand weiterhelfen? :(

mfg
forsterm
 
Zuletzt bearbeitet:
Da sind noch weitere Fehler drinnen:(

PostData() hast du bspw. ausserhalb des Objektes notiert(falls ich mich nicht irre), das kann daher nicht per this.PostData() aufegrufen werden.

Desweiteren unbekannte Variablen(DataSource) , Schreibfehler(parameters.length)
...und warum machst du eine GET-Anfrage, und versuchst dann POST-Daten zu senden.
 
Sven Mintel hat gesagt.:
Da sind noch weitere Fehler drinnen:(

PostData() hast du bspw. ausserhalb des Objektes notiert(falls ich mich nicht irre), das kann daher nicht per this.PostData() aufegrufen werden.

Desweiteren unbekannte Variablen(DataSource) , Schreibfehler(parameters.length)
...und warum machst du eine GET-Anfrage, und versuchst dann POST-Daten zu senden.
Hallo,
das Script ist nicht von mir (siehe Eingangspost). Hab nur versucht es anzupassen.
Kannst du oder jemand anders mir da eventuell weiterhelfen oder eine Quelle nennen,
wo das leicht verständlich erklärt wird bzw. ein Tutorial zu finden ist?

mfg
forsterm
 
Hallo,
ok also hab jetzt folgenden Code:
Code:
<?php
    require('connect.php');
    
    if (isset($_GET['link'])){
        if ($_GET['link'] == 'edit'){
            $sql = 'SELECT * FROM tabelle WHERE id = '.intval($_GET['id']);
            $query = mysql_query($sql) or die(mysql_error());
            $ds = mysql_fetch_object($query);
            
            die('
            <div id="'.$ds->id.'">
                <td>
                    <form method="POST" name="edit" action="test.php">
                        <input type="text" name="feld1" value="'.$ds->feld1.'" size="20">
                        <input type="text" name="feld2" value="'.$ds->feld2.'" size="20">
                        <input type="text" name="feld3" value="'.$ds->feld3.'" size="20">
                        <input type="text" name="feld4" value="'.$ds->feld4.'" size="20">
                        <input type="hidden" name="id" value="'.$ds->id.'">
                    </form>
                </td>
            </div>
            ');
            exit;
        }
    }
    
?>
<html>
    <head>
        <script type="text/javascript">
        <!--
         lock = false;
         req  = false;
            
         if(window.XMLHttpRequest) 
          {
           try 
            {
             req = new XMLHttpRequest();
            } 
           catch(e) 
            {
             req = false;
            }
           } 
          else if(window.ActiveXObject) 
           {
            try 
             {
              req = new ActiveXObject("Msxml2.XMLHTTP");
             } 
            catch(e) 
             {
              try 
               {
                req = new ActiveXObject("Microsoft.XMLHTTP");
               } 
              catch(e) 
               {
                req = false;
               }
             }
           }
                
                
        function edit(id) 
        {
         if(!req)
          {
           alert('Dein Browser kann das nicht! :o(');
           return;
          }
                
         if(lock)
          {
           alert('Warte bitte, bis die letzte Anfrage verarbeitet wurde');
           return;
          }
                
           //Die Anfrage senden
           lock = id;
           req.onreadystatechange = new Function('f','get_http_response(' + id + ')');
           req.open("GET", '<?php echo $_SERVER['PHP_SELF']; ?>?link=edit&id='+ id + '&amp;' + new Date().getTime(), true);
           req.send(true);
        }
        
        //Antwort verarbeiten
        function get_http_response(id)
        {
         //Wenn Anfrage fertig
         if(req.readyState == 4)
          {   
           //Wenn Status OK
           if(req.status == 200)
            {
             //Antwort ausgeben
             //alert(req.responseText);
             
             obj=document.getElementById(id);
             if ((obj)){
              obj.innerHTML = req.responseText;
             }
            }
           //Ansonsten
           else
            {
             //Statuscode ausgeben
             alert(req.statusText);
            }
           //Request beenden
           if(document.all && !window.opera)
            {
             req.abort();
            }
           lock = false;
          }
        }
        //-->
        </script>
    </head>
    <body>
<?php    
    $sql = 'SELECT * FROM tabelle';
    $query = mysql_query($sql) or die(mysql_error());
    
    echo '<table border="1" bordercolor="#000000" width="100%" style="border-collapse: collapse">';
    while ($ds = mysql_fetch_object($query)){
        echo '<tr>
                    <div id="'.$ds->id.'">
                        <td>'.$ds->feld1.'</td>
                        <td>'.$ds->feld2.'</td>
                        <td>'.$ds->feld3.'</td>
                        <td>'.$ds->feld4.'</td>
                        <td><a href="#" onclick="edit('.$ds->id.')">edit</a></td>
                    </div>
                </tr>';
    }
    echo '</table>';
?>
    </body>
</html>
Nun habe ich noch 3 (kleinere Probleme :rolleyes:):
1. Die Inputfelder werden nicht innerhalb der Tabelle sondern darüber angezeigt.
2. Wenn ich einen Datensatz zum Bearbeiten ausgewählt habe und dann auf einen anderen edit - Link klicke,
bleibt der alte Datensatz bestehen anstatt dass der neue ausgewählt wird.
3. Wie kann ich einen "Abbrechen" Button realisieren, sodass die Inputfelder beim Klick darauf wierder verschwinden?

mfg
forsterm
 
Zuletzt bearbeitet:
1. Anstatt das kopmplette Formular in die Seite hineinzutun, musst du in jeder einzelnen Zelle den bisherigen Inhalt löschen, und dafür die einzelnen Inputs einfügen. Alles andere dürfte Fehler produzieren, aus welchen 2+3 resultieren.
 
Zurück