andyah
Goto Top

JavaScript führt PHP-Funktion nicht aus

Hi NG,

im beiliegenden Code:

<?php    
   
function loeschen()
{
   echo("test");  
   //ID einlesen
   $id = $_GET['id'];  

   //Tabellenname
   $daten = "adressen";  

   //Verbindung
   $db = mysql_connect ("localhost", "root", "");  

   if (!$db) { 
       die('Verbindung schlug fehl: ' . mysql_error());  
	   }
	
   $select_db = mysql_select_db($daten); 

   //SQL-Befehl
   $sql_befehl = "delete from mitglieder where ID=" .$id;  

   //SQL-Befehl ausführen
   $result = mysql_query($sql_befehl); 

   //löschen bestätigen
   if ($result)
   {
       echo '<script type="text/javascript" >';  
       echo 'alert("Daten geloescht");';   
       echo 'window.location = "tabelle3.php";';   
       echo '</script>';  
   }
   else
   {
       echo '<script type="text/javascript" >';  
       echo 'alert("Daten nicht geloescht");';   
       echo 'window.location = "tabelle3.php";';   
       echo '</script>';  
   }

   mysql_close($db);
}

?>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
<html>
<head>
<title>loeschen</title>

</head>
<body>

<script type="text/javascript">  
<!-- 
   /*Abfrage, ob JA oder NEIN */
   if(window.confirm("Wollen Sie das wirklich tun?") == true) 
      { 
        //Funktion wird nicht ausgeführt
		document.write("<?php");	 //Den PHP-Code ins Dokument schreiben. 
		document.write("loeschen();"); 
		document.write("?>"); 
      }
   else
      {
         history.back();    //zurück zur aufrufenden Seite
      }
	  
// -->
</script>
</body>
</html>
führt JavaScript die PHP-Funktion nicht aus, obwohl die Funktion bei Aufruf in PHP funktioniert.

Wo liegt der Fehler?

Gruß
Andy

Content-Key: 205269

Url: https://administrator.de/contentid/205269

Printed on: April 19, 2024 at 06:04 o'clock

Member: SlainteMhath
SlainteMhath Apr 19, 2013 at 07:29:08 (UTC)
Goto Top
Moin,

Vorab:
  $id = $_GET['id'];   
....
   $sql_befehl = "delete from mitglieder where ID=" .$id;   
   $result = mysql_query($sql_befehl);  
Solcher Code ist anfällig für SQL Injections - siehe http://de.wikipedia.org/wiki/SQL-Injection

Zu Deinem Problem:
if(window.confirm("Wollen Sie das wirklich tun?") == true)  
{ 
document.write("<?php");	   
...

PHP wird serverseitig ausgeführt, JavaSctip läuft am Client. Was soll der Browser also mit dem PHP Code anfangen?
Du musst die Lösch Funktion in ein separates PHP File packen und das dann mit JS (z.b. per XMLHttpRequeszt) mit seiner vollen http://... URL aufrufen.

lg,
Slainte
Member: Hitman4021
Hitman4021 Apr 19, 2013 updated at 07:40:16 (UTC)
Goto Top
Hallo,

die Idee mit PHP-Funktionen aus JS ausführen hast du ja aus diesem Thread.
Und wenn du in zu Ende gelesen hättest wüsstest du das die PHP Funktion schon beim Aufruf ausgeführt wird und das JS das dann nur mehr anzeigt.


Und wie @SlainteMhath schon sagte ändere den Code
  $id = $_GET['id'];   
....
   $sql_befehl = "delete from mitglieder where ID=" .$id;   
   $result = mysql_query($sql_befehl);  

besser auf sowas wie
  $id = mysql_real_escape_string($_GET['id']);   
....
   $sql_befehl = "delete from mitglieder where ID=" . $id;   
   $result = mysql_query($sql_befehl);  
Und irgendwo sollte mann auch noch überprüfen ob ID auch eine gültige ID ist.

Gruß
Member: AndyAh
AndyAh Apr 19, 2013 at 07:40:56 (UTC)
Goto Top
Hi,

das Script aus diesem Thread (Frage auch von mir) funktioniert so, wie es ist.

Gruß
Andy
Member: Hitman4021
Hitman4021 Apr 19, 2013 at 07:45:08 (UTC)
Goto Top
Hallo,

es wird beim Aufruf der Seite ausgeführt und das JS zeigt es dann nur mehr an.
Hier versuchst du eine PHP! Funktion aufzurufen die serverseitig ausgeführt werden soll! Diese wurde aber bereits beim Aufruf der Seite ausgeführt. Wenn du nun
 
$id = $_GET['id'];  
if (!isset($id) {
  $id = 1
}
.....
delete usw... 
schreibst wird der Datensatz gelöscht wenn die Seite aufgerufen wird!
Das gleiche geschieht wenn in deinem GET Array bei Aufruf der Seite bereits eine ID definiert wurde.

Gruß
Member: AndyAh
AndyAh Apr 19, 2013 at 07:50:30 (UTC)
Goto Top
Hi Slainte,

könntst du mir für "XMLHttpRequest" evtl. einige Beispiele geben?

Aus der Google-Suche bin ich nicht so recht schlau geworden.

Gruß
Andy
Member: Mondragor
Mondragor Apr 19, 2013 updated at 08:53:50 (UTC)
Goto Top
Dazu gibts ne interessante Doku von Gallileo Computing http://openbook.galileocomputing.de/javascript_ajax/
Kapitel 18

Was man Dir zu sagen versucht, ist, dass Du versuchst, eine PHP-Funktion quasi der Seite erst zur Verfügung zu stellen,
wenn die Bedingung vom User erfüllt wird...
Da Javascript aber komplett auf der Browserseite ausgeführt wird, kannst Du von Javascript alleine nicht erwarten, dass
es dafür sorgt, dass dein PHP auf dem Server ausgeführt wird, nur weil Du glaubst, dass es der Seite eine PHP-Funktion
"generiert"... PHP führt der Server aus, auf dem die Seite liegt, der kann ja nicht wissen, was dein Browser mit Javascript so macht...
Daher hat man sich für Ajax ... entschieden, um Javascript aktiv Anfragen an den Server stellen zu lassen, die in aller Regel auf
zusätzliche php-scripte zugreifen.
Man kann sagen, dass PHP-Quellcode immer Vorrang vor Javascript hat, also vom Server bereits ausgeführt wird, wenn die Seite
aufgerufen wird und bevor sie an deinen Browser gesandt wurde. Javascript wird nur vom Browser auf deinem Rechner ausgeführt,
da ist es dann schon zu spät.
Achte beim Syntax-Highlighting mal darauf, warum plötzlich der PHP-Quellcode anders aussieht als die Script-Umgebung im Editor...
Andersrum ist es möglich, mit PHP echo ein Javascript zu schreiben, das also erst während des Aufrufes generiert wird. Das JS
wird dann laufen und das ist ja der Beweis für die Reihenfolge...

Grüße,
Mondragor
Member: SlainteMhath
SlainteMhath Apr 19, 2013 updated at 09:19:56 (UTC)
Goto Top
Beispiel:
// XMLHttpRequestObject erstellen
var XMLHttpRequestObject = false;
if (window.XMLHttpRequest) {
	XMLHttpRequestObject = new XMLHttpRequest();
} else if (window.ActiveXObject) { // Sonderbehandlung für IEs
	XMLHttpRequestObject = new
	ActiveXObject(""Microsoft.XMLHTTP"");  
}

// Ruft die URL "url" auf und schreibt deren Inhalt in das HTML Element mit der ID "divID" 
function getData(url, divID)
{
	if(XMLHttpRequestObject) {
		var obj = document.getElementById(divID);
		XMLHttpRequestObject.open(""GET"", url);  
		XMLHttpRequestObject.onreadystatechange = function()
 		{
			if (XMLHttpRequestObject.readyState == 4 && XMLHttpRequestObject.status == 200) {
				obj.innerHTML = XMLHttpRequestObject.responseText;
			}
		}
	}
}


/EDIT:
Aufruf dann in etwa
<a onlick="javascript:getData("http://..../query.php","ergebnis">  
<div id="ergebnis"></div>  
Member: Mondragor
Mondragor Apr 19, 2013 at 09:28:10 (UTC)
Goto Top
Vielleicht könnte man an dieser Stelle noch darauf hinweisen, dass die aktuellen Internet Explorer vielen Elementen nicht erlauben, auf diesem Wege ".innerHTML" quelltext aufzunehmen.
Ich meine mich zu erinnern, dass es da von JQuery eine Funktion gab, die $(...).inner oder so, die dieses Problem umgeht...

Grüße,
Mondragor
Member: AndyAh
AndyAh Apr 19, 2013 at 09:42:58 (UTC)
Goto Top
Hi NG,

ich habe mich von der Idee einer Sicherheitsabfrage beim Löschen von Daten verabschiedet.

Ist mir alles zu aufwendig und zu kompliziert.

Gruß
Andy
Member: Mondragor
Mondragor Apr 19, 2013 updated at 10:15:36 (UTC)
Goto Top
Sorry,
also es ist ja einerseits verständlich, dass man das nicht immer gerne macht, aber man braucht öfters mal ajax und ich denke, wenn man das Grundprinzip einmal verstanden hat, zumal es eigentlich immer das selbe ist... dann kann man immer wieder damit arbeiten und richtig coole Sachen damit machen!
JQuery ist wie gesagt so etwas, was auch einiges eleganter und einfacher / universeller lösen kann. Also fuchs Dich rein, es lohnt sich...
Also im Grunde geht es um folgendes. Du erstellst ein Request-Objekt. Dieses Objekt kennt verschiedene Methoden, unter anderem das Senden von Anfragen an den Server.
Nun werden POST und GET unterstützt, da gibts nen kleinen syntaktischen Unterschied siehe galloleoComputing-link oben. Solange die Anfrage nicht komplett abgeschlossen / beantwortet ist, gibt es verschiedene Stati, die durchlaufen werden. Jedes mal, wenn sich der "readyState" ändert, wird geprüft, ob vollständig ...
Dann wird der "responseText" in ein Div auf deiner Seite geschrieben. Der ResponseText ist genau das, was Du sehen würdest, wenn Du die Seite, auf die der Request verweist, mit dem Browser aufrufst.
Interessant hierbei, es verändert sich nur der HTML-Inhalt des DIV auf der seite, von der aus der Request gestellt wurde. Es muss nicht die ganze Seite neu geladen werden.
Und dieser Ablauf ist im Grunde immer der selbe.
In Deinem Fall würde der Response-Text glaube ich sowas beinhalten wie "Der Eintrag wurde erfolgreich gelöscht." oder "Eintrag existiert nicht".
Ferner müsste die Seite, an die der Request geht, die SQL-Abfrage ausführen. Es ist eine reine PHP-Datei und löscht einen Eintrag aus der Datenbank, wenn du eben willst, auch mit Statusausgabe des Löschversuchs.
Dieser Responsetext wird eigentlich nur per echo ausgegeben.
Der Request ruft diese "php-Seite" auf, führt aus und speichert den "Responsetext" also den Löschstatus in deinem Fall zwischen.
Die
XMLHttpRequestObject.onreadystatechange = function() {...}
ist ja wieder ganz normales Javascript... Das einzig schwierige hier ist die erstmalige anwendung des XMLHttpRequest-Objektes...
Aber hast Du das 2-3 mal benutzt, wirds eigentlich trivial...