[php][sql]Null omzeilen in sql AND statement

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb de volgende SQL statement gemaakt in php (namen veranderd):

PHP:
1
$query="select * from project where var1=$var1 AND var2='$var2' AND var3=$var3 AND var4='$var4' AND var5='$var5'";


nu heb ik het probleem dat wanneer een "$var" NULL (niet ingevult in form) is, dat hij dan niks vindt wanneer bijvoorbeeld $var1 wel is ingevuld. Hoe kan ik dit omzijlen?

Het moet dus mogelijk zijn om bijvoorbeeld $var1 en $var5 in te vullen en de andere 3 niet. En dat dan het SQL statement dit wordt:

select * from project where var1= 'piet' AND var5='jan'";

En dus niet:

select * from project where var1='piet' AND var2=NULL AND var3=NULL AND var4=NULL AND var5= 'jan'

want dan krijg je geen resultaat

Acties:
  • 0 Henk 'm!

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 21:21

gorgi_19

Kruimeltjes zijn weer op :9

JE query dynamisch opbouwen, lijkt me de enige oplossing.

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Acties:
  • 0 Henk 'm!

  • twopack
  • Registratie: Februari 2001
  • Laatst online: 02-09 09:09
Hmm is lang geleden maar ik denk dat je een left-join nodig hebt.
Someone please correct me if i'm wrong.

specs


Acties:
  • 0 Henk 'm!

  • Annie
  • Registratie: Juni 1999
  • Laatst online: 25-11-2021

Annie

amateur megalomaan

bouw je query afhankelijk van de gegeven waarden uit, dus:
PHP:
1
2
3
4
5
6
// 1=1 is toegevoegd zodat de vervolgstatements met AND mogen beginnen
$query = "select * from project where 1=1"; 
// uitbouwen
if (conditie) $query .= " AND kol=var";
if (conditie) $query .= " AND kol2=var2";
// enz

Today's subliminal thought is:


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
dat werkt inderdaad goed dank je :)

wat voor conditie zou jij gebruiken?

Acties:
  • 0 Henk 'm!

  • TheDuke
  • Registratie: Juni 1999
  • Niet online
*kill me, kill me now*

de condities moet je natuurlijk zelf invullen, omdat dat geheel applicatie afhankelijk is...
waarschijnlijk is zoiets als dit voor jouw probleem al voldoende...

if ( $var1 != NULL ) $query .= ....
if ( $var2 != NULL ) $query .= ....
if ( $var3 != NULL ) $query .= ....

Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:07
twopack schreef op 06 januari 2004 @ 17:11:
Hmm is lang geleden maar ik denk dat je een left-join nodig hebt.
Someone please correct me if i'm wrong.
En met wat zou jij dan joinen?

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

Annie:
PHP:
1
2
3
4
5
6
// 1=1 is toegevoegd zodat de vervolgstatements met AND mogen beginnen
$query = "select * from project where 1=1"; 
// uitbouwen
if (conditie) $query .= " AND kol=var";
if (conditie) $query .= " AND kol2=var2";
// enz
Tipje: gebruik voor het aan elkaar plakken van condities liever implode. Dat voorkomt van die vieze toestanden als 1=1 ;) en scheelt een hoop gedoe als je bijv. de AND in een OR wilt veranderen.

PHP:
1
2
3
4
5
6
7
$where_clauses = array ();

if ( $a )  $where_clauses[] = "kol='$var'";
if ( $b )  $where_clauses[] = "kol2='$var2'";
// etcetera

$query = "SELECT * FROM project WHERE " . implode ( " AND ", $where_clauses );

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 15:22

.oisyn

Moderator Devschuur®

Demotivational Speaker

drm: je vergeet nog te testen of count ($where_clauses) > 0 ;)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

.oisyn:
drm: je vergeet nog te testen of count ($where_clauses) > 0 ;)
Good call, Aguado 8)

Je weet hoe je moet editten :+

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
.oisyn schreef op 06 januari 2004 @ 19:26:
drm: je vergeet nog te testen of count ($where_clauses) > 0 ;)
phpMyAdmin gebruikt daar een "handige" oplossing voor ;) gewoon een clause TRUE toevoegen als eerste :)

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Acties:
  • 0 Henk 'm!

  • Riegstar
  • Registratie: Februari 2003
  • Niet online

Riegstar

Wadapatja!

Je kan het probleem van Hangman ook als volgt oplossen:

code:
1
$query="select * from project where var1=COALESCE('$var1',var1) AND var2=COALESCE('$var2',var2) AND var3=COALESCE('$var3',var3) AND var4=COALESCE('$var4',var4) AND var5=COALESCE('$var5',var5)";


Uitleg COALESCE volgens handleiding MySQL:
code:
1
2
3
4
5
6
COALESCE(list)
    Returns first non-NULL element in list:
    mysql> SELECT COALESCE(NULL,1);
    -> 1
    mysql> SELECT COALESCE(NULL,NULL,NULL);
    -> NULL

Acties:
  • 0 Henk 'm!

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 21:21

gorgi_19

Kruimeltjes zijn weer op :9

