MSSQL: Hoe query'en naar binaire data?

Alles over programmeren en development binnen de IT-wereld
Plaats reactie
Gebruikersavatar
meon
Administrator
Administrator
Berichten: 16757
Lid geworden op: 18 feb 2003, 22:02
Twitter: meon
Locatie: Bree
Uitgedeelde bedankjes: 582 keer
Bedankt: 780 keer
Provider

Ik heb database van een behoorlijk zware applicatie op het werk, draaiend op Microsoft SQL Server (10.50.1600).

Heb hier een tabel die er verkort zo uit zie:

Code: Selecteer alles

CREATE TABLE [dbo].[ca_contact] (
[contact_uuid] binary(16) NOT NULL ,
[middle_name] nvarchar(100) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
[alias] nvarchar(30) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
[last_name] nvarchar(100) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ,
[first_name] nvarchar(100) COLLATE SQL_Latin1_General_CP1_CI_AS NULL 
)
ON [PRIMARY]
GO
Merk op het veld "contact_uuid" van het type "binary".
Dit is dus een primary key en zou ik dus graag op kunnen selecteren.

...Maar het lukt me niet om daar naar te query'en vanuit PHP, gebruik makend van Microsoft's SQL Server library :).

Code: Selecteer alles

$q = sqlsrv_query($sqlconn, "SELECT * FROM ca_contact WHERE contact_uuid = ?", array('0x'.$_SESSION['UUID']));
> $q == NULL

Code: Selecteer alles

$q = sqlsrv_query($sqlconn, "SELECT * FROM ca_contact WHERE contact_uuid = 0x935152ED382D184AA7AE9CE746E9F2E7");
> $q == resource //OK
Hoe moet ik die query schrijven zodat ik hem dynamisch kan houden?
Mathy
Elite Poster
Elite Poster
Berichten: 842
Lid geworden op: 17 feb 2010, 11:09
Uitgedeelde bedankjes: 35 keer
Bedankt: 74 keer

Ik vermoed dat hij een getal verwacht ipv een string dus mijn eerste gedacht zou zijn:

Code: Selecteer alles

$q = sqlsrv_query($sqlconn, "SELECT * FROM ca_contact WHERE contact_uuid = ?", array($_SESSION['UUID']));
Maar dat vereist wel dat de inhoud van $_SESSION['UUID'] een binary is en geen string-representatie. Wat heb je er origineel ingestoken? Een UUID?

Een andere oplossing is

Code: Selecteer alles

$q = sqlsrv_query($sqlconn, "SELECT * FROM ca_contact WHERE contact_uuid = 0x". $_SESSION['UUID']);
Maar dat is niet echt done aangezien je geen validatie doet op je parameters (sql injection).

Levert sqlsrv_errors je geen bruikbare info?
Skynet Generation Internet

http://mathy.vanvoorden.be
Gebruikersavatar
meon
Administrator
Administrator
Berichten: 16757
Lid geworden op: 18 feb 2003, 22:02
Twitter: meon
Locatie: Bree
Uitgedeelde bedankjes: 582 keer
Bedankt: 780 keer
Provider

Ja, was ook al half tot die conclusie gekomen, maar sinds m'n probleem (week geleden), weer uit het oog verloren :)
Dat 2e kan alvast niet, je kan geen variabelen gebruiken in het query-gedeelte (best cool, je bent verplicht via statements te werken).

Morgen eens proberen te casten naar binary, dat zou mogelijk moeten zijn in PHP 5.2.1+: http://php.net/manual/en/language.types ... ggling.php
Zou dan zoiets worden vermoed ik:

Code: Selecteer alles

$uuid = '0x'.$_SESSION['UUID'];
$q = sqlsrv_query($sqlconn, "SELECT * FROM ca_contact WHERE contact_uuid = ?", array((binary)$uuid));
ubremoved_539
Deel van't meubilair
Deel van't meubilair
Berichten: 29849
Lid geworden op: 28 okt 2003, 09:17
Uitgedeelde bedankjes: 434 keer
Bedankt: 1972 keer

Maak het veld gewoon alfanumeriek en converteer je binary data naar een HEX representatie.

Veel netter... enige nadeel is dat het veld dubbel zo groot is.
Gebruikersavatar
meon
Administrator
Administrator
Berichten: 16757
Lid geworden op: 18 feb 2003, 22:02
Twitter: meon
Locatie: Bree
Uitgedeelde bedankjes: 582 keer
Bedankt: 780 keer
Provider

Database aanpassen is geen optie.

Maar dit lijkt te werken (casten hielp niet):
Mathy schreef:

Code: Selecteer alles

$q = sqlsrv_query($sqlconn, "SELECT * FROM ca_contact WHERE contact_uuid = 0x". $_SESSION['UUID']);
Maar dat is niet echt done aangezien je geen validatie doet op je parameters (sql injection).
Ik weet niet of dit in dit geval een probleem zou leveren, $_SESSION['UUID'] is geen waarde die door een gebruiker ingegeven is (resultaat van een SOAP-call).
Mathy
Elite Poster
Elite Poster
Berichten: 842
Lid geworden op: 17 feb 2010, 11:09
Uitgedeelde bedankjes: 35 keer
Bedankt: 74 keer

En wat zegt sqlsrv_errors ? Ik zou verwachten dat daar instaat welk type hij verwacht en welk type hij tegengekomen is, dan weet je automatisch naar wat je moet casten.

Je kan trouwens ook altijd gewoon zelf validatie doen op de string, en dan is het ook safe:

http://stackoverflow.com/questions/5748 ... -using-php
Skynet Generation Internet

http://mathy.vanvoorden.be
Gebruikersavatar
meon
Administrator
Administrator
Berichten: 16757
Lid geworden op: 18 feb 2003, 22:02
Twitter: meon
Locatie: Bree
Uitgedeelde bedankjes: 582 keer
Bedankt: 780 keer
Provider

sqlsrv_errors() is empty :)

Ik kan hier inderdaad een validatiecheck tussen zetten of enkel HEX-tekens in de oorspronkelijke string zitten.
Plaats reactie

Terug naar “Development”