[PHP] Probleem met SQL query's n.a.v. ingevulde edit-fields

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • 0M3G4
  • Registratie: Januari 2003
  • Laatst online: 31-07 11:20
Dag mensen,

Ik heb even gezocht voor onderwerpen met dit wel heel specifieke probleem, maar helaas niks gevonden dus dan maar zo. Ik ben niet zo'n heel ervaren PHP-fanaat maar maak een programma in PHP voor mijn stage. Onderdeel van dit programma is een soort dynamische zoekpagina voor urendeclaraties waar men met het invullen van een aantal variabelen (project, deelproject, werknemercode en werkcode, of een selectie hiervan) het juiste resultaat in een tabel getoond zou moeten krijgen. Er zijn in totaal 11 selecties mogelijk en die heb ik elk apart gedefinieerd met hun eigen 'voorwaardes' maar dit werkt niet goed. Zodra PHP 1 voorwaarde heeft gechecked, pakt hij gelijk de onderste (dus bij alleen "project" ingevuld, pakt hij alle urendeclaraties die bij dat project horen, ookal heb ik nog een veld aangeklikt waardoor hij alle urendeclaraties van een specifiek deelproject zou moeten pakken, bijv.) hoop dat het een beetje duidelijk is en dat jullie me kunnen helpen.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
if ($submit) {
    $server = mysql_connect('localhost', 'root', '');
            mysql_select_db("test", $server);
            if ($sprojectnummer <> "") {
                if ($sdeelprojectnummer <> "") {
                    if ($swerknemer <> "") {
                        if ($swerkcode <> "") {
                        $query5=mysql_query("SELECT datum, werknemercode, projectnummer, deelprojectnummer, werkcode, beschrijving, status FROM tbltempurenentry WHERE projectnummer = '$sprojectnummer' AND deelprojectnummer = '$sdeelprojectnummer' AND werknemercode = '$swerknemer' AND werkcode = '$swerkcode' AND datum BETWEEN '$datum1' AND '$datum2'");
                        $no = '1';
                        } else {
                    $query5=mysql_query("SELECT datum, werknemercode, projectnummer, deelprojectnummer, werkcode, beschrijving, status FROM tbltempurenentry WHERE projectnummer = '$sprojectnummer' AND deelprojectnummer = '$sdeelprojectnummer' AND werknemercode = '$swerknemer' AND datum BETWEEN '$datum1' AND '$datum2'");
                    $no = '2';
                    }
                    } 
                    if ($werkcode != "") {
                    $query5=mysql_query("SELECT datum, werknemercode, projectnummer, deelprojectnummer, werkcode, beschrijving, status FROM tbltempurenentry WHERE projectnummer = '$sprojectnummer' AND deelprojectnummer = '$sdeelprojectnummer' AND werkcode = '$swerkcode' AND datum BETWEEN '$datum1' AND '$datum2'");
                    $no = '3';
                    } else {
                $query5=mysql_query("SELECT datum, werknemercode, projectnummer, deelprojectnummer, werkcode, beschrijving, status FROM tbltempurenentry WHERE projectnummer = '$sprojectnummer' AND deelprojectnummer = '$sdeelprojectnummer' AND datum BETWEEN '$datum1' AND '$datum2'");
                $no = '4';
                }
                } 
                if ($swerknemer != "") {
                    if ($swerkcode != "") {
                        $query5=mysql_query("SELECT datum, werknemercode, projectnummer, deelprojectnummer, werkcode, beschrijving, status FROM tbltempurenentry WHERE projectnummer = '$sprojectnummer' AND werknemercode = '$swerknemer' AND werkcode = '$swerkcode' AND datum BETWEEN '$datum1' AND '$datum2'");
                        $no = '5';
                        } else {
                    $query5=mysql_query("SELECT datum, werknemercode, projectnummer, deelprojectnummer, werkcode, beschrijving, status FROM tbltempurenentry WHERE projectnummer = '$sprojectnummer' AND werknemercode = '$swerknemer' AND datum BETWEEN '$datum1' AND '$datum2'");
                    $no = '6';
                    }
                    } 
                if ($werkcode != "") {
                $query5=mysql_query("SELECT datum, werknemercode, projectnummer, deelprojectnummer, werkcode, beschrijving, status FROM tbltempurenentry WHERE projectnummer = '$sprojectnummer' AND werkcode = '$swerkcode' AND datum BETWEEN '$datum1' AND '$datum2'");
                $no = '7';
            } else {
            $query5=mysql_query("SELECT datum, werknemercode, projectnummer, deelprojectnummer, werkcode, beschrijving, status FROM tbltempurenentry WHERE projectnummer = '$sprojectnummer' AND datum BETWEEN '$datum1' AND '$datum2'");
            $no = '8';
            }
            }
            if ($swerknemer != "") {
                if ($werkcode != "") {
                $query5=mysql_query("SELECT datum, werknemercode, projectnummer, deelprojectnummer, werkcode, beschrijving, status FROM tbltempurenentry WHERE werknemercode = '$swerknemer' AND werkcode = '$swerkcode' AND datum BETWEEN '$datum1' AND '$datum2'");
                $no = '9';
                } else {
            $query5=mysql_query("SELECT datum, werknemercode, projectnummer, deelprojectnummer, werkcode, beschrijving, status FROM tbltempurenentry WHERE werknemercode = '$swerknemer' AND datum BETWEEN '$datum1' AND '$datum2'");
            $no = '10';
            }
            }
            if ($swerkcode != "") {
            $query5=mysql_query("SELECT datum, werknemercode, projectnummer, deelprojectnummer, werkcode, beschrijving, status FROM tbltempurenentry WHERE werkcode = '$swerkcode' AND datum BETWEEN '$datum1' AND '$datum2'");
            $no = '11';
            } else { echo 'Er zijn geen resultaten gevonden voor de door u opgegeven zoekparameters';
            }
    while($data5=mysql_fetch_array($query5)) {
    print ("      
        <tr>
        <td> $no <input type='text' name='datum' size=20 maxlength=20 value=$data5[datum]></td>
        <td> <input type='text' name='werknemer' size=20 maxlength=20 value=$data5[werknemercode]></td>
        <td> <input type='text' name='project' size=20 maxlength=20 value=$data5[projectnummer]></td>
        <td> <input type='text' name='deelproject' size=20 maxlength=20 value=$data5[deelprojectnummer]></td>
        <td> <input type='text' name='werkcode' size=20 maxlength=20 value=$data5[werkcode]></td>
        <td> <input type='text' name='beschrijving' size=20 maxlength=20 value=$data5[beschrijving]></td>
        <td> <input type='text' name='status' size=20 maxlength=20 value=$data5[status]></td>
");
            }
}
            
?>


flinke lap code, hoop dat het een beetje duidelijk is.. de $no staat erin om te achterhalen welke query hij pakt. In mijn voorbeeld bovenaan pakte hij no.8 terwijl hij nr. 3 zou moeten pakken.

Acties:
  • 0 Henk 'm!

  • devilbird
  • Registratie: November 2004
  • Laatst online: 17-01-2024

devilbird

Freaky

kun je misschien iets uitgebreider zijn met je beschrijving.... Zo in de eerste instantie ziet het er wel goed uit namelijk, maar wat voor variabelen post je? En kloppen alle variabelen.

Want je zegt dat hij bij 3 moet uitkomen, maar wat heb je allemaal ingevuld in het formulier? Want zoals ik begrijp heb je een project nummer, deelproject nummer en werkcode ingevuld?

Edit:
Owja, waarom gebruik je in het begin blabla <> "" en verderop blabla != "" ?

[ Voor 11% gewijzigd door devilbird op 11-01-2005 14:30 ]

<--- http://www.lansensations.nl --->


Acties:
  • 0 Henk 'm!

  • Pelle
  • Registratie: Januari 2001
  • Laatst online: 10:32

Pelle

🚴‍♂️

Is het niet slimmer om gewoon een query te bouwen? Afhankelijk van of iets is ingevuld of niet stop je een stukje van de querystring in een array, en die array join je daarna op AND en plak je achter het SELECT-gedeelte :)


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

