[php]2 waardes zijn gelijk, maar toch niet

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • valkej
  • Registratie: Juni 2006
  • Laatst online: 04-05 09:09
Ben bezig met het schrijven van een simpel stukje php-script. Maar op een of andere manier gaat het ergens de mist in. Doorgaans kom ik er nog wel uit, maar dit gaat echt boven mijn petje.

Het gaat om het onderstaande script wat ik zelf heb geschreven. Via ADODB worden de records uit een SQL database gehaald. De waarde van het veld gispen_computers_besturingssysteem is 'Windows XP Professional' of 'Windows 2000 Professional'. Dit veld wordt via de if-statement vergeleken. Wanneer de waarde uit het veld gispen_computers_besturingssysteem gelijk is aan 'Windows XP Professional' word de tekst 'gelijk' getoond. Binnen de database heeft dit veld als eigenschap varchar(45). Geen spaties rondom de tekst etc.

Ondanks dat de waarde uit de database gelijk is aan de waarde binnen het if-statement,blijft hij beweren dat beide waardes niet gelijk aan elkaar zijn.

code:
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
<?php

  // Verbinding maken met de MS SQL Database via ADODB.
  $db = new COM("ADODB.Connection") or die("Kan ADO niet starten");
  $db->Open("dsn=dsn;server=servernaam;database=database;Trusted_Connection=yes");

  // Haal gegevens uit database.
  $rs = $db->Execute("SELECT gispen_computers_besturingssysteem FROM gispen_computers");

  //DOORLOOP DE LUS TOT DAT ER GEEN RECORDS MEER OVER ZIJN IN DE DATABASE. 
  while (!$rs->EOF) {

    // zet velden in een array
    $row = $rs->fields;

    $a = $row['gispen_computers_besturingssysteem'];
    $b = "Windows XP Professional"; 
    
    if ($a == $b) {
      echo "gelijk";
    } else {
      echo "ongelijk";
    }

    // ga naar volgend record
    $rs->MoveNext();
  }

?>


Hoop dat jullie nog ideeën hebben waar het probleem zou kunnen liggen, waarom hij blijft zeggen dat beide waardes ongelijk aan elkaar zijn.

Acties:
  • 0 Henk 'm!

  • Salandur
  • Registratie: Mei 2003
  • Laatst online: 14:41

Salandur

Software Engineer

druk de waarde uit de database eens af, dan kan je zien wat de waarde is en waarom hij niet gelijk is

Assumptions are the mother of all fuck ups | iRacing Profiel


Acties:
  • 0 Henk 'm!

  • bakkerl
  • Registratie: Augustus 2001
  • Laatst online: 01-09 19:17

bakkerl

Let there be light.

Druk beide waardes eens af naar het scherm als die zegt dat ze ongelijk zijn aan elkaar.
Gebruik hiervoor var_dump() zodat je de type kunt zien (en in geval van een string de huidige lengte).

Acties:
  • 0 Henk 'm!

  • DaFeliX
  • Registratie: December 2002
  • Laatst online: 18-09 12:50

DaFeliX

Tnet Devver
doe 'ns de $a value tonen bij ongelijk, wellicht dat je te maken hebt met een typo

waarom doe je 't trouwens zo, en niet elke OS een eigen (numerieke) waarde geven? dat lijkt mij toch wat handiger

(1 = Windows XP Prof
2 = Windows XP Home
etc
etc)

*late*

[ Voor 5% gewijzigd door DaFeliX op 21-06-2006 10:06 ]

Einstein: Mijn vrouw begrijpt me niet


Acties:
  • 0 Henk 'm!

  • valkej
  • Registratie: Juni 2006
  • Laatst online: 04-05 09:09
Heb alle waardes al naar het scherm afdrukt, de output die is gelijk.

$row['gispen_computers_besturingssysteem'] = Windows XP Professional

Via var_dump() krijg ik de volgende drie waarde op het scherm getoond.

$a = object(variant)#5 (0) { }
$b = string(23) "Windows XP Professional"

Acties:
  • 0 Henk 'm!

  • Cloud
  • Registratie: November 2001
  • Laatst online: 17-09 10:39

Cloud

FP ProMod

Ex-moderatie mobster

valkej schreef op woensdag 21 juni 2006 @ 10:23:
Heb alle waardes al naar het scherm afdrukt, de output die is gelijk.

$row['gispen_computers_besturingssysteem'] = Windows XP Professional

Via var_dump() krijg ik de volgende drie waarde op het scherm getoond.

$a = object(variant)#5 (0) { }
$b = string(23) "Windows XP Professional"
Dat dacht ik al ja. $b wordt een string door de toewijzing die je doet, en $a wordt letterlijk: $row['gispen_computers_besturingssysteem'], oftewel een row object. En die zijn niet gelijk aan elkaar, zelfs niet in PHP.

Volgens mij kun je het als volgt testen:
PHP:
1
if ($row['gispen_computers_besturingssysteem'] == "Windows XP Professional")

Dan moet het wel goed gaan :)

Never attribute to malice that which can be adequately explained by stupidity. - Robert J. Hanlon
60% of the time, it works all the time. - Brian Fantana


