bimmel: [Prototype] JavaScript-Array per Ajax an PHP übergeben

Hallo Forum,

ich habe neulich schon einmal hier geschrieben, dass ich ein Problem mit Ajax udn Prototype hätte. Diesmal geht es auch um Ajax und Prototype, aber um etwas anderes.

In einem JavaScript-Array variabler Länge sind die Primärschlüsselfelder einer MySQL-Tabelle hinterlegt (nur zum Testen).
Dieses JavaScript-Array muss nun an PHP übergeben werden, damit die PHP-Datei diese Felder verarbeiten kann.

  
function abc(pk)  
{  
	new Ajax.Updater  
	(  
		'testobj',  
		'ajax.php',  
		{  
			method: 'get',  
			parameters:  
			{  
				pkey: pk,  
			}  
		}  
	);  
}  

Die PHP-Datei erhält aber nur das letzte Element des Arrays "pk". Eine Abfrage in PHP is_array($_GET['pk']) zeigt, dass es tatsächlich kein Array ist.
Mit serialize habe ich es schon probiert (da gibt es ein paar Skripts im Internet, die serialize in JavaScript implementieren), doch PHP kann den String nicht unserilisieren (leerer String wird zurückgegeben).
Auch ein pk.join(",") oder ähnliches kommt nicht infrage, da Feldnamen in MySQL JEDES Zeichen beinhalten dürfen, was zwangsläufig irgendwann zu Problemen beim Exploden in PHP führt.

Gibt es nicht eine andere Lösung?