if (isset($_GET['veld1'])) $qs[] = '(veld1 = ' . $_GET['veld1'] . ')';
if (isset($_GET['veld2'])) $qs[] = '(veld2 > ' . $_GET['veld2'] . ' OR < 100)';

mysql_query('SELECT veld1, veld2, veld3 FROM tabel WHERE ' . implode(' AND ', $qs));

Acties:
  • 0 Henk 'm!

  • Guldan
  • Registratie: Juli 2002
  • Laatst online: 11-09 19:49

Guldan

Thee-Nerd

Euh... ik zit er nu ff naar te kijken maar het is zeer onduidelijk. De fout zit ergens in een if alleen is de structuur van het programma zo onduidelijk dat je de fout niet kan zien.
en is if ($swerknemer != "") en if ($swerknemer <> "") zijn precies gelijk aan mekaar.
Bij de eerste kijk je of hij niet gelijk is aan een lege waarden en bij de 2e kijk je of hij anders is dan ene lege waarde. Dat is toch precies hetzelfde...
En je moet even duidelijk maken wanneer je wil dat welke query uitgevoerd word. Ook kun je met php dingen achter mekaar zetten in een if. If ($waarde1 == '1' && $waarde2=='2') && staat voor And en || staat voor or.

edit:
eigenlijk ben ik het wel eens met Pelle :):P

