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

icke79

Mitglied
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";
 

Yaslaw

alter Rempler
Moderator
Der Code ist leider nicht gerade selbstsprechend. Auch die Formatierung hilft beim Lesen nicht, da sie sehr chaotisch ist.

Welche $mze? beinhalten diese 2 Suchbegriffe?
Welche $klausel betrifft es?

AM einfachsten lässt du dir mal dein $sql ausgeben uns postest es hier
[PHP][MySQLi] Debug Queries [Yaslaw.Info]
 

icke79

Mitglied
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

alter Rempler
Moderator
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
 

icke79

Mitglied
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
 

icke79

Mitglied
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!!
 

icke79

Mitglied
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

alter Rempler
Moderator
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