[Variablen] PHP/MySQL: Filterproblem...

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

  • [Variablen] PHP/MySQL: Filterproblem...

    Hallo,

    ich habe gerade angefangen mit PHP und MySQL ein Script zu schreiben. Wie man hier: URL sehen kann möchte ich nach verschiedenen Modi Filtern. Das heißt wenn jemand z.B. 2on2 "anhackt" soll die MySQL Query entsprechend die Einträge rausfiltern...

    Allerdings tritt bei meiner Umsetzung folgendes Problem auf: Sobald jemand 1on1 und irgendein anderen Modus anklickt funktioniert alles prima, nur sobald man 1on1 nicht aktiviert dafür aber ein anderen Modi, gibt es Fehler in der Syntax. Was auch logisch ist weil gleich nach "WHERE Modus LIKE" ein "OR" kommt... hier der CODE:

    [COLOR=red]<?
    @$one = $HTTP_POST_VARS['1on1'];
    @$two = $HTTP_POST_VARS['2on2'];
    @$three = $HTTP_POST_VARS['3on3'];
    @$four = $HTTP_POST_VARS['4on4'];
    @$five = $HTTP_POST_VARS['FFA'];
    @$five = $HTTP_POST_VARS['FFA'];
    @$sortby = $HTTP_POST_VARS['dsort'];


    if(isset($one) || isset($two) || isset($three) || isset($four) || isset($five)){ $filter_modi = "WHERE Modus LIKE $one $two $three $four $five";}
    else{ $filter_modi = "";}
    echo "<br><b>Teil Query Anweisung:</b>".$filter_modi.$sortby."<br><br>";



    $res = mysql_query("SELECT * FROM $sqlTable $filter_modi $sortby") or die("Nix geht: ".mysql_error());
    $num = mysql_num_rows($res);
    $i = 0;
    while ( $i < $num )
    {
    $row = mysql_fetch_array($res);
    echo $row['Modus']." - ".$row['Datum']."<br>";
    $i++;}

    ?>[/COLOR]

    Ich habe leider absolut keine Idee wie ich dem die richtige Syntax "beibringen" soll... vieleicht hat ja von euch einer eine Idee?

    Ich hoffe jemand hat mich verstanden... Bei
    Teil Query Anweisung:
    wird die Teilsyntax ausgegeben damit man sich orentieren kann welcher Filter was ausgibt....
    [SIZE=1]Projekte:
    wartower.de | planetd2.de

  • #2
    Code:
    <input type="checkbox" name="2on2" value=" OR '2on2'" >
    ist suboptimal, weil unflexibel und unsicher.

    besser machst du folgendes:
    Code:
    <input type="checkbox" name="typ[]" value="1on1" >
    <input type="checkbox" name="typ[]" value="2on2" >
    damit werden die daten als array übergeben => $_POST['typ'][0], $_POST['typ'][1] ... das where lässt sich dann mit implode() zusammenstellen. such hier im forum mal nach checkbox(en) ... die problemchen gabs schon sehr häufig.
    Kissolino.com

    Kommentar


    • #3
      Du darfst das "OR" nicht generell in die Variablen packen, sondern musst dynamisch ermitteln wann und ob ein "OR" gesetzt werden muss.

      Kommentar


      • #4
        Original geschrieben von DSB
        Du darfst das "OR" nicht generell in die Variablen packen, sondern musst dynamisch ermitteln wann und ob ein "OR" gesetzt werden muss.
        Jo das ist mit scho klar, nur habe ich absolut kein Plan wie ich das machen soll.... mit if oder wie auch immer?
        [SIZE=1]Projekte:
        wartower.de | planetd2.de

        Kommentar


        • #5
          Wie ermittelst Du denn für Dich selbst wann ein "OR" gesetzt werden muss?
          Diese Regel, die Du dann erkennst, musst Du programmtechnisch auf Deinen Abfragestring anwenden.

          Kommentar


          • #6
            Naja.... man kann das Array per count($typ); abfragen und wenn der Wert == 0 ist , dann soll die Syntax WHERE Modus LIKE '$typ[0]'

            Wenn es ungleich 0 ist muss man wohl eine schleife reinbauen.
            $filter = "WHERE Modus LIKE".$typ[0];
            for($x=1;$x <= $count;$x++){

            $filter .= " OR".$typ[$x];}

            Kann das so in die Richtung gehen? Habs noch nicht ausprobiert .....
            [SIZE=1]Projekte:
            wartower.de | planetd2.de

            Kommentar


            • #7
              kann es ... aber implode ist einfcher ... denk mal ein bischen "um die ecke"
              Kissolino.com

              Kommentar


              • #8
                Also ich habe jetzt alle 5 checkboxen den namen wahl[0] bis wahl[4] zugewiesen....

                nun habe ich das zusammengewerkelt und es klappt einfach net ich weis auch nicht wie ich das sonst umsetzen soll.....

                <?
                $count_modus = count($wahl);
                if($count_modus == 1){
                $filter = "WHERE Modus LIKE '".$wahl[0].$wahl[1].$wahl[2].$wahl[3].$wahl[4]."'";}
                elseif($count_modus > 1 && $count_modus < 4){
                $filter = "WHERE Modus LIKE '".$wahl[0].$wahl[1].$wahl[2].$wahl[3].$wahl[4];
                $filter .= implode("\' OR \'", $wahl); }


                Das wählen einzelner Boxen geht jetzt aber dafür der rest nicht....

                PS: Ich muss den Boxen die indezes fest vergeben, weil ich sonst nicht abfragen kann ob die Box checked oder nicht checked ist....
                [SIZE=1]Projekte:
                wartower.de | planetd2.de

                Kommentar


                • #9
                  Wenn ich die Indezes der Checkboxen automatisch vergeben lasse, sprich name=wahl[] und mit diesem COde abfrage:

                  $count_modus = count($wahl);
                  if($count_modus == 1){
                  $filter = "WHERE Modus LIKE '".$wahl[0]."'";}
                  elseif($count_modus > 1 && $count_modus < 6){
                  $filter = "WHERE Modus LIKE '".$wahl[0]."'";
                  for($x=1;$x < $count_modus;$x++){
                  $filter .= " OR '".$wahl[$x]."'"; }}

                  Funktioniert es perfekt... nur weis ich dann nicht wie ich die Checkupboxen als "gechecked" oder "uncheckt" markieren soll.... schließlich funktioniert das hier nicht mehr korrekt:

                  <input type="checkbox" name="wahl[1]" value="2on2" <? if(isset($wahl[1])) echo "checked";?>>


                  Wohl keiner eine IDee?
                  Zuletzt geändert von Perpetuum; 13.02.2004, 19:46.
                  [SIZE=1]Projekte:
                  wartower.de | planetd2.de

                  Kommentar


                  • #10
                    Das funktioniert aber nur, wenn die erste Option auch angehakt wird.
                    Das hier sollte alle Fälle abdecken:
                    PHP-Code:
                    $like="";
                    if (
                    is_array($wahl))
                    {
                       foreach (
                    $wahl AS $bedingung)
                       {
                        if (
                    strlen($like)>0$like.=" OR";
                        
                    $like.=" modus='".$bedingung."'";
                       }
                       
                    $filter "WHERE".$like;

                    So wird ein "OR" gesetzt, sobald es bereits eine Bedingung in dem String gibt.
                    Das ist dann der Fall, wenn der String mehr als 0 Zeichen enthält.

                    Oder aber noch einfacher mit Implode:
                    PHP-Code:
                    $filter="WHERE modus='".implode("' OR modus='",$wahl)."'"
                    Zuletzt geändert von DSB; 13.02.2004, 20:46.

                    Kommentar


                    • #11
                      Hallo,

                      habe es nun so hinbekommen wie ich es haben wollte... zwar recht umständlich aber anderes versteh ich das nicht mit diesem implode.

                      PHP-Code:
                      <input type="checkbox" name="wahl[]" value="1on1" <? if($wahl[0] == "1on1" || $wahl[1] == "1on1" || $wahl[2] == "1on1" || $wahl[3] == "1on1" || $wahl[4] == "1on1") echo "checked"; ?>> 1on1 
                              <input type="checkbox" name="wahl[]" value="2on2" <? if($wahl[0] == "2on2" || $wahl[1] == "2on2" || $wahl[2] == "2on2" || $wahl[3] == "2on2" || $wahl[4] == "2on2") echo "checked"; ?>> 2on2<br>
                              <input type="checkbox" name="wahl[]" value="3on3" <? if($wahl[0] == "3on3" || $wahl[1] == "3on3" || $wahl[2] == "3on3" || $wahl[3] == "3on3" || $wahl[4] == "3on3") echo "checked"; ?>> 3on3 
                              <input type="checkbox" name="wahl[]" value="4on4" <? if($wahl[0] == "4on4" || $wahl[1] == "4on4" || $wahl[2] == "4on4" || $wahl[3] == "4on4" || $wahl[4] == "4on4") echo "checked"; ?>> 4on4 <br> 
                              <input type="checkbox" name="wahl[]" value="FFA" <? if($wahl[0] == "FFA" || $wahl[1] == "FFA" || $wahl[2] == "FFA" || $wahl[3] == "FFA" || $wahl[4] == "FAA") echo "checked"; ?>> FFA
                              </td>
                            <td width="26%" rowspan="2" valign="top"><input name="dsort" type="radio" value="DESC" <? if($dsort == "DESC"){ echo "checked";} ?> checked>
                              neusten zuerst<br>
                              <input type="radio" name="dsort" value="ASC" <? if($dsort == "ASC"){ echo "checked";} ?>>
                              &auml;ltesten zuerst</td>
                            <td width="54%" rowspan="2">&nbsp;</td>
                          </tr>
                          <tr>
                            <td><div align="center">
                                <input name="Submit" type="submit" id="Submit" value="Filtern">
                              </div></td>
                          </tr>
                        </table>
                      </form>
                      <br>
                      <table width="70%" border="0" align="center" cellpadding="2" cellspacing="1">
                        <tr> 
                          <td>
                            <?
                      $count_modus = count($wahl);
                      if($count_modus == 1){ 
                          $filter = "WHERE Modus LIKE '".$wahl[0]."'";}
                      elseif($count_modus > 1 && $count_modus < 6){ 
                          $filter = "WHERE Modus LIKE '".$wahl[0]."'"; 
                          for($x=1;$x < $count_modus;$x++){
                          $filter .= " OR '".$wahl[$x]."'"; }}


                      if($HTTP_POST_VARS['dsort'] == "" || $HTTP_POST_VARS['dsort'] == "DESC"){
                      $sortby = " ORDER BY id DESC";
                      }else{
                      $sortby = " ORDER BY id ASC";
                      }
                      http://www.eduardseibel.de/projekte/test/index.php
                      [SIZE=1]Projekte:
                      wartower.de | planetd2.de

                      Kommentar


                      • #12
                        Original geschrieben von Perpetuum

                        if($wahl[0] == "1on1" || $wahl[1] == "1on1" || $wahl[2] == "1on1" || $wahl[3] == "1on1" || $wahl[4] == "1on1") echo "checked";
                        Schau Dir mal die Funktion in_array() an.

                        Kommentar


                        • #13
                          Original geschrieben von DSB
                          Schau Dir mal die Funktion in_array() an.
                          Vielen Dan für den Tipp, hab ihn gleich angewand . Falls es doch noch jemanden interessiert ich habe das nun mit recht wenig Code zum gleichen Ergebnis geschaft: http://www.eduardseibel.de/projekte/test/index.php

                          PHP-Code:
                          ...<? 
                          include('includes/main.inc.php');

                          if(isset($wahl)){ 
                          $check1 = in_array("1on1", $wahl);
                          $check2 = in_array("2on2", $wahl);  
                          $check3 = in_array("3on3", $wahl);  
                          $check4 = in_array("4on4", $wahl);  
                          $check5 = in_array("FFA", $wahl);  




                          ?>
                          <input type="checkbox" name="wahl[]" value="1on1" <? if($check1 == true){ echo "checked"; } ?>> 1on1 
                                  <input type="checkbox" name="wahl[]" value="2on2" <? if($check2 == true){ echo "checked"; } ?>> 2on2<br>
                                  <input type="checkbox" name="wahl[]" value="3on3" <? if($check3 == true){ echo "checked"; } ?>> 3on3 
                                  <input type="checkbox" name="wahl[]" value="4on4" <? if($check4 == true){ echo "checked"; } ?>> 4on4 <br> 
                                  <input type="checkbox" name="wahl[]" value="FFA" <? if($check5 == true){ echo "checked"; } ?>> FFA
                                  </td>
                                <td width="23%" rowspan="2" valign="top"><input name="dsort" type="radio" value="DESC" <? if($dsort == "DESC"){ echo "checked";} ?> checked>
                                  neusten zuerst<br>
                                  <input type="radio" name="dsort" value="ASC" <? if($dsort == "ASC"){ echo "checked";} ?>>
                                  &auml;ltesten zuerst</td>
                                <td width="51%" rowspan="2">&nbsp;</td>
                              </tr>
                              <tr>
                                <td><div align="center">
                                    <input name="Submit" type="submit" id="Submit" value="Filtern">
                                  </div></td>
                              </tr>
                            </table>
                          </form>
                          <table width="65%" border="0" align="center" cellpadding="2" cellspacing="1">
                            <tr>
                              <td>
                              <?
                          if(isset($wahl)){
                          $filter= "WHERE Modus IN ('".implode(" ', '",$wahl)."')";
                          }

                          if($HTTP_POST_VARS['dsort'] == "" || $HTTP_POST_VARS['dsort'] == "DESC"){
                          $sortby = " ORDER BY id DESC";
                          }else{
                          $sortby = " ORDER BY id ASC";
                          }
                              
                                  
                          echo "<font color=FFFFFF><b>Filter:</b> $filter $sortby</font>";

                              
                              ?>
                              </td>
                            </tr>
                          </table>
                          <br>
                          <table width="65%" border="0" align="center" cellpadding="0" cellspacing="1">
                            <tr>
                              <td bgcolor="#333333">
                          <table width="100%" border="0" align="center" cellpadding="4" cellspacing="0">
                                  <tr> 
                                    <td width="20%" class="td3"> <div align="center"><strong>Details</strong> 
                                      </div></td>
                                    <td width="65%" class="td3"><strong>Spieler &amp; Kommentar</strong></td>
                                    <td width="15%" class="td3"> <div align="center"><strong>DL</strong></div></td>
                                  </tr>
                          <?
                          $res = mysql_query("SELECT * FROM $sqlTable $filter $sortby") or die("Scheint ein Fehler vorzuliegen: ".mysql_error());
                          [SIZE=1]Projekte:
                          wartower.de | planetd2.de

                          Kommentar

                          Lädt...
                          X