Suche bei wechsel zwischen 2 und 3 stelligen Zahlen (99 auf 100)


#1
Hallo,

Ich hab ein, in meinen Augen seltsames Problem. Wenn ich etwas suche wo ich zwischen z.B. 88 und 90 suche, ist es kein Problem und ich bekomme Ergebnisse. Auch wenn ich z.B. genau nach 99 oder 100 oder 101 suche, bekomme ich Ergebnisse. Wenn ich jetzt aber zwischen 101 und 99 suche, bekomme ich auch keine Ergebnisse.
Das unten ist der Code zum suchen.
Und ich weiß, er ist anfällig für SQL Injektions, man kommt aber nur über unser Netzwerk auf den Server und auf die Seite nur mit Passwort. DEr einlog Zugang ist parametrisiert zum Schutz.

PHP:
<?php

        $If = 1;
        
        
            //Berechnungen
        $mze = doubleval($_POST['mz']) + doubleval($_POST['mzvar']);
        $mze2 = doubleval($_POST['mz']) - doubleval($_POST['mzvar']);
        $mz2e = doubleval($_POST['mz2']) + doubleval($_POST['mzvar2']);
        $mz2e2 = doubleval($_POST['mz2']) - doubleval($_POST['mzvar2']);
        $rrts = doubleval($_POST['rrt']) + doubleval($_POST['rrtv']);
        $rrtd = doubleval($_POST['rrt']) - doubleval($_POST['rrtv']);
        $rets = doubleval($_POST['retention_time']) + doubleval($_POST['retention_Time_var']);
        $retd = doubleval($_POST['retention_time']) - doubleval($_POST['retention_Time_var']);
        $farbwechsel = true;
            // Setzen von "WHERE"
    
    if ($mzx != "" or $mole != "" or $iden != "" or $cas != "" or $rrt != "" or $ret != "" or $molfo != "" or $comment != "")
    
    $start = "WHERE";
        
    
        // Suchen nach Name
        
        if($mole != "")
   {
          
    $klausel2 = "(Name LIKE '$mole')";
    $order = "ORDER BY RRT, mz1pos, mz1neg, mz2pos, mz2neg ASC";
   }

    // Suchen nach Masse
    
       if($mzx != "")
   {
  
   $klausel1 = "AND (mz1pos BETWEEN '$mze2' AND '$mze' or mz2pos BETWEEN '$mze2' AND '$mze' or mz3pos BETWEEN '$mze2' AND '$mze' or
                        mz4pos BETWEEN '$mze2' AND '$mze' or mz5pos BETWEEN '$mze2' AND '$mze' or mz6pos BETWEEN '$mze2' AND '$mze' or
                        mz7pos BETWEEN '$mze2' AND '$mze' or mz1neg BETWEEN '$mze2' AND '$mze' or mz2neg BETWEEN '$mze2' AND '$mze' or
                        mz3neg BETWEEN '$mze2' AND '$mze' or mz4neg BETWEEN '$mze2' AND '$mze' or mz5neg BETWEEN '$mze2' AND '$mze' or
                        mz6neg BETWEEN '$mze2' AND '$mze' or mz7neg BETWEEN '$mze2' AND '$mze' or MolecularMass BETWEEN '$mze2' AND '$mze')";
   }
        // Suchen nach 2. Masse
    
       if($mz2x != "")
   {
  
  $klausel10 = "AND (mz1pos BETWEEN '$mz2e2' AND '$mz2e' or mz2pos BETWEEN '$mz2e2' AND '$mz2e' or mz3pos BETWEEN '$mz2e2' AND '$mz2e' or
                        mz4pos BETWEEN '$mz2e2' AND '$mz2e' or mz5pos BETWEEN '$mz2e2' AND '$mz2e' or mz6pos BETWEEN '$mz2e2' AND '$mz2e' or
                        mz7pos BETWEEN '$mz2e2' AND '$mz2e' or mz1neg BETWEEN '$mz2e2' AND '$mz2e' or mz2neg BETWEEN '$mz2e2' AND '$mz2e' or
                        mz3neg BETWEEN '$mz2e2' AND '$mz2e' or mz4neg BETWEEN '$mz2e2' AND '$mz2e' or mz5neg BETWEEN '$mz2e2' AND '$mz2e' or
                        mz6neg BETWEEN '$mz2e2' AND '$mz2e' or mz7neg BETWEEN '$mz2e2' AND '$mz2e' or MolecularMass BETWEEN '$mz2e2' AND '$mz2e')";
   }

    // Suchen nach ID   
    
    if($iden != "")
   {
 
     $klausel3 = "AND (ID = '$iden')";
   }

    // Suchen nach CAS Nummer
    
        if($cas != "")
   {
  
     $klausel4 = "AND (CASNumber like '$cas')";
   }
    // Suchen nach RRT
             if($rrt != "")
   {
  
     $klausel6 = "AND (RRT between '$rrtd' and '$rrts')";
   }

    // Suchen nach Retention Time
    
        if($ret != "")
   {
  
     $klausel7 = "AND (Retentionszeit between '$retd' and '$rets')";
   }