Acties:
  • 0 Henk 'm!

  • BCC
  • Registratie: Juli 2000
  • Laatst online: 20:47

BCC

Is $a geen adodb object ipv een string?

Na betaling van een licentievergoeding van €1.000 verkrijgen bedrijven het recht om deze post te gebruiken voor het trainen van artificiële intelligentiesystemen.


Acties:
  • 0 Henk 'm!

  • valkej
  • Registratie: Juni 2006
  • Laatst online: 04-05 09:09
PHP:
1
if ($row['gispen_computers_besturingssysteem'] == "Windows XP Professional")


Je zou wel zeggen dat dit gewoon moet werken, maar helaas doet hij dat niet. Met die regel ben ik aanvankelijk ook begonnen, maar doordat hij niet werktte ben ik de boel gaan uitsplitsen om te achter halen waar het fout gaat.

De lengte van $row['gispen_computers_besturingssysteem'] is 23 tekens.
Via onderstaande code heb ik dat weten te achterhalen.

code:
1
print strlen($row['gispen_computers_besturingssysteem']);


@BCC

Via $a zette ik de waarde vanuit de array $row om naar een string. Maar het zou niet mogen uitmaken aangezien de waarde vanuit $row en $a gelijk aan elkaar is.

Acties:
  • 0 Henk 'm!

  • Cloud
  • Registratie: November 2001
  • Laatst online: 17-09 10:39

Cloud

FP ProMod

Ex-moderatie mobster

En wat nou als je die row cast naar een string:

PHP:
1
$a = (string) $row['gispen_computers_besturingssysteem'];


Want het is duidelijk dat de fout zit in het type van $a :) Misschien kun je anders het type wijzigen met settype()? Wel een apart probleem wat ik zelf nog niet eerder tegen gekomen ben. Zal wel iets met adodb zijn ofzo.

edit:
Daarnaast zie ik dat je Execute gebruikt om de query te doen, terwijl je een SELECT-query uitvoert. Moet je dan niet GetRow gebruiken zoals hier gedaan wordt?

[ Voor 23% gewijzigd door Cloud op 21-06-2006 11:16 ]

Never attribute to malice that which can be adequately explained by stupidity. - Robert J. Hanlon
60% of the time, it works all the time. - Brian Fantana


Acties:
  • 0 Henk 'm!

  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
Is dit niet gewoon een klassiek gevalletje van debuggen?

Echo gewoon beide waarden naar het scherm op de volgende manier:
PHP:
1
2
echo "[" . $a . "]<BR>"
echo "[" . $b . "]"


Dan heb je ze onder elkaar staan en zie je eventuele spaties (die er niet zijn blijkbaar) ook gelijk.
Kan het misschien een case-sensitivity probleem zijn?

Acties:
  • 0 Henk 'm!

  • valkej
  • Registratie: Juni 2006
  • Laatst online: 04-05 09:09
settype($a, "string");

Deed het hem, de waardes van $a en $b zijn nu gelijk aan elkaar. Voor mij is het ook voor het eerst dat ik dit probleem tegengekomen ben. Doorgaans werk ik ook niet met adodb, eigenlijk alleen voor mijn huidige project waar ik de afgelopen maanden mee bezig geweest ben. Maar het probleem is opgelost. Zal nog de resultaten en het volledige script hieronder zetten.


uitkomsten van $a en $b zijn:

$a = string(23) "Windows XP Professional"
$b = string(23) "Windows XP Professional"

Hieronder de werkende variant van het script:
code:
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
<?php

  // Verbinding maken met de MS SQL Database via ADODB.
  $db = new COM("ADODB.Connection") or die("Kan ADO niet starten");
  $db->Open("dsn=dsn;server=servernaam;database=database;Trusted_Connection=yes");

  // Haal gegevens uit database.
  $rs = $db->Execute("SELECT gispen_computers_besturingssysteem FROM gispen_computers");

  //DOORLOOP DE LUS TOT DAT ER GEEN RECORDS MEER OVER ZIJN IN DE DATABASE. 
  while (!$rs->EOF) {

    // zet velden in een array
    $row = $rs->fields;

    $a = $row['gispen_computers_besturingssysteem'];
    $b = "Windows XP Professional"; 
    settype($a, "string");
    
    if ($a == $b) {
      echo "gelijk";
    } else {
      echo "ongelijk";
    }

    // ga naar volgend record
    $rs->MoveNext();
  }

?>

[ Voor 75% gewijzigd door valkej op 21-06-2006 11:25 ]


Acties:
  • 0 Henk 'm!

  • BCC
  • Registratie: Juli 2000
  • Laatst online: 20:47

BCC

valkej schreef op woensdag 21 juni 2006 @ 11:00:
Via $a zette ik de waarde vanuit de array $row om naar een string. Maar het zou niet mogen uitmaken aangezien de waarde vanuit $row en $a gelijk aan elkaar is.
Niet dus. $a is een object, zoals je vardump netjes aangeeft. Twee verschillende types objecten vergelijken levert altijd iets raars op. En nu je $a cast naar een string werkt het wel, maar ik zou als ik jouw was eens even goed lezen wat die $row constructie nou exact voor 'n object oplevert.