Ik vraag me af of je met Coalesce niet een gruwelijke vertraging gaat inbouwen in vergelijking met het dynamisch opbouwen van je statement.

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Acties:
  • 0 Henk 'm!

  • Riegstar
  • Registratie: Februari 2003
  • Niet online

Riegstar

Wadapatja!

Dat kan wel zo zijn, niet getest.
Maar ik gaf alleen maar aan hoe je het in sql kon oplossen, omdat hij dat ook in zijn vraag had staan.

Ik heb verder nog een klein vraagje:
Stel wanneer $var1 = NULL.
Is '$var1' dan ook NULL of een lege string omdat er single-qoutes omheen staan?

Acties:
  • 0 Henk 'm!

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 21:21

gorgi_19

Kruimeltjes zijn weer op :9

Stel wanneer $var1 = NULL.
Is '$var1' dan ook NULL of een lege string omdat er single-qoutes omheen staan?
Ik zou zeggen (niet getest) dat je in jouw geval je statement opbouwt; echter de single quotes zitten in de tekst. Hij zal hem denk ik de Null value impliciet willen casten naar een string (waardoor deze een lege string wordt), omdat hij er anders niets mee kan.

Het wordt anders als je met parametrized queries gaat werken; dan kan je wel met Null values gaan werken (althans, in SQL Server), maar ook in beperkte mate. :)

[ Voor 17% gewijzigd door gorgi_19 op 07-01-2004 09:49 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
bedankt allemaal, ik leer echt veel :)

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 15:22

.oisyn

Moderator Devschuur®

Demotivational Speaker

Grijze Vos schreef op 06 januari 2004 @ 20:21:
[...]


phpMyAdmin gebruikt daar een "handige" oplossing voor ;) gewoon een clause TRUE toevoegen als eerste :)
uhm ja, dat is dus die WHERE 1=1 waar we het over hadden, en die wilde we nou net wegwerken

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • wasigh
  • Registratie: Januari 2001
  • Niet online

wasigh

wasigh.blogspot.com

Ik los dat altijd zo op: IMHO overzichtelijker dan een implode
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
$query = "select * from persoon, categorie ";
        $middle = " where";
        if ($naam != "")
        {
            $query .= $middle . " naam like '%$naam%'";
            $middle = " and";
        }
        if ($woonplaats != "")
        {
            $query .= $middle . " woonplaats like '%$woonplaats%'";
            $middle = " and";
        }
        if ($email != "")
        {
            $query .= $middle . " email like '%$email%'";
            $middle = " and";
        }
        if ($categorie != 0)
        {
            $query .= $middle . " categorie = $categorie";
            $middle = " and";
        }
        $query .= $middle . " persoon.categorie = categorie.categorie_id";

Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

wasigh:
Ik los dat altijd zo op: IMHO overzichtelijker dan een implode
PHP:
1
2
$query = "select * from persoon, categorie ";
// snip
Mja, dan hebben we het denk ik toch over smaak, maar ik vind dat echt helemaal niets overzichtelijker :)

En er zit 1 groot nadeel aan. Je hebt geen keus meer wat je doet als er geen (geldige) criteria opgegeven zijn. Wil je ze dan allemaal laten zien, of wil je juist melden dat er zoekcriteria verwacht worden?

edit:
Dat wil zeggen: je kunt natuurlijk checken of $middle gelijk is aan 'where', maar dat valt bij mij toch echt een beetje in de categorie 'ranzig' :)

[ Voor 14% gewijzigd door drm op 07-01-2004 14:42 ]

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Acties:
  • 0 Henk 'm!

  • wasigh
  • Registratie: Januari 2001
  • Niet online

wasigh

wasigh.blogspot.com

drm schreef op 07 januari 2004 @ 14:40:
[...]
Mja, dan hebben we het denk ik toch over smaak, maar ik vind dat echt helemaal niets overzichtelijker :)

En er zit 1 groot nadeel aan. Je hebt geen keus meer wat je doet als er geen (geldige) criteria opgegeven zijn. Wil je ze dan allemaal laten zien, of wil je juist melden dat er zoekcriteria verwacht worden?

edit:
Dat wil zeggen: je kunt natuurlijk checken of $middle gelijk is aan 'where', maar dat valt bij mij toch echt een beetje in de categorie 'ranzig' :)
Als je geen argumenten geeft laat ie alles zien en dat is precies wat ik wil ;)

Maar het hangt natuurlijk vooral van persoonlijke voorkeur af hoe je iets doet . Op deze manier hoef ik iig geen trucjes uit te halen om ongeldige SQL te voorkomen :)

[ Voor 8% gewijzigd door wasigh op 07-01-2004 18:27 ]


Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

wasigh:
Als je geen argumenten geeft laat ie alles zien en dat is precies wat ik wil ;)
Ja tuurlijk, maar ik ben altijd wel een voorstander van zo min mogelijk jezelf beperken door de manier waarop je dingen programmeert. Dat komt vooral door die vervelende klanten :P
Maar het hangt natuurlijk vooral van persoonlijke voorkeur af hoe je iets doet . Op deze manier hoef ik iig geen trucjes uit te halen om ongeldige SQL te voorkomen :)
Vooral een kwestie van smaak, idd.

offtopic:
Overigens tijdje geleden dat ik jou hier gezien heb, of niet?

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz

Pagina: 1