Estoy tratando de crear una consulta que filtre una tabla basada en diferentes selecciones desplegables de HTML. Tengo 5 menús desplegables separados y cada vez que hago una selección, el valor se pasa a una consulta (y se almacena hasta que se borra) que llena los datos en la página. Sin embargo, esta consulta solo muestra datos si se han realizado todas las selecciones. Tampoco veo ningún error. ¿Puede alguien explicarme por qué sucede esto y ofrecer una solución para mostrar los datos sin importar la cantidad de selecciones desplegables que se hayan realizado?

$q = ($_GET['q']);
$date = ($_GET['data']);
$val = ($_GET['val']);
$rep = ($_GET['rep']);
$group = ($_GET['group']);

$sql ="SELECT [Customer]
      ,[Collector Name]
      ,[Bill Date]
      ,[Days Until Next Action]
      ,[Next Action]
      ,[Next Bill Date]
      ,[Billed Status]
      ,[Billed Amount]
      ,[Total Current Balance]
      ,CAST([Payment Due Date] as DATE) as [Payment Due Date]
      ,[Notes]
      ,[Payment Status]
      ,[Line Status]
        FROM [Test_Spec_Bill]
        WHERE ([Collector Name] = '$q' OR datalength([Collector Name]) = 0)
        AND ([Date Group - Filter] = '$date' OR datalength([Date Group - Filter]) = 0)
        AND ([Billed Status] = '$val' OR datalength([Billed Status]) = 0)
        AND ([Parent Report Code] = '$rep' OR datalength([Parent Report Code]) = 0)
        AND ([Balance Group - Filter] = '$group' OR datalength([Balance Group - Filter]) = 0)
1
Rataiczak24 10 sep. 2018 a las 18:05

3 respuestas

La mejor respuesta

Verifique la longitud de la variable, no el campo

En lugar de

WHERE ([Collector Name] = '$q' OR datalength([Collector Name]) = 0)

Debe ser:

WHERE ([Collector Name] = '$q' OR datalength('$q') = 0)
                                             ^^^^
4
Juan Carlos Oropeza 10 sep. 2018 a las 15:11

No estoy familiarizado con php, pero para sql creo que primero debe verificar si la variable no es nula y luego usarla, tal vez en su código php puede predeterminar el valor a nulo si el valor no está seleccionado.

SELECT
    [Customer]
   ,[Collector Name]
   ,[Bill Date]
   ,[Days Until Next Action]
   ,[Next Action]
   ,[Next Bill Date]
   ,[Billed Status]
   ,[Billed Amount]
   ,[Total Current Balance]
   ,CAST([Payment Due Date] AS DATE) AS [Payment Due Date]
   ,[Notes]
   ,[Payment Status]
   ,[Line Status]
FROM [Test_Spec_Bill]
WHERE (
('$q' IS NOT NULL
AND [Collector Name] = '$q')
OR DATALENGTH([Collector Name]) = 0
)
AND (('$date' IS NOT NULL
AND [Date Group - Filter] = '$date')
OR DATALENGTH([Date Group - Filter]) = 0
)
AND (('$val' IS NOT NULL
AND [Billed Status] = '$val')
OR DATALENGTH([Billed Status]) = 0
)
AND (('$rep' IS NOT NULL
AND [Parent Report Code] = '$rep')
OR DATALENGTH([Parent Report Code]) = 0
)
AND (('$group' IS NOT NULL
AND [Balance Group - Filter] = '$group')
OR DATALENGTH([Balance Group - Filter]) = 0
)
0
Markov 10 sep. 2018 a las 15:13

DATALENGTH = 0 nunca evaluará un valor NULL como cero porque para un valor NULL DATALENGTH devuelve NULL. Puede tratar con los valores de NULL antes de enviar la consulta o simplemente evaluar los casos de NULL como verdaderos utilizando IFNULL de esta manera.

 WHERE ([Collector Name] = '$q' OR datalength(IFNULL([Collector Name], 0)) = 4)
        AND ([Date Group - Filter] = '$date' OR datalength(IFNULL([Date Group - Filter], 0)) = 4)
        AND ([Billed Status] = '$val' OR datalength(IFNULL([Billed Status], 0)) = 4)
        AND ([Parent Report Code] = '$rep' OR datalength(IFNULL([Parent Report Code],0)) = 4)
        AND ([Balance Group - Filter] = '$group' OR datalength(IFNULL([Balance Group - Filter],0)) = 4)
0
Joe McCarty 10 sep. 2018 a las 15:29