Na betaling van een licentievergoeding van €1.000 verkrijgen bedrijven het recht om deze post te gebruiken voor het trainen van artificiële intelligentiesystemen.


Acties:
  • 0 Henk 'm!

  • Cloud
  • Registratie: November 2001
  • Laatst online: 17-09 10:39

Cloud

FP ProMod

Ex-moderatie mobster

Oke mooi om te weten. Dit is er wel eentje om te onthouden als je met adodb aan de slag gaat dus ;) Goed dat het opgelost is!

Never attribute to malice that which can be adequately explained by stupidity. - Robert J. Hanlon
60% of the time, it works all the time. - Brian Fantana


Acties:
  • 0 Henk 'm!

  • trinite_t
  • Registratie: Maart 2003
  • Laatst online: 17-09 14:06
is het niet gewoon gefixt als je die strings vergelijkt met:
PHP:
1
2
3
4
5
if(!strcmp($a, $b)){
    //als gelijk
}else{
    //als ongelijk
}

The easiest way to solve a problem is just to solve it.


Acties:
  • 0 Henk 'm!

  • valkej
  • Registratie: Juni 2006
  • Laatst online: 04-05 09:09
Heb jouw methode ook geprobeerd en die werkt ook.

Is zelf nog korter qua code.

Maar zo en zo is het goed om te weten waardoor het probleem ontstaan is.

Acties:
  • 0 Henk 'm!

  • Cloud
  • Registratie: November 2001
  • Laatst online: 17-09 10:39

Cloud

FP ProMod

Ex-moderatie mobster

trinite_t schreef op woensdag 21 juni 2006 @ 11:25:
is het niet gewoon gefixt als je die strings vergelijkt met:
PHP:
1
2
3
4
5
if(!strcmp($a, $b)){
    //als gelijk
}else{
    //als ongelijk
}
Misschien wel, maar het is imho netter om te zorgen dat beide variabelen van hetzelfde type zijn :) Ookal is het ook inderdaad raadzaam om toch eens uit te zoeken die DB connectie precies teruggeeft. En of je niet misschien GetRow dient te gebruiken, ookal is het maar om het volgens het boekje te doen ;)

Never attribute to malice that which can be adequately explained by stupidity. - Robert J. Hanlon
60% of the time, it works all the time. - Brian Fantana


Acties:
  • 0 Henk 'm!

  • valkej
  • Registratie: Juni 2006
  • Laatst online: 04-05 09:09
GetRow gaat in dit geval niet, aangezien er een gehele lijst opgehaald moet worden vanuit de database en niet 1 record. Met GetRow moet er elke keer een nieuwe sql query worden uitgevoerd. Wat de snelheid niet ten goede komt.
(Mocht ik er naast zitten moeten jullie het maar aanvullen)

Op gebied van adodb ben ik nog maar een beginner.

Acties:
  • 0 Henk 'm!

  • trinite_t
  • Registratie: Maart 2003
  • Laatst online: 17-09 14:06
wolkje schreef op woensdag 21 juni 2006 @ 11:31:
[...]

Misschien wel, maar het is imho netter om te zorgen dat beide variabelen van hetzelfde type zijn :) Ookal is het ook inderdaad raadzaam om toch eens uit te zoeken die DB connectie precies teruggeeft. En of je niet misschien GetRow dient te gebruiken, ookal is het maar om het volgens het boekje te doen ;)
Ben ik ook wel met je eens... maar ik vind het iig netter dan het casten naar een string (wordt nu onderwater ook wel gedaan, maar toch).

The easiest way to solve a problem is just to solve it.


Acties:
  • 0 Henk 'm!

  • Cloud
  • Registratie: November 2001
  • Laatst online: 17-09 10:39

Cloud

FP ProMod

Ex-moderatie mobster

valkej schreef op woensdag 21 juni 2006 @ 11:40:
GetRow gaat in dit geval niet, aangezien er een gehele lijst opgehaald moet worden vanuit de database en niet 1 record. Met GetRow moet er elke keer een nieuwe sql query worden uitgevoerd. Wat de snelheid niet ten goede komt.
(Mocht ik er naast zitten moeten jullie het maar aanvullen)

Op gebied van adodb ben ik nog maar een beginner.
Op de site die ik noemde stonden ook alternatieve commando's die gebruikt moesten worden in het geval van meerdere rijen :) Execute echter lijkt mij een functie die bedoeld is voor queries die geen resultset teruggeven.
trinite_t schreef op woensdag 21 juni 2006 @ 11:50:
Ben ik ook wel met je eens... maar ik vind het iig netter dan het casten naar een string (wordt nu onderwater ook wel gedaan, maar toch).
Ja zeker, casten naar string is ook absoluut niet netjes, dat ben ik met je eens. :) Het is inderdaad beter om zoals gezegd uit te zoeken hoe het officieel wel moet, en wat voor type zo'n adodb resultset precies is :)

Never attribute to malice that which can be adequately explained by stupidity. - Robert J. Hanlon
60% of the time, it works all the time. - Brian Fantana

Pagina: 1