[PHP] Array in where clause

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Mike2k
  • Registratie: Mei 2002
  • Laatst online: 22-08 11:59

Mike2k

Zone grote vuurbal jonge! BAM!

Topicstarter
Hey allemaal,

Ik heb de volgende functie geschreven die een array gebruikt in de WHERE clause.
Als ik de functie aanroep, krijg ik echter een heel apart resultaat.

De code zou alle rijen terug moeten geven waar host niet voorkomt in de array.
Ik krijg nu maar 1 rij terug en die rij bevat ook nog de hostname die juist overgeslagen zou moeten worden.

Code:
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
<?php
function getServices($intTid, $uid) {
      $qryRemHosts = "SELECT removed_hosts FROM usr_preferences WHERE uid='$uid'";
      try {
         if (!$rsltRemHosts = mysql_query($qryRemHosts)) {
            $mysql_error = mysql_error();
            throw new Exception($mysql_error);
            return false;
         }
   /*       if (!$rsltLastServices = mysql_query($qryLastServices)) {
            $mysql_error = mysql_error();
            throw new Exception($mysql_error);
            return false;
         } */
         else {
            $arrRemHosts = mysql_fetch_array($rsltRemHosts);
            $arrRemHosts = explode(";", $arrRemHosts[0]);
//arrRemHosts looks like: Array ( [0] => localhost [1] => VOCNL01S002 ) 
            $rsltLastServices = mysql_query ("SELECT * FROM nagios_services WHERE tid = '$intTid' AND host NOT IN ('".implode("', '", $arrRemHosts)."') ORDER BY host") or die(mysql_error());
            $i = 0;
            $arrLastServices = array();
            while($row = mysql_fetch_array($rsltLastServices)) {
               while(list($myVariableName,$sqlFieldName)=each($row)) {
                  $arrLastServices[$i][$myVariableName] = $sqlFieldName;
               }
            }
            $i++;
            return $arrLastServices;
         }
      }
      catch (Exception $e) {
         $error = $e->getMessage();
         $script = $e->getFile();
         log_error($error, $script);
         return "An unexpected error has occured. This error has been logged and will be investigated as soon as possible.";
      }
   }
?>


Weten jullie wat er mis is ?

You definitely rate about a 9.0 on my weird-shit-o-meter
Chuck Norris doesn't dial the wrong number. You answer the wrong phone.


Acties:
  • 0 Henk 'm!

  • --MeAngry--
  • Registratie: September 2002
  • Laatst online: 19-09 16:35

--MeAngry--

aka Qonstrukt

Ik zou die $i++ iets verplaatsen en verder je query eens echo'en of in ieder geval controleren. Ik denk dat je WHERE NOT IN er gewoon anders uit ziet dan je verwacht.

Tesla Model Y RWD (2024)


Acties:
  • 0 Henk 'm!

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 14:53

MueR

Admin Tweakers Discord

is niet lief

En als je dit in je phpMyAdmin inklopt? (met juiste waardes uiteraard)
SQL:
1
2
3
SELECT * FROM nagios_services WHERE tid = '__INVULLEN__' AND host NOT IN (
  SELECT removed_hosts FROM usr_preferences WHERE uid='__INVULLEN__'
) ORDER BY host

Anyone who gets in between me and my morning coffee should be insecure.


Acties:
  • 0 Henk 'm!

  • LuCarD
  • Registratie: Januari 2000
  • Niet online

LuCarD

Certified BUFH

Je stelt zelf al een conclusie, en vervolgens onderzoek je die conclusie niet verder? Wat is de query die uit eindelijk uitvoert. En klopt die query?
MueR schreef op donderdag 22 januari 2009 @ 14:07:
En als je dit in je phpMyAdmin inklopt? (met juiste waardes uiteraard)
SQL:
1
2
3
SELECT * FROM nagios_services WHERE tid = '__INVULLEN__' AND host NOT IN (
  SELECT removed_hosts FROM usr_preferences WHERE uid='__INVULLEN__'
) ORDER BY host
Dat zal niet werken. Het database model is brak. Aangezien er meerdere hostnames in removed_host staan in row.

[ Voor 44% gewijzigd door LuCarD op 22-01-2009 14:10 ]

Programmer - an organism that turns coffee into software.


Acties:
  • 0 Henk 'm!

  • --MeAngry--
  • Registratie: September 2002
  • Laatst online: 19-09 16:35

--MeAngry--

aka Qonstrukt

Dat moet je natuurlijk wel alleen doen als je zeker weet dat de betreffende host een MySQL versie draait die subqueries ondersteunt. Ik weet niet of het app voor jezelf is of om te verspreiden? Want anders is het idee van MueR wel efficiënter.

Tesla Model Y RWD (2024)


Acties:
  • 0 Henk 'm!

  • Mike2k
  • Registratie: Mei 2002
  • Laatst online: 22-08 11:59

Mike2k

Zone grote vuurbal jonge! BAM!

Topicstarter
@ MeAngry: De app is voor mezelf.

@Lucard: Waarom is het database model brak ? hoe zou ik het dan moeten doen ?

Als ik de query echo komt er dit uit: "SELECT * FROM nagios_services WHERE tid = '$intTid' AND host NOT IN ('localhost', 'VOCNL01S002') ORDER BY host"

You definitely rate about a 9.0 on my weird-shit-o-meter
Chuck Norris doesn't dial the wrong number. You answer the wrong phone.


Acties:
  • 0 Henk 'm!

  • --MeAngry--
  • Registratie: September 2002
  • Laatst online: 19-09 16:35

--MeAngry--

aka Qonstrukt

Fastex schreef op donderdag 22 januari 2009 @ 14:27:
@ MeAngry: De app is voor mezelf.

@Lucard: Waarom is het database model brak ? hoe zou ik het dan moeten doen ?

Als ik de query echo komt er dit uit: "SELECT * FROM nagios_services WHERE tid = '$intTid' AND host NOT IN ('localhost', 'VOCNL01S002') ORDER BY host"
Volgens mij type je dat nu zelf, want als het goed is hoort daar geen WHERE tid = '$intTid' uit te komen. Doe nu echt simpelweg eens mysql_query vervangen voor echo, en kijk dan nog eens, en vergelijk het exact met wat er in je tabel staat.

Daarnaast staat je $i++ buiten de while lus, dus veel nut heeft die daar niet.

En je datamodel is brak omdat je dit soort code nodig hebt:
$arrRemHosts = explode(";", $arrRemHosts[0]);
Als je slim bent maak je gewoon voor elke host een eigen rij, zodat je subqueries kunt gebruiken. :)

[ Voor 13% gewijzigd door --MeAngry-- op 22-01-2009 14:33 ]

Tesla Model Y RWD (2024)


Acties:
  • 0 Henk 'm!

  • LuCarD
  • Registratie: Januari 2000
  • Niet online

LuCarD

Certified BUFH

--MeAngry-- schreef op donderdag 22 januari 2009 @ 14:30:
[...]

En je datamodel is brak omdat je dit soort code nodig hebt:

[...]


Als je slim bent maak je gewoon voor elke host een eigen rij, zodat je subqueries kunt gebruiken. :)
Klopt :)

Misschien is het handig om eens te gaan kijken naar Normaliseren ( Database Normalisatie vraag )

En dan zou je het zelf met een normale join kunnen op lossen :P

Programmer - an organism that turns coffee into software.

Pagina: 1