[ Voor 10% gewijzigd door Guldan op 11-01-2005 14:32 ]

You know, I used to think it was awful that life was so unfair. Then I thought, wouldn't it be much worse if life were fair, and all the terrible things that happen to us come because we actually deserve them?


Acties:
  • 0 Henk 'm!

  • 0M3G4
  • Registratie: Januari 2003
  • Laatst online: 31-07 11:20
ehm ja... ik heb op het formulier ingevuld dat hij moet filteren op projectnummer, deelprojectnummer en werkcode, zodat hij alleen de declaraties eruit zou moeten halen die aan deze eisen voldoen. Echter hij doet alleen de eerste "if" en gaat daarna gelijk door naar onderen en pakt de laatste optie voor filteren op projectnummer.

Het is een beetje als volgt opgebouwd:

PHP moet controleren of veld 1 is ingevuld -> zo ja -> controleer of veld 2 is ingevuld -> zo nee, dan komt hier query uit en deze moet ie uitvoeren.

Acties:
  • 0 Henk 'm!

  • Guldan
  • Registratie: Juli 2002
  • Laatst online: 11-09 19:49

Guldan

Thee-Nerd

Dan kun je toch gewoon m.b.v een isset kijken of de variable ingevuld is en dan ook meerdere voorwaarden per if aanelkaar plakken. Daar word je code compacter en duidelijker van

You know, I used to think it was awful that life was so unfair. Then I thought, wouldn't it be much worse if life were fair, and all the terrible things that happen to us come because we actually deserve them?


Acties:
  • 0 Henk 'm!

  • 0M3G4
  • Registratie: Januari 2003
  • Laatst online: 31-07 11:20
hoe bouw je op deze manier een query op dan? (ben helaas niet zo bekend met arrays :? )de complete query is:

PHP:
1
$query5=mysql_query("SELECT datum, werknemercode, projectnummer, deelprojectnummer, werkcode, beschrijving, status FROM tbltempurenentry WHERE projectnummer = '$sprojectnummer' AND deelprojectnummer = '$sdeelprojectnummer' AND werknemercode = '$swerknemer' AND werkcode = '$swerkcode' AND datum BETWEEN '$datum1' AND '$datum2'");


hier filtert ie op alle invoervelden, dus alles moet ingevoerd zijn voordat er resultaat is
Pelle schreef op dinsdag 11 januari 2005 @ 14:29:
Is het niet slimmer om gewoon een query te bouwen? Afhankelijk van of iets is ingevuld of niet stop je een stukje van de querystring in een array, en die array join je daarna op AND en plak je achter het SELECT-gedeelte :)<br /><br />
PHP:
1
2
3
4
5
6
$qs = array();

if (isset($_GET['veld1'])) $qs[] = '(veld1 = ' . $_GET['veld1'] . ')';
if (isset($_GET['veld2'])) $qs[] = '(veld2 > ' . $_GET['veld2'] . ' OR < 100)';

mysql_query('SELECT veld1, veld2, veld3 FROM tabel WHERE ' . implode(' AND ', $qs));

[ Voor 49% gewijzigd door 0M3G4 op 11-01-2005 14:40 ]


Acties:
  • 0 Henk 'm!

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 09:44

gorgi_19

Kruimeltjes zijn weer op :9

En wat snap je er niet aan?

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Acties:
  • 0 Henk 'm!

  • 0M3G4
  • Registratie: Januari 2003
  • Laatst online: 31-07 11:20