// Suchen nach Summenformel

        if($molfo != "")
   {
  
     $klausel8 = "AND (MolecularFormula like '$molfo')";
   }
  
   // Suchen nach commentar

        if($comment != "")
   {
  
     $klausel9 = "AND (comment like '$comment')";
   }


    $klausel5 = "";
    
    //Welche Tabelle durchsuchen
    
 switch($_POST['Bib'])
 {
     case 'gcms':
 
                 $Bibliothek = "el.gcms";
                 break;
 
    case 'hsgc':
 
                 $Bibliothek = "el.hsgc";
                 break;
                
     case 'Siloxane':
 
                 $Bibliothek = "el.gcsiloxane";
                break;
    case 'LC':
 
                 $Bibliothek = "el.lcms";
                 break;
 
    case 'polare':
 
                 $Bibliothek = "el.lcpolaresubstanzen";
                 break;
                
     case 'Phthalate':
 
                 $Bibliothek = "el.lcphthalate";
                 break;
                
     case 'Proteine':
    
                 $Bibliothek = "el.lcproteine";
                 break;
                
     case 'additives':
 
                 $Bibliothek = "el.additives";
                 break;
                
     case 'blacklist':
        
                 $Bibliothek = "el.siloxaneblacklist";
                 break;

}

        // Gesamtsuchbefehl   
 
$sql = "SELECT * FROM $Bibliothek  $start  $klausel2  $klausel1 $klausel10  $klausel3  $klausel4 $klausel6 $klausel7 $klausel8 $klausel9 $klausel5 and valid !='no' $order";
 
#3
Hey,

Danke für die schnelle Antwort. Ich bin meist nicht sehr gut in formulierungen :-(

Vllt geht es so klarer;

Ich habe einen Eintrag mit dem Wert 99 einen anderen mit 100 und einen anderen mit 101..

Wenn ich nach 99 suche kommt 99
Wenn ich nach 100 suche kommt 100
wenn ich nach 101 suche kommt 101

wenn ich zwischen 99 und 101 suche kommt kein Ergebnis.

Es betrifft Klausel 1 und Klausel 10
ich suche zwischen mze2 und mze

"SELECT * FROM el.gcms WHERE (Name LIKE '%') AND (mz1pos BETWEEN '99' AND '101' or mz2pos BETWEEN '99' AND '101' or mz3pos BETWEEN '99' AND '101' or mz4pos BETWEEN '99' AND '101' or mz5pos BETWEEN '99' AND '101' or mz6pos BETWEEN '99' AND '101' or mz7pos BETWEEN '99' AND '101' or mz1neg BETWEEN '99' AND '101' or mz2neg BETWEEN '99' AND '101' or mz3neg BETWEEN '99' AND '101' or mz4neg BETWEEN '99' AND '101' or mz5neg BETWEEN '99' AND '101' or mz6neg BETWEEN '99' AND '101' or mz7neg BETWEEN '99' AND '101' or MolecularMass BETWEEN '99' AND '101') and valid !='no' ORDER BY RRT, mz1pos, mz1neg, mz2pos, mz2neg ASC "

Das ist der SQL befehl wenn ich zwischen 99 und 101 suche
 
Zuletzt bearbeitet:

Yaslaw

n/a
Moderator
#4
Den Fehler sieht man schnell.
zB hier:
SQL:
mz2pos BETWEEN '99' AND '101'
Du vergleichst das ganze als String. Also wird alphabetisch gearbeitet.
Die Wertereihenfolge währe etwa so (Beispiele)
Code:
1
10
100
100000
101
11
150
2
99
Man sieht, 100 ist da nicht zwischen 99 und 101 sondern davor.

Wenn du Zahlen vergleichen willst, dann lass die ' weg.
Also etwa so:
SQL:
mz2pos BETWEEN 99 AND 101
 
#5
Den Fehler sieht man schnell.
zB hier:
SQL:
mz2pos BETWEEN '99' AND '101'
Du vergleichst das ganze als String. Also wird alphabetisch gearbeitet.
Die Wertereihenfolge währe etwa so (Beispiele)
Code:
1
10
100
100000
101
11
150
2
99
Man sieht, 100 ist da nicht zwischen 99 und 101 sondern davor.

Wenn du Zahlen vergleichen willst, dann lass die ' weg.
Also etwa so:
SQL:
mz2pos BETWEEN 99 AND 101

Hey, Danke vielmals,

Dann hab ich nen kleines Problem. ich nutze Mssql (Vorgabe) und habe die Daten unter nvarchar. gespeichert. Wenn ich nun mit einem Befehlt den Datentyp ändern will bzw die daten in eine andere stelle mit dem Datentyp "float" kopieren will, kommt folgende Meldung

"
Meldung 8114, Ebene 16, Status 5, Zeile 1
Error converting data type varchar to float."

beim Befehl
update
el.gcms_2
set
mz1pos = mz1pos_old
 
#7
danke vielmals...ich schaue es mir mal an
Ich werd es aber nicht als Integer speixchern können, da es auch Decimalstellen gibt. Die Zahlen waren nur ein Beispiel,. Werde also float nehmen
Auch mal ein generelles Danke wieviel Mühe du dir gibst, den Leuten hier zu helfen! Respekt!!
 
#8
mm irgendwie will der Befehl nicht. Wenn ich schreibe

CAST NULLIF(<spalte>, <Wert wann "null">)as <Datentyp> from <Tabelle>
kommt:
Meldung 156, Ebene 15, Status 1, Zeile 1
Incorrect syntax near the keyword 'NULLIF'.

Wenn ich davor ein Select mache
Select CAST NULLIF(<spalte>, <Wert wann "null">)as <Datentyp> from <Tabelle>
kommt:
Meldung 245, Ebene 16, Status 1, Zeile 1
Conversion failed when converting the varchar value '218.1' to data type int.

Also genau sieht der Befehl wie folgt aus:

SQL:
Select CAST (NULLIF(mz1pos_old, 0)as float) from el.gcms_2
ohne das "Nullif" funktioniert das ganze teilweise
 

Yaslaw

n/a
Moderator
#10
NULLIF() habe ich per Google gefunden. Ich kenne MSSQL nicht. Ev. ist es nicht dasselbe. Such dir den passenden Befehl.
Und mache nach den Klammern jeweils ein Leerzeichen.
Zudem ev. beim NULLIF() den 2ten Paramter als String, das ja das Feld selber auch ein String ist.
SQL:
-- Dies
Select CAST (NULLIF(mz1pos_old, 0)as float) from el.gcms_2
-- ersetzen durch
Select CAST (NULLIF(mz1pos_old, "0") as float) from el.gcms_2
 
#11
So, als kurze Info. Ich habe nen bissl viel rumprobieren müssen, hab jetzt aber eine Lösung. Ich musste die "'" belassen, aber den Datentyp auf float ändern. Ohne die ' bekomme ich keine Ergebnisse.
 
#12
Ich nochmal ;-)
Ich habe das mit Nullif nicht hin bekommen. Ich vermute, dass die Tabelle das nicht zulässt, obwohl die einstellung ganz klar "NULL" Werte zulassen sagt.
Ich habe jetzt etwas anderes probiert...

