Streiner: Kurzform zu if

Hallo.

  
$sql_exakt = "SELECT * FROM ".  
     $_GET['what']=="group" ? "links_groups" : "links"  
    ." WHERE `".  
     $_GET['what']=="group" ? "group" : "id"  
    ."`='".$_GET['which']."'";  
echo $sql_exakt;  

Mein Codeschnippsel hier bereitet mir Kopfschmerzen, denn er gibt nur

[quote]
id`='2'
[/quote]

aus. Wo ist der Rest hin?

Normalerweise würde ich vollständige if-Abfragen benutzen, doch ich will eine einfache SQL-Abfrage ja nicht auf 20 Zeilen ausweiten, wenn es doch eine auch tut (wobei ich hier zur Übersicht Zeilenumbrüche eingefügt habe, was den Code 6 Zeilen statt einer lang werden lässt).

Viele Grüße
Streiner

  1. n'abend,

    Hallo.

    $sql_exakt = "SELECT * FROM ".
         $_GET['what']=="group" ? "links_groups" : "links"
        ." WHERE ".      $_GET['what']=="group" ? "group" : "id"     ."='".$_GET['which']."'";
    echo $sql_exakt;

      
    schon mal dran gedacht, dass du diese "trinären Operatoren" (#selfhtml:Henryk würde das übrigens gerne den Dreifaltigkeistsoperator nennen und #selfhtml:goetz findet das toll) in Klammern setzen möchtest?  
      
    ~~~php
    $sql_exakt = "SELECT * FROM ".  
         ( $_GET['what']=="group" ? "links_groups" : "links" )  
        ." WHERE `".  
         ( $_GET['what']=="group" ? "group" : "id" )  
        ."`='".$_GET['which']."'";  
    echo $sql_exakt;
    

    Dann würden deine kurz-IFs auch ausgewertet werden, wie man es sich vorstellen würde.

    Normalerweise würde ich vollständige if-Abfragen benutzen, doch ich will eine einfache SQL-Abfrage ja nicht auf 20 Zeilen ausweiten, wenn es doch eine auch tut (wobei ich hier zur Übersicht Zeilenumbrüche eingefügt habe, was den Code 6 Zeilen statt einer lang werden lässt).

    Für genau solche Fälle gibt es den "trinären Operator".

    weiterhin schönen abend...

    --
    Freundlich wie man war, hat man mir Großbuchstaben geschenkt.
    sh:( fo:# ch:# rl:° br:> n4:& ie:{ mo:} va:) de:] zu:} fl:{ ss:? ls:[ js:|
  2. $sql_exakt = "SELECT * FROM ".
         $_GET['what']=="group" ? "links_groups" : "links"
        ." WHERE ".      $_GET['what']=="group" ? "group" : "id"     ."='".$_GET['which']."'";
    echo $sql_exakt;

      
    Hallo,  
      
    Nur als Anmerkung: Du Solltest die $\_GET-Werte nicht direkt in SQL-Anweisungen und ähnliches packen. Wer weiß, was irgendwelche Scriptkiddies da alles reinschreiben? Zusätzliche Anführungszeichen und befehle wären z.B. möglich...
    
    1. Hallo

      $sql_exakt = "SELECT * FROM ".
           $_GET['what']=="group" ? "links_groups" : "links"
          ." WHERE ".      $_GET['what']=="group" ? "group" : "id"     ."='".$_GET['which']."'";
      echo $sql_exakt;

      
      >   
      > Nur als Anmerkung: Du Solltest die $\_GET-Werte nicht direkt in SQL-Anweisungen und ähnliches packen. Wer weiß, was irgendwelche Scriptkiddies da alles reinschreiben? Zusätzliche Anführungszeichen und befehle wären z.B. möglich...  
        
      Dies trifft genau \_hier\_ nicht zu. Er übergibt nicht den Wert von $\_GET['what'] in den Query sondern entscheidet anhand dessen Wertes, ob "links\_groups" oder "links" bzw. "group" oder "id" in den Query eingesetzt werden sollen. Und die sind im Skript fest vorgegeben.  
        
      Wird der Wert von GET- oder POST-Parametern im Query verwandt, trifft deine Anmerkung zu. Dann benutze man die Funktion `mysql_real_escape_string`{:.language-php}, um den Wert zu maskieren.  
        
      Tschö, Auge  
      
      -- 
      Die Musik drückt aus, was nicht gesagt werden kann und worüber es unmöglich ist zu schweigen.  
      (Victor Hugo)  
        
      [Veranstaltungsdatenbank Vdb 0.1](http://termindbase.auge8472.de/)
      
      1. Dies trifft genau _hier_ nicht zu. Er übergibt nicht den Wert von $_GET['what'] in den Query sondern entscheidet anhand dessen Wertes, ob "links_groups" oder "links" bzw. "group" oder "id" in den Query eingesetzt werden sollen. Und die sind im Skript fest vorgegeben.

        Zumindest von $_GET["which"] wird in dem geposteten Codeteil keine nähere Prüfung gemacht. Aber auch sonst bin ich der Meinung, dass man besser GET-Parameter vorher überprüfen und dann immer in normale Variablen schreiben sollte. Dann kann man ganz einfach sagen, das alle $_GET, $_COOKIE und ähnliche Varibablen ungeprüft sind und potentiell Mist enthalten, während normale Variablen vorher (zumindest grundlegend) überprüft sind und nur das enthalten, was sie auch enthalten sollen.

        1. Hallo

          Dies trifft genau _hier_ nicht zu. Er übergibt nicht den Wert von $_GET['what'] in den Query sondern entscheidet anhand dessen Wertes, ob "links_groups" oder "links" bzw. "group" oder "id" in den Query eingesetzt werden sollen. Und die sind im Skript fest vorgegeben.

          Zumindest von $_GET["which"] wird in dem geposteten Codeteil keine nähere Prüfung gemacht.

          Ups, den hatte ich übersehen.

          Aber auch sonst bin ich der Meinung, dass man besser GET-Parameter vorher überprüfen ...

          Ja, eine Prüfung darauf, ob die übergebene Variable einen erwarteten Wert hat, ist wichtig.

          ... und dann immer in normale Variablen schreiben sollte.

          Warum sollte man das "immer" tun? Manchmal mag das ja sinnvoll sein, meist (zumindest bei meiner Vorgehensweise) ist es nicht sinnvoll. Der große Vorteil eines $_POST, $_GET, $_SESSION etc. -Wertes ist ja, dass er, bzw. die variable ansich, superglobal ist. Ich kann ihn innerhalb jeglicher Funktion verwenden, ohne ihn dieser Funktion bekannt machen zu müssen.

          Tschö, Auge

          --
          Die Musik drückt aus, was nicht gesagt werden kann und worüber es unmöglich ist zu schweigen.
          (Victor Hugo)
          Veranstaltungsdatenbank Vdb 0.1
          1. ... und dann immer in normale Variablen schreiben sollte.

            Warum sollte man das "immer" tun? Manchmal mag das ja sinnvoll sein, meist (zumindest bei meiner Vorgehensweise) ist es nicht sinnvoll. Der große Vorteil eines $_POST, $_GET, $_SESSION etc. -Wertes ist ja, dass er, bzw. die variable ansich, superglobal ist. Ich kann ihn innerhalb jeglicher Funktion verwenden, ohne ihn dieser Funktion bekannt machen zu müssen.

            Meine Meinung halt. Ich halte es zudem für unübersichtlich irgendwo mitten innerhalb von Klassen und Verschachtelungen direkt auf GET-Parameter zuzugreifen. Da benutze ich dann lieber eine Klasse/Funktion, die mir das ganze Zeugs zurückgibt bzw. lese vorher aller benötigten Parameter in ein Array oder vergleichbares ein.