Dag iedereen,

Ik ben bezig om een website te maken voor multi device gebruik.
Dit is een website in PHP gehost op IIS7.
De data wordt uit een MS SQL database gehaald.

Nu is de website op mijn laptop en tablet goed te zien.
Ook gaat het op een android toestel prima.
Maar op mijn Windows Phone 8 werkt het niet.
Dan krijg ik deze fout:

Warning: sqlsrv_fetch_object() expects parameter 1 to be resource, boolean given in

Blijkbaar gaat Windows PHone 8 er anders mee om dan android of een tablet/laptop.
Heeft er iemand een idee?
Het lijkt vreemd inderdaad maar ik geloof er heilig in dat er een logische verklaring voor moet zijn. Als eerste is het belangrijk op welke regel het fout gaat want ik kan dat nu nog niet met zekerheid zeggen omdat er vier regels zijn met bovengenoemde functienaam. Ik zou je dus toch willen vragen die foutafhandeling in te bouwen zodat we straks weten waar we moeten zoeken. Vervolgens wil ik die query die je echo't dan wel eens zien.
Het gaat fout bij de eerste query, dus:
$query = "SELECT TOP (1) Categorie FROM zaken WHERE ZaakGebruiker = '".$username."' ORDER BY id DESC";
$qryU = sqlsrv_query($db, $query);
$echU = sqlsrv_fetch_object($qryU);


En dit is de query:
SELECT TOP (1) Categorie FROM zaken WHERE ZaakGebruiker = 'relshof' ORDER BY id DESC

Het punt is als ik de foutafhandeling van deze query even uitschakel door // er voor te zetten, dan gaat het op de volgende query fout:
$query = "SELECT Email, GebruikersNaam, Naam, Telefoon, KantoorId, TelefoonMobiel FROM gebruikers WHERE GebruikersNaam = '".$username."'";
$qryU = sqlsrv_query($db, $query);
$echU = sqlsrv_fetch_object($qryU);

de echo van $query: SELECT Email, GebruikersNaam, Naam, Telefoon, KantoorId, TelefoonMobiel FROM gebruikers WHERE GebruikersNaam = 'relshof'
Open ik dezelfde pagina op mijn windows phone, krijg ik bool(false)


php.net/manual/en/function.sqlsrv-query.php:
Return Values ¶

Returns a statement resource on success and FALSE if an error occurred.


php.net/manual/en/function.sqlsrv-errors.php:
sqlsrv_errors — Returns error and warning information about the last SQLSRV operation performed


De door jou gegeven error:
An invalid parameter was passed to sqlsrv_fetch_object.



Bij sqlsrv_query() gaat het al fout, dat weten we omdat deze FALSE returned. Dus we hebben niets aan de meest recente foutmelding na het uitvoeren van een andere sqlsrv_* functie.
Gebruik sqlsrv_errors() dus a.u.b. op het juiste moment zodat je ons relevante informatie kunt geven.

PS. Sorry als ik wat hard over kom, maar het is de bedoeling dat wij met jou meedenken, niet dat jij besluit ons al het denken te laten doen en alleen instructies opvolgt. Als je nog niet bekend bent met de PHP documentatie, ga dan de pagina's van functies lezen die je al kent. Zo leer je hoe de pagina's gestructureerd zijn om zo snel relevante informatie te kunnen vinden.
@Dos, ik volgde alleen op wat er eerder gevraagd was. En dat je met mij wilt mee denken waardeer is enorm.

Als ik de fout code opvraag van die eerste query krijg ik deze:
ERROR: Er is een fout ontstaan. ($qry1 )
Array ( [0] => Array ( [0] => 42000 [SQLSTATE] => 42000 [1] => 105 [code] => 105 [2] => [Microsoft][SQL Server Native Client 11.0][SQL Server]Unclosed quotation mark after the character string 'relshof'. [message] => [Microsoft][SQL Server Native Client 11.0][SQL Server]Unclosed quotation mark after the character string 'relshof'. ) [1] => Array ( [0] => 42000 [SQLSTATE] => 42000 [1] => 102 [code] => 102 [2] => [Microsoft][SQL Server Native Client 11.0][SQL Server]Incorrect syntax near 'relshof'. [message] => [Microsoft][SQL Server Native Client 11.0][SQL Server]Incorrect syntax near 'relshof'. ) )
Aha,

echo de query nu nog eens en je zult zien dat er ergens een ' of een " te veel staat.

Dat zit dan hoogst waarschijnlijk in een record in de database opgeslagen.

Je hebt bij het opslaan van de data zeer waarschijnlijk niet ge-escaped.
>> Dat zit dan hoogst waarschijnlijk in een record in de database opgeslagen.

Zeer onwaarschijnlijk als de query geen gegevens uit de database gebruikt ;-)

Lijkt er meer op dat ergens in de $_SESSION['username'] iets vreemds meekomt wat je bij de echo van de query niet ziet
Inderdaad ger, ik zag die $username als een waarde uit de database. iets te snel. Zou overigens indirect nog zo kunnen zijn.

<?php
$username = adselector('username', $_SESSION['username']);
?>

Wat doet die functie?
adselector is een functie om aan de hand van $_SESSION['username'] gegevens uit de AD te halen.
In dit geval de username.
Gebruik deze functie meer om alle andere gegevens te krijgen zoals displayname e.d.

Hoe word een Session gemaakt. Ik bedoel, het php script vult de sessie. Op een laptop werkt dit goed, maar op windows phone niet. Doet de browser/os ook nog wat met Sessions?

Zo ja, hoe kan ik de inhoud controleren? Want blijkbaar zit het daar dus fout. Maar hoe kan ik bepalen?

[size=xsmall]Toevoeging op 28/05/2014 14:47:49:[/size]

Ik denk dat ik weet wat er aan de hand is. De oplossing helaas alleen nog niet.
Als ik var_dump($_SESSION) doe krijg ik dit op de laptop te zien:
array(3) {
["login"]=>
bool(true)
["username"]=>
string(7) "relshof"
["ismobile"]=>
bool(false)
}

Echter op mijn windows phone het volgende:"
array(3) {
["login"]=>
bool(true)
["username"]=>
string(11) "relshof"
["ismobile"]=>
bool(true)
}

oftewel, de string is op mijn mobiel 4 tekens langer dan op de laptop, terwijl dit niet te zien is.
Hoe kan ik dit oplossen?
Probeer trim() eens.
Of nog liever: Ga je input valideren.

Als gebruikersnamen alleen uit (bijvoorbeeld) kleine letters mogen bestaan dan controleer je of dit het geval is tijden het registreren en het inloggen vóór dat je de gebruiker ook echt probeert te registreren/inloggen.
Als dat niet het geval is geef je een vriendelijke foutmelding die duidelijk maakt dat er tekens in zitten die er niet in mogen zitten. Het liefst die je dit dan ook nog eens in PHP, de database als deze dit toe laat, en in javascript zodat gebruikers niet eens op inloggen hoeven te klikken om te weten dat er iets fout is.

Verder stel ik voor dat je eens iets op zoekt over SQL-Injection. Een mooi begin is http://security.stackexchange.com/questions/25684/how-can-i-explain-sql-injection-without-technical-jargon

Reageren