PHP:
  switch($_POST['mz3pos'])
{
     case '':
                $mz3pos= NULL;
     }

  
   $sql = "UPDATE $Bibliothek SET    valid = '$valid', editedat = '$heute', editedby = '$userid', IP = '$ip' WHERE ID = $ID";

   $sql1 = "INSERT INTO $Bibliothek     (Name, mz1neg, mz2neg, mz3neg, mz4neg, mz5neg, mz6neg, mz7neg, mz1pos, mz2pos, mz3pos, mz4pos, mz5pos, mz6pos, mz7pos, RRT, Retentionszeit, CASNumber, MolecularMass, MolecularFormula, BoilingPoint, APCIneg, APCIpos, ESIneg, ESIpos, ownmeasurement, IDdegradationproduct, Linktospectra, Typcolumn, comment, edit, IP, created, valid) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'yes')";
    
   $params = array("$mole", "$mz1neg", "$mz2neg", "$mz3neg", "$mz4neg", "$mz5neg", "$mz6neg", "$mz7neg", "$mz1pos", "$mz2pos", "$mz3pos", "$mz4pos", "$mz5pos", "$mz6pos", "$mz7pos", "$rrt", "$ret", "$casn", "$molma", "$molfo", "$BoiPoi", "$APCIneg", "$APCIpos", "$ESIneg", "$ESIpos", "$measurement", "$IDdeg", "$link", "$column", "$comment", "$admin_userid", "$ip", "$heute");
Sprich, wenn die Eingabezeile "mz3pos" leer ist, setze ich die variable zum speichern = NULL...
Da wird aber trotzdem 0 als Ergebnis angezeigt wenn ich mir den Eintrag später anzeigen lasse.
Die variable wird aber richtig gesetzt. Wenn ich nämlich im "Switch / case" eine Zahl eingebe, wird die übernommen.
 

Yaslaw

n/a
Moderator
#14
Warum machst du einen Stringarray? Du kannst di Variabeln beim prepared direkt übergen
PHP:
$params = array($mole, $mz1neg, $mz2neg, $mz3neg, ...
Mit dem "$variable" machst aus aus einem Null wieder ein Leerstring

PHP:
$raw = null;
var_dump($raw);    // NULL
var_dump("$raw");   //string(0) ""

?>