Liebe Grüße
bimmel

  1. Hi,

    Die PHP-Datei erhält aber nur das letzte Element des Arrays "pk". Eine Abfrage in PHP is_array($_GET['pk']) zeigt, dass es tatsächlich kein Array ist.

    PHP hat einen schwerwiegenden Bug, durch den Parameter immer nur einzeln gewertet werden, solange ihre Namen nicht der PHP-Array-Schreibweise entsprechen. Heißen die Parameter also z.B. "pk[]", arbeitet PHP so, wie man es von gut konzipierten Systemen schon beim Namen "pk" erwartet.

    Cheatah

    --
    X-Self-Code: sh:( fo:} ch:~ rl:| br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. Hi

      PHP hat einen schwerwiegenden Bug, durch den Parameter immer nur einzeln gewertet werden, solange ihre Namen nicht der PHP-Array-Schreibweise entsprechen. Heißen die Parameter also z.B. "pk[]", arbeitet PHP so, wie man es von gut konzipierten Systemen schon beim Namen "pk" erwartet.

      Das heißt, ich kann in diesem Fall keine Arrays übergeben? Oder kann man das irgendwie umschiffen (wie gesagt, die Variante mit implode/explode oder serialize/unserialize fallen weg...).
      Es wäre zwar unperformant, unprofessionell und eine absolute Notlösung, aber man könnte doch (per Ajax) eine Seite aufrufen, die das Argument, das ihr geliefert wurde, in eine Session einträgt. In einer JavaScript-Schleife, die die Elemente des Arrays durchläuft, wird diese Seite nacheinander X-mal aufgerufen. Somit müsste man kein Array übertragen, sondern nur die Arrayelemente, die eben strings sind.

      Lg
      bimmel

      1. Hi

        Das heißt, ich kann in diesem Fall keine Arrays übergeben?

        Ich würde aus dem Array einen String (Zeichenkette) machen und den übergeben.

        Horst vom Baumarkt

        1. Hi

          Ich würde aus dem Array einen String (Zeichenkette) machen und den übergeben.

          Aber das kann man eben nicht, denn sobald das Trennzeichen der Arrayelemente (üblicherweise das Kommata) auch im Feldtitel vorkommt, werden Probleme beim Trennen aufkommen (implode/explode fällt eben weg, wie ich schon sagte).

          Lg
          bimmel

          1. hi,

            Aber das kann man eben nicht, denn sobald das Trennzeichen der Arrayelemente (üblicherweise das Kommata) auch im Feldtitel vorkommt, werden Probleme beim Trennen aufkommen (implode/explode fällt eben weg, wie ich schon sagte).

            Wer sagt denn, dass Du ein Komma nehmen musst ;-)
            Ja, ne klar, das Trennzeichen muss schon eins sein, was sonst nicht weiter im Text vorkommen darf. Wenn sowas realisierbar ist, würde ich das schon so machen. Klar, geht nicht immer.

            Hotte

            1. Hi

              Ja, ne klar, das Trennzeichen muss schon eins sein, was sonst nicht weiter im Text vorkommen darf. Wenn sowas realisierbar ist, würde ich das schon so machen. Klar, geht nicht immer.

              Leider ist es bei MySQL so, Feldnamen dürfen wirklich alle Zeichen beinhalten die es gibt. Selbst Leerzeichen, Kommata, Bindestriche etc... Ich denke ich muss auf die unprofessionelle Art zurückgreifen... Ich fühl mich jetzt schon schlecht :(

              Lg
              bimmel

              1. hi,

                Leider ist es bei MySQL so, Feldnamen dürfen wirklich alle Zeichen beinhalten die es gibt.

                Ja, schon. Aber nicht jedes Zeichen hat eine Taste auf der Tastatur. Bei einer 7-bit-Kodierung gibt es 127 verschiedene Zeichen, aber eine Tastatur hat nur 110 Tasten. Da gibts schon ein paar Zeichen, die Du nehmen könntest...

                Hotte

      2. Mahlzeit bimmel,

        oder serialize/unserialize fallen weg...).

        Warum fällt das weg? IMHO wäre das die in diesem Fall beste Lösung.

        Du schriebst "PHP kann den String nicht unserilisieren (leerer String wird zurückgegeben)" - hast Du überprüft, woran das liegt? Ist es nicht vielleicht eher so, dass die von Dir verwendeten Javascript-Funktionen nicht richtig serialisieren können? Hast Du die Daten überprüft? Hast Du auch mal versucht, den Weg andersherum zu gehen (in PHP serialisieren, in JS unserialisieren) - einfach nur zum Testen?

        MfG,
        EKKi

        --
        sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
      3. Hi,

        PHP hat einen schwerwiegenden Bug, durch den Parameter immer nur einzeln gewertet werden, solange ihre Namen nicht der PHP-Array-Schreibweise entsprechen. Heißen die Parameter also z.B. "pk[]", arbeitet PHP so, wie man es von gut konzipierten Systemen schon beim Namen "pk" erwartet.
        Das heißt, ich kann in diesem Fall keine Arrays übergeben? Oder kann man das irgendwie umschiffen

        Du meinst anders umschiffen, als ich es Dir oben beschrieben habe? Ist mir nicht bekannt, aber in den meisten Fällen reicht diese Methodik auch aus.

        Cheatah

        --
        X-Self-Code: sh:( fo:} ch:~ rl:| br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
        X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
        X-Will-Answer-Email: No
        X-Please-Search-Archive-First: Absolutely Yes
  2. Hi!

    Die PHP-Datei erhält aber nur das letzte Element des Arrays "pk". Eine Abfrage in PHP is_array($_GET['pk']) zeigt, dass es tatsächlich kein Array ist.

    $_SERVER['QUERY_STRING'] enthält alles, und du kannst das selbst parsen. Nur die Aufbereitung nach $_GET hat die bereits erwähnte Eingenart.

    Auch ein pk.join(",") oder ähnliches kommt nicht infrage, da Feldnamen in MySQL JEDES Zeichen beinhalten dürfen, was zwangsläufig irgendwann zu Problemen beim Exploden in PHP führt.

    Wenn du einen Wert in einen anderen Kontext bringst, und in dem Wert Zeichen enthalten sind, die im anderen Kontext eine Sonderbedeutung haben, so musst du dafür sorgen, dass sie diese verlieren. Dieses Prinzip gilt immer. Die Behandlung ist meist ein Maskieren.

    Du willst erwas ähnliches wie CSV haben, also könntest du dir CSV und dessen Regeln als Inspiration ansehen.

    Gibt es nicht eine andere Lösung?

    Aktuelles PHP kann JSON dekodieren.

    Lo!