Ankündigung

Einklappen
Keine Ankündigung bisher.

Variablen zusammensetzen

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Variablen zusammensetzen

    Hallo,

    ich arbeite an folgender Funktion:

    PHP-Code:

    $_SESSION
    ['gender'] = '1';
    $_SESSION['company'] = '1';

    $_POST['gender'] = '2';
    $_POST['company'] = '2';

    $array1 = array($_POST['gender'],$_POST['company']);
    $array2 = array($_SESSION['gender'],$_SESSION['company']);
    $result count(array_diff($array1$array2));

    if (
    $result != 0) {echo 'SQL-Update';} 
    Die Variablennamen der POST und SESSION-Werte, die ich vergleich sind immer identisch. Um Code einzusparen, würde ich das gerne abändern in der Art

    PHP-Code:

    $array 
    =array('gender''company');

    $result count(array_diff($_POST[.array.], $_SESSION[.array.])); 
    Geht so leider nicht. Hat jemand einen Lösungstip für mich.

    Gruss von Markus

  • #2
    Spart nicht unbedingt Code, macht das Ganze vielleicht etwas flexibler.

    PHP-Code:
    <?php

    $_SESSION
    ['gender'] = '2';
    $_SESSION['company'] = '1';
    $_SESSION['name'] = '1';

    $_POST['gender'] = '2';
    $_POST['company'] = '2';


    $check_keys = array('gender','company');
    $check_keys array_fill_keys($check_keysnull);

    $comp_array array_intersect_assoc($_POST,$_SESSION);

    $number_diff_values count(array_diff_key($check_keys$comp_array));

    if (
    $number_diff_values != 0) {echo 'SQL-Update';}

    Kommentar


    • #3
      Die Lösung kann fast wieder als Einzeiler gezeigt werden. Es bietet sich jedoch an das Problem etwas ausführlicher zu analysieren. Da fehlt beispielsweise im obigen Code komplett die Validierung der Eingabedaten.
      Aber ich fange mal von vorn an.
      Ganz allgemein haben wir doch Input-Werte vorliegen, die nicht unbedingt alle aus $_POST kommen müssen und auch nicht alle für eine Verarbeitung benötigt werden:
      PHP-Code:
      $input = [
        
      'time' => '16:04',
        
      'date' => '12.06.2016',
        
      'gender' => '2',
        
      'company' => '2',
      ]; 
      Im nächsten Schritt legen wir in einem Array fest welche Werte wir aus $input benötigen (Schlüssel) und wie diese Werte überprüft werden sollen. Dafür benutzen wir hier eine fiktive Klasse validate:
      PHP-Code:
      $filter = [
        
      'gender' => FILTER_VALIDATE_INT,
        
      'company'=> FILTER_VALIDATE_INT,
      ];

      $v = new Validate;
      $filterInput $v->validateArray($input$filter); 
      validateArray filtert mir die Werte für gender und company aus $input raus und prüft diese. Dies kann auch einfach ohne die Klasse mit PHP-Array- und Filter-Funktionen realisiert werden.
      Ist die Überprüfung erfolgreich, dann bekommen wir als $filterInput dies hier:
      PHP-Code:
      $filterInput = [
        
      'gender' => "2",
        
      'company' => "2",
      ]; 
      Nun müssen diese gefilterten Werte noch mit dem Bestand $record (bzw. $_SESSION) verglichen werden:
      PHP-Code:

      $record 
      = [
        
      'name' => 'x',
        
      'gender' => '1',
        
      'company'=> '2',
      ];

      $updateValues array_diff_assoc($filterInput$record);

      var_dump($updateValues); 
      $updateValues ist ein leeres Array wenn die Werte von $record aktuell sind. Für die hier gewählten Daten enthält $updateValues nur das Element 'gender' => "2".

      Bemerkungen:
      - Für das Verständnis lohnt es ein paar Beispiele mit unterschiedlichen Werten von $filterInput und $record durchzuspielen
      - Eine Klasse Validate nutze ich in der Realität schon einige Jahre mit Erfolg in mehreren kleinen Projekten.
      Die Valdierungsmöglichkeiten beschränken sich jedoch nicht allein auf die Filterfunktionen von PHP.

      LG jspit


      Kommentar


      • #4
        Vielen Dank Euch Beiden !

        Die erste Lösung entspricht genau dem, wie ich es mir vorgestellt hatte, die Zweite, auf Grundlage der erweiterten Analyse, werde ich zuerst für das bessere Verständnis tatsächlich noch mal mit unterschiedlichen Werten "durchspielen".

        Gruss und ein schönes Wochenende.

        Markus

        Kommentar


        • #5
          Ich habe mich jetzt noch mal mit der ersten Variante beschäftigt:

          PHP-Code:


          function compareData($check_keys) {

          $check_keys array_fill_keys($check_keysnull);

          $compare_array array_intersect_assoc($_POST,$_SESSION);

          $number_diff_values count(array_diff_key($check_keys$compare_array));

          if (
          $number_diff_values != 0) {return false;} else {return true;}

          }

          $keys = array('gender,'company'');

          switch(
          compareData($keys)) {case false$update 'yes'; break; default: $update 'no'; break;} 
          Das funktioniert soweit ganz gut. Nur wenn der Vergleichswert in der $_POST + $_SESSION-Variable ein Array ist, schlägt der Vergleich fehl. Ich müsste die Variablen also mit "implode" zum "String" umwandeln um sie so vergleichbar zu machen. Mir fehlt im Moment der Ansatz, wo ich innerhalb der Funktion die Werte daraufhin prüfen kann, ob es sich um ein Array handelt, daher wäre ich für einen Hinweis dankbar.

          Gruss Von Markus

          Kommentar


          • #6
            Eine Variable kann man vielfältig prüfen. Zum Beispiel mit is_int für Ganzzahlen, is_string für Zeichenketten und für Arrays gibt es das auch, bitte mal das Handbuch lesen, bevor man mit PHP arbeitet um wenigstens die grundlegenden Funktionen ein mal gesehen zu haben oder willst du hier jedes Mal nachfragen.

            Kommentar


            • #7
              Zitat von Jeff-Glenn-Fox Beitrag anzeigen
              Nur wenn der Vergleichswert in der $_POST + $_SESSION-Variable ein Array ist, schlägt der Vergleich fehl. Ich müsste die Variablen also mit "implode" zum "String" umwandeln um sie so vergleichbar zu machen. Mir fehlt im Moment der Ansatz, wo ich innerhalb der Funktion die Werte daraufhin prüfen kann, ob es sich um ein Array handelt, daher wäre ich für einen Hinweis dankbar.
              Da wird irgendwo in deinem Code wohl ein String-Cast von einem Array versucht. Das sollte auch eine Notice werfen. Für die betreffende Array-Funktion musst du dir wohl was anderes einfallen lassen müssen.
              Arrays können in PHP auch direkt verglichen werden (s.Array-Operatoren). Du kannst da u.U. auf irgendwelche zweifelhafte Umwandlungen verzichten.

              Deine Funktion ist auch so gut wie nicht testbar. Funktionen sollten vom Grundsatz ein Ergebnis unabhängig von irgendwelchen Variablen aus der Umgebung liefern. Oder anders formuliert sollte das Ergebnis einer Funktion nur von den übergebenden Parametern abhängig sein. Im Klartext $_POST und $_SESSION haben in einer Funktion nicht verloren. Übergebe diese Arrays als Parameter.

              Überlege auch was passieren soll wenn in $check_key ein Schlüssel übergeben wird der in deinen Vergleichsarrays fehlt ! (z.B. bei Schreibfehler wie $keys = array('genders,'company''));

              LG jspit

              Kommentar


              • #8
                Vielen lieben Dank!.

                Da waren für mich ein wichtige grundsätzliche Denkanstöße in Deinem Beitrag enthalten, die mich veranlassen, die ganze Funktion nochmal neu zu überdenken.

                Gruss

                von Markus

                Kommentar


                • #9
                  Ergänzend zu #7:
                  Wenn du aus der Funktion ein Array zurückgibst welche alle neuen (geänderten) Werte enthält kannst du diese Information gleich für die Aktualisierung der DB oder was auch immer benutzen.
                  Sind keine Änderungen notwendig gib ein leeres Array zurück oder false bei einem Fehler.

                  Kommentar

                  Lädt...
                  X