Guldan schreef op dinsdag 11 januari 2005 @ 14:33:
Dan kun je toch gewoon m.b.v een isset kijken of de variable ingevuld is en dan ook meerdere voorwaarden per if aanelkaar plakken. Daar word je code compacter en duidelijker van
jij bedoelt zoiets?

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
if ($sprojectnummer <> "") {
            $query5=mysql_query("SELECT datum, werknemercode, projectnummer, deelprojectnummer, werkcode, beschrijving, status FROM tbltempurenentry WHERE projectnummer = '$sprojectnummer' AND datum BETWEEN '$datum1' AND '$datum2' ");
            } if (($sprojectnummer <>"") && ($sdeelprojectnummer <>"")) {  
            $query5=mysql_query("SELECT datum, werknemercode, projectnummer, deelprojectnummer, werkcode, beschrijving, status FROM tbltempurenentry WHERE deelprojectnummer = '$sdeelprojectnummer' AND datum BETWEEN '$datum1' AND '$datum2'");
            } if (($sprojectnummer <>"") && ($swerknemer <>"")) {
            $query5=mysql_query("SELECT datum, werknemercode, projectnummer, deelprojectnummer, werkcode, beschrijving, status FROM tbltempurenentry WHERE projectnummer = '$sprojectnummer' AND werknemercode = '$swerknemer' AND datum BETWEEN '$datum1' AND '$datum2'");
            } if (($sprojectnummer <>"") && ($swerkcode <>"")) {
            $query5=mysql_query("SELECT datum, werknemercode, projectnummer, deelprojectnummer, werkcode, beschrijving, status FROM tbltempurenentry WHERE projectnummer = '$sprojectnummer' AND werkcode = '$swerkcode' AND datum BETWEEN '$datum1' AND '$datum2'");
            } if (($sdeelprojectnummer <>"") && ($swerknemer <>"")) {
            $query5=mysql_query("SELECT datum, werknemercode, projectnummer, deelprojectnummer, werkcode, beschrijving, status FROM tbltempurenentry WHERE deelprojectnummer = '$sdeelprojectnummer' AND werknemercode = '$swerknemer' AND datum BETWEEN '$datum1' AND '$datum2'");
            } if (($sdeelprojectnummer <>"") && ($swerkcode <>"")) {
            $query5=mysql_query("SELECT datum, werknemercode, projectnummer, deelprojectnummer, werkcode, beschrijving, status FROM tbltempurenentry WHERE deelprojectnummer = '$sdeelprojectnummer' AND werkcode = '$swerkcode' AND datum BETWEEN '$datum1' AND '$datum2'");
            } if (($sprojectnummer <>"") && ($swerkcode <>"")) {
            $query5=mysql_query("SELECT datum, werknemercode, projectnummer, deelprojectnummer, werkcode, beschrijving, status FROM tbltempurenentry WHERE projectnummer = '$sprojectnummer' AND werkcode = '$swerkcode' AND datum BETWEEN '$datum1' AND '$datum2'");
            } if ($swerknemer <>"") {
            $query5=mysql_query("SELECT datum, werknemercode, projectnummer, deelprojectnummer, werkcode, beschrijving, status FROM tbltempurenentry WHERE werknemercode = '$swerknemer' AND datum BETWEEN '$datum1' AND '$datum2'");
            } if (($swerknemer <>"") && ($swerkcode <>"")) {
            $query5=mysql_query("SELECT datum, werknemercode, projectnummer, deelprojectnummer, werkcode, beschrijving, status FROM tbltempurenentry WHERE werknemercode = '$swerknemer' AND werkcode = '$swerkcode' AND datum BETWEEN '$datum1' AND '$datum2'");
            } if ($swerkcode <>"") {
            $query5=mysql_query("SELECT datum, werknemercode, projectnummer, deelprojectnummer, werkcode, beschrijving, status FROM tbltempurenentry WHERE werkcode = '$swerkcode' AND datum BETWEEN '$datum1' AND '$datum2'");
            } else { echo 'Er zijn geen resultaten gevonden voor de door u opgegeven zoekparameters';
            }


dat werkt ook niet helemaal fijntjes, zelfde probleem... hij pakt de eerste "if"

[ Voor 15% gewijzigd door 0M3G4 op 11-01-2005 14:45 ]


Acties:
  • 0 Henk 'm!

  • apenstaartje
  • Registratie: Februari 2002
  • Niet online
ik moet nog ff erop doordenken, maar ik wil alvast dit meegeven:
het is handiger om (als je deze structuur aan wilt houden), om eerst gewoon de query in een string te plaatsen, en dan daaronder pas de daadwerkelijke query uitvoeren.

Dus:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
if ($submit) {
            if ($sprojectnummer <> "") {
                if ($sdeelprojectnummer <> "") {
                    if ($swerknemer <> "") {
                        if ($swerkcode <> "") {
                        $query="SELECT datum, werknemercode, projectnummer, deelprojectnummer, werkcode, beschrijving, status FROM tbltempurenentry WHERE projectnummer = '$sprojectnummer' AND deelprojectnummer = '$sdeelprojectnummer' AND werknemercode = '$swerknemer' AND werkcode = '$swerkcode' AND datum BETWEEN '$datum1' AND '$datum2'";
                        $no = '1';
                        } else {
                         \\etc....
                        } 
            }
            $server = mysql_connect('localhost', 'root', '');
            mysql_select_db("test", $server);
            $result = mysql_query($query);

geen zin zonder onzin


Acties:
  • 0 Henk 'm!

  • 0M3G4
  • Registratie: Januari 2003
  • Laatst online: 31-07 11:20
ok heb de manier van pelle geprobeerd, maar geeft nog aan invalid SQL resource bij het invullen van werkcode en werknemer, bij project werkt ie wonderbaarlijk genoeg...

PHP:
1
2
3
4
5
6
$qs = array();
            if (isset($sprojectnummer)) $qs[] = '(projectnummer = ' . $sprojectnummer . ')'; 
            if (isset($sdeelprojectnummer)) $qs[] = '(deelprojectnummer = ' . $sdeelprojectnummer . ')';
            if (isset($swerknemer)) $qs[] = '(werknemercode = ' . $swerknemer . ')';
            if (isset($swerkcode)) $qs[] = '(werkcode = ' . $swerkcode . ')';
            $query5=mysql_query('SELECT datum, werknemercode, projectnummer, deelprojectnummer, werkcode, beschrijving, status FROM tbltempurenentry WHERE ' . implode(' AND ', $qs));


project, deelproject, werknemer, werkcode zijn de namen van de invoervelden(dropdownlists).. wat is hier nog verkeerd aan? :?

[ Voor 29% gewijzigd door 0M3G4 op 11-01-2005 15:45 ]


Acties:
  • 0 Henk 'm!

  • Guldan
  • Registratie: Juli 2002
  • Laatst online: 11-09 19:49

Guldan

Thee-Nerd

Euh staan de goeie waarden wel in de array? en $projectnummer en $deelprojectnummer zijn getallen zeker. Misschien dat ie raar gaat doen omdat $swerknemer een string bevat en geen getal. Maar dit is gokken eigenlijk want ik zie zo ff geen fout. De implode lijkt mij ook goed te gaan.

You know, I used to think it was awful that life was so unfair. Then I thought, wouldn't it be much worse if life were fair, and all the terrible things that happen to us come because we actually deserve them?


Acties:
  • 0 Henk 'm!

  • 0M3G4
  • Registratie: Januari 2003
  • Laatst online: 31-07 11:20
ik neem dus aan dat er geen stings in een array kunnen worden geplaatst? nu heb ik het iets anders opgelost door "$swerkcode" in het aanmaken van de array een nummer mee te geven waarnaar verwezen wordt

PHP:
1
2
3
4
5
6
$qs = array();
            if (isset($sprojectnummer)) $qs[] = '(projectnummer = ' . $sprojectnummer . ')'; 
            if (isset($sdeelprojectnummer)) $qs[] = '(deelprojectnummer = ' . $sdeelprojectnummer . ')';
            if (isset($swerknemer)) $qs[]= '(werknemercode = ' . $swerknemer . ')';
            if (isset($swerkcode)) $qs[] = 'werkcode = ' . $swerkcode  . '';
            $query='SELECT datum, werknemercode, projectnummer, deelprojectnummer, werkcode, beschrijving, status FROM tbltempurenentry WHERE ' . implode( ' AND ', $qs);


na het echo-en van de query ziet deze er verder prima uit, maar als er idd geen string kan worden geplaatst in een array hoe doe ik dit dan? foutmelding + query:

code:
1
SELECT datum, werknemercode, projectnummer, deelprojectnummer, werkcode, beschrijving, status FROM tbltempurenentry WHERE werkcode = SituatieUnknown column 'Situatie' in 'where clause'

Situatie = waarde van 'werkcode'

[ Voor 120% gewijzigd door 0M3G4 op 12-01-2005 09:57 ]


Acties:
  • 0 Henk 'm!

  • 0M3G4
  • Registratie: Januari 2003
  • Laatst online: 31-07 11:20
Ik heb het geheel opgelost door van alle filters een integer te maken, zodoende werkt het nu, bedankt voor jullie hulp.. _/-\o_

mag slotje op..
Pagina: 1