[MySQL] AND anweisung

web2null

ehem. assactions
ID: 131418
L
20 April 2006
1.775
165
Hab hier nen kleinen code und ich denke da ist was mit der SQL falsch, denn bei 0 wird es ausgegeben bei 1 und 2 nicht, aber wenn ich die $account im echo ausgeben werden sie ausgegenen, ich denke da ist was am select faul

PHP:
if ("$account" == "0" ){
  $sql = mysql_query("SELECT * FROM items WHERE status = '0' ORDER BY id DESC");
}
if ("$account" == "1" ){
  $sql = mysql_query("SELECT * FROM items WHERE status = '0' AND status = '1' ORDER BY id DESC");
}
if ("$account" == "2" ){
  $sql = mysql_query("SELECT * FROM items WHERE status = '0' AND status = '1' AND status = '2' ORDER BY id DESC");
}
 
Eine Spalte kann immer nur genau einen Wert haben. Dein Code ist also sinnfrei.
 
also um es eben zu erklären, bin warschnlich aufn holzweg

es gibt 3 account statuse 0, 1, 2. Nun möchte ich das account 0 nur die ausgaben bekommt wo der status 0 ist, account 1 soll 0 und 1 ausgeben und account 2 soll 0, 1, 2 ausgeben
 
habs nun noch leicher gelöst xD warum denk ich blos als erstes immer so kompliziert

PHP:
if ("$account" == "0" ){
  $sql = mysql_query("SELECT * FROM items WHERE status = '0' ORDER BY id DESC");
}
if ("$account" == "1" ){
  $sql = mysql_query("SELECT * FROM items WHERE status <= '1' ORDER BY id DESC");
}
if ("$account" == "2" ){
  $sql = mysql_query("SELECT * FROM items WHERE status <= '2' ORDER BY id DESC");
}
 
Das is auch sinnfrei. Die <=-Relation die du meinst, ist die numerische. Warum versuchst du Strings zu "vergleichen"? Is doch Quark. Derselbe, wie in PHP, nur dass bei MySQL dieser Murks zu anderen Ergebnissen führt.

Ich seh schon den Thread kommen, warum die Datenbank meint, 11 wäre kleiner als 2 :LOL:
 
es wird ehh nur bis 2 gehen :p - ja ich weiss man könnte es besser machen, ich bin einfach zu blöd :ugly:
 
Dieser blöder Code bringt aber auch andere, die diesen Murks hier im Forum lesen, auf blöde Ideen und das ist nicht wirklich konstruktiv. Also bitte korriger den Code entsprechend und poste die ordentliche Lösung, wenn du schon weißt, dass es falsch is.
 
Wäre da eigentlich nicht noch ein Switch schneller? Ich denke zum späteren Erweitern wäre ein Switch generell sinnvoller...

Also so etwas in diese Richtung (Fehler den tH meint auch behoben soweit ich weiss):

PHP:
Switch($account) {
 Case 0:
   $sql = mysql_query("SELECT * FROM items WHERE status = 0 ORDER BY id DESC");
   Break;
 Case 1:
   $sql = mysql_query("SELECT * FROM items WHERE status <= 1 ORDER BY id DESC");
   Break;
 Case 2:
   $sql = mysql_query("SELECT * FROM items WHERE status <= 2 ORDER BY id DESC");
   Break;
 Default:
   $sql = mysql_query("SELECT * FROM items WHERE status = 0 ORDER BY id DESC");
}
 
Wäre da eigentlich nicht noch ein Switch schneller?
Ne, is ja immer noch derselbe Code.
Wenn du sparen willst, dann setz die Variable - nachdem sie vorher geprüft wurde - direkt in die Query ein. Is doch sonst alles gleich, also warum dreifach denselben Code verwenden?
Guter Einwand, aber die AND-Verknüpfung funktioniert da trotzdem ned. Auch SET hat nur einen Wert; der zwar in der Potenzmenge liegt, aber trotzdem isses nur einer.
 
Wäre es nicht so richtig:

PHP:
if ($account == "0" ){
  $sql = mysql_query("SELECT * FROM items WHERE status = '0' ORDER BY id DESC");
}elseif ($account == "1" ){
  $sql = mysql_query("SELECT * FROM items WHERE status = '1' OR status = '0' ORDER BY id DESC");
}elseif ($account == "2" ){
  $sql = mysql_query("SELECT * FROM items WHERE status = '2' OR status = '1' OR status = '0' ORDER BY id DESC");
}

Oder habe ich etwas falsch verstanden? :-?
 
Nein, das is wieder der Quark, den besser keiner lesen sollte :-?
 
Warum einfach wenns auch schwer geht?

Annahme: Es gibt keine neg. Zahlen
PHP:
mysql_query('SELECT * FROM items WHERE status <= ' . $account . ' ORDER BY id DESC');

Todo:
  • Select * :sick:
  • Schutz vor SQL-Injections
 
Warum einfach wenns auch schwer geht?

Annahme: Es gibt keine neg. Zahlen
PHP:
mysql_query('SELECT * FROM items WHERE status <= ' . $account . ' ORDER BY id DESC');

Todo:
  • Select * :sick:
  • Schutz vor SQL-Injections

Dann doch lieber erst überprüfen,so erschlagen wir gleich die unschöne string-nutzung und müssen uns keine Sorge um Injections machen

PHP:
if($account>=0)
mysql_query('SELECT * FROM items WHERE status <=  . $account .  ORDER BY id DESC');
 
  1. funktioniert dein Code wegen Single-Quotes nicht
  2. ist dein Code immernoch unsicher :!:
    Unbedingt im PHP-Manual nochmal die Themen über autom. Casting der Variablen lesen:
    PHP:
    $account = 'some Injection';
    var_dump($account >= 0); // bool(true)

Edit: das dies nicht das Ende der Weisheit ist, sollte klar sein ;)
Bei mir würde es so aussehen (Zend_Db):
PHP:
$user = $db->fetchAll('SELECT col1, col2, col3 FROM items WHERE status <= ? ORDER BY id DESC', $account);
 
1. ok, das mit den singlequotes hab ich total verpennt
2. klar, das nonplusultra ists nicht, ne überprüfung aufs numerische kann nie schaden

wollte ja auch nciht groß klugscheißen, nur noch ergänzen
 
klar, hatte mich nur vertan und hatte die Konkatenation innerhalb der inneren Singlequotes gesehen, von den äußeren singles, die in vorherigen Beispielen noch doubles waren mal ganz zu schweigen

Ist doch egal, ich wollte ja nur darauf hinweisen, dass die kleine abfrage das ganze schon etwas angenehmer macht. Im zweifelsfall halt noch nen is_numeric oder typecast und gut is
 
Code:
mysql_query(sprintf(SELECT * FROM items WHERE status <= %d ORDER BY id DESC", $account)) or die(mysql_error());
Stellt sicher dass digits eingefuegt werden, keine switch/if-else statements.:D