Andy Nail: Mehrere Parameter an Ajax übergeben

Hallo zusammen,

mit Ajax würde ich gerne eine PHP Datei aufrufen, mit der eine SQL anweisung ausgeführt werden soll und wofür dann auch mehrere Daten an diese Datei übertragen werden müssten.

Doch bisher geschieht nix beim Aufruf dieser Funktion:

$.ajax({
type: "POST",
url: "SaveView.php",
data: {ID:ID, db:DBName, table:Table, View:0},
success: function() {}

und in die empfangende Datei schreibe ich:

$ID = utf8_decode ($_REQUEST['ID']);
$table = utf8_decode ($_REQUEST['table']);
$db = utf8_decode ($_REQUEST['db']);
$View = utf8_decode ($_REQUEST['View']);

$verbindung=mysql_connect(ini_get("mysqli.default_host"), "root", "") or 
die("Error: <br>".mysql_error()); 
mysql_select_db($db, $verbindung)
// Anfrage an DB-Server
$Ergebnis = mysql_query("INSERT INTO `$table` WHERE ID = $ID SET Sub = $View ") OR die("Error: <br>".mysql_error());

OK und dann würde ich mich freuen von Euch eine interessante Hilfestellung zu bekommenm da es ja auch öfters zu solch einer Situation kommen wird und ich auch jetzt schon dies an mehreren Stellen anwenden könnte!

Also schonmal vielen Dank und mit Gruß

Andreas

  1. Moin!

    Doch bisher geschieht nix beim Aufruf dieser Funktion:

    $.ajax({  
    type: "POST",  
    url: "SaveView.php",  
    data: {ID:ID, db:DBName, table:Table, View:0},  
    success: function() {}
    

    und in die empfangende Datei schreibe ich:

    $ID = utf8_decode ($_REQUEST['ID']);  
    $table = utf8_decode ($_REQUEST['table']);  
    $db = utf8_decode ($_REQUEST['db']);  
    $View = utf8_decode ($_REQUEST['View']);  
    
    $verbindung=mysql_connect(ini_get("mysqli.default_host"), "root", "") or   
    die("Error: <br>".mysql_error());   
    mysql_select_db($db, $verbindung)  
    // Anfrage an DB-Server  
    $Ergebnis = mysql_query("INSERT INTO `$table` WHERE ID = $ID SET Sub = $View ") OR die("Error: <br>".mysql_error());  
    

    Man gut, dass es noch nicht funktioniert - du baust dir da gerade eine riesige SQL-Injection-Sicherheitslücke ein.

    Deine Intention ist, dass du per AJAX an fast jede beliebige Stelle deiner Datenbank schreiben kannst. Sowas ist konzeptuell sehr schwer abzusichern (nicht unmöglich, aber auf dem Abstraktionsgrad "ich schreibe in die DB" dieses Interfaces deutlich schwerer, als mit abstrakteren Methoden).

    Selbst wenn also das Injection-Sicherheitsproblem behoben wäre (auch nicht ganz simpel, denn du übergibst einen Tabellennamen, und bei denen hilft mysql_real_escape_string() nichts), hättest du immer noch das Problem, dass ein Angreifer durch Analyse der existierenden Requests feststellt, dass du einen Datenbank- und Tabellennamen übergibst. Den kann man auch verändern, und damit Schreibzugriffe auf andere Datenbanken und andere Tabellen machen.

    Abgesehen davon: Die MYSQL-Extension in PHP ist TOT! In PHP 7 ist sie nicht mehr enthalten, in PHP 5 ist sie seit zehn Jahren als "deprecated" (mißbilligt - steht auf der Abschussliste) markiert.

    Benutze bitte MYSQLi - das i am Ende ist der wichtige Unterschied. Ansonsten wirst du sehr bald deinen gesamten DB-Code umschreiben dürfen, weil du keinen Hoster mehr findest, der noch MySQL unterstützt. In den meisten Fällen ist das "nur" ein schlichtes Suchen nach "mysql_" und Ersetzen mit "mysqli_", aber bei einigen Funktionen haben sich die Parameter etwas geändert.

    Besser, du änderst das jetzt, wenn noch wenig Code existiert, als später.

    Grüße Sven

    1. Lieber Sven,

      Benutze bitte MYSQLi - das i am Ende ist der wichtige Unterschied. [...] In den meisten Fällen ist das "nur" ein schlichtes Suchen nach "mysql_" und Ersetzen mit "mysqli_", aber bei einigen Funktionen haben sich die Parameter etwas geändert.

      warum nicht gleich PDO?

      Liebe Grüße,

      Felix Riesterer.

      1. Tach!

        warum nicht gleich PDO?

        PDO ist eine Alternative, aber kein Nachfolger. Die Entscheidung ob PDO oder eine andere Datenbankschnittstelle verwendet werden soll, ist nicht dieselbe wie zwischen mysql und mysqli. Vielmehr sind da technische Gründe und die eigene Vorliebe auszuwerten. PDO hat im 08/15-Einsatz so gut wie keine Nachteile, aber einige Dinge sind einfacher zu verwenden (Prepared Statements beispielsweise).

        dedlfix.

  2. idR werden Parameter mit dem Content-Type: application/x-www-form-urlencoded gesendet. Das sind Schlüssel-Werte-Paare wobei Werte mehrerer gleichnamiger Schlüssel ein Array ergeben. Ein Alternativer Content-Type: application/json ermöglicht komplexere Datenstrukturen.

    1. OK Hallo

      Und vielen Dank, doch sollte ich auch lesen können wie man dann das Ganze dann schreibt. Ich will ja eigentlich auch nicht mehrere Werte an nur einen Parameter senden. Vielmehr sieht das so aus, dass der Name des Parameters der Gleiche ist wie die Variable, die den Wert einfügen soll. Und das man das so offen schreibt, hatte ich auch erst einmal aus dem Netz genomme, vorher stellte ich das zu sendende in Anführungszeichen, was aber mit mehreren Parametern ja schräg aussehen würde. Aber wie schreibe ich das dann in der sendenden und dann in der empfangenden Funktion? Und wie war das mit de content-type mit einem encode? Denn ich hätte ganz einfach den übertragenden Wert verschlüsselt und könnte das vielleicht auch gebrauchen, da das Verschlüsseln bereits an anderer Stelle bereits zum Einsatz kommt.

      Also nochmmals vielen Dank und ich würde mich über weitere Infos sehr freuen.

      Danke Gruß Andreas

      1. Den Default Enctype application/x-www-form-urlencoded (Schlüssel-Werte-Paare) baust du wie folgt zusammen:

        key=encodeURIComponent(value)&name=encodeURIComponent(wert)& usw.
        

        überträgst den mit POST und serverseitig greifst Du einfach in das POST Array. Falls Du Formulareingaben hast, übernimmt jQuery.serialize() den o.g. Zusammenbau.

    2. idR werden Parameter mit dem Content-Type: application/x-www-form-urlencoded gesendet. Das sind Schlüssel-Werte-Paare wobei Werte mehrerer gleichnamiger Schlüssel ein Array ergeben. Ein Alternativer Content-Type: application/json ermöglicht komplexere Datenstrukturen.

      Hast Du evtl. einen Tipp, mit welchem Framework man das mit wenigen Zeilen Code erledigen kann?

      1. idR werden Parameter mit dem Content-Type: application/x-www-form-urlencoded gesendet. Das sind Schlüssel-Werte-Paare wobei Werte mehrerer gleichnamiger Schlüssel ein Array ergeben. Ein Alternativer Content-Type: application/json ermöglicht komplexere Datenstrukturen.

        Hast Du evtl. einen Tipp, mit welchem Framework man das mit wenigen Zeilen Code erledigen kann?

        Der Vorteil der Verwendung des Default Enctype besteht darin, dass keine speziellen Libraries notwendig sind. Gerade mit PHP kannst du zu übertragende Datenstrukturen clientseitig beliebig tief strukturieren like att[foo][bar][baz] und serverseitig einfach in das POST oder GET Array greifen je nach Requestmethode.

        1. Hallo und auf jeden Fall vielen Dank,

          aber schade das ich halt noch nix mit dem Ganzen etwas anfangen kann. Ich äußere mich auch mal dazu, dass ich mich bei der Themenbescvhreibung ja verschrieben hatte. Denn ss geht mir eigentlich darum, dass ich mehrere Daten per Ajax an die auszuführende sql Datei senden will. Und ich würde mich freuen dazu einen Beispiel-Code erhalten zu können. Denn unter der Verwendung von Arrays verstand ich das so, einen Code so zu schreiben:

          var Daten = new Array()
          Daten[0] = ID
          Daten[1] = DBName
          Daten[2] = Table
          Daten[3] = document.getElementById('M'+ID).getAttribute("View")
          $.ajax({
          

          // tpye: "POST", type: "application/json", url: "SaveView.php", data: {ID:Daten[0], db:Daten[1], table:Daten[2], View:Daten[3]}, success: function() {} });

          Und das dass falsch ist, ist überhaupt keine Frage. Doch wie denn sonst? Dann bitte ich nochmals um Codezeilen, wofür ich mich wieder bereits jetzt dafür bedanken möchte, und freue mich darauf das Ziel erreichen zu können.

          Also vielen Dank und mit Gruß Andreas

          1. Hallo und auf jeden Fall vielen Dank,

            aber schade das ich halt noch nix mit dem Ganzen etwas anfangen kann.

            wenn du was lernen willst, bau dir das alles mal Stück für Stück zusammen und verzichte zunächst auf jQuery. Ein wichtiges Entwicklerwerkzeug ist die FF-Entwicklerkonsole: Ajax-Requests rausfeuern und das in aller Ruhe in der Konsole angucken.

            Schönes Wochenende.