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?
Ik kan me niet indenken dat het met de WIndows Phone te maken heeft, gezien PHP op de server draait.
het klinkt als missende foutafhandeling. Kan je misschien wat relevante code tonen?
Ik heb zelf ook windows phone toestellen, kan je me de website geven? dan kijk ik even :)
@racoon, de website is een afgeschermde website. Dus dat gaat helaas niet werken.

Dit is het stukje script:

<?php
$serverName 		= "{naam}";
$connectionInfo 	= array( "Database"=>"{databasename}", "UID"=>"{gebruikersnaam}", "PWD"=>"{wachtwoord}");
$db 				= sqlsrv_connect( $serverName, $connectionInfo);

$qry	= sqlsrv_query($db, "SELECT Email, GebruikersNaam, Naam, Telefoon, KantoorId, TelefoonMobiel FROM gebruikers WHERE GebruikersNaam = '".$_SESSION['username']."'");						 	
$ech	= sqlsrv_fetch_object($qry);
?>

als ik var_dump($ech) doe, krijg ik op mijn laptop netjes deze gegevens:
object(stdClass)#2 (6) { ["Email"]=> string(18) "{waarde}" ["GebruikersNaam"]=> string(7) "{waarde}" ["Naam"]=> string(12) "{waarde}" ["Telefoon"]=> string(10) "{waarde}" ["KantoorId"]=> int(1) ["TelefoonMobiel"]=> string(10) "{waarde}" }

Waarbij {waarde} uiteraard netjes ingevuld is.
Open ik dezelfde pagina op mijn windows phone, krijg ik bool(false)

Nogmaals, op mijn tablet werkt dit prima, maar op windows phone 8 niet.

"Ik kan me niet indenken dat het met de WIndows Phone te maken heeft, gezien PHP op de server draait."
Niet direct in elk geval. De user agent, en mogelijk andere informatie, van de Windows Phone zal anders zijn. Ik kan me zomaar voorstellen dat deze in de database op wordt geslagen. Ik kan me ook voorstellen dat de query die daarvoor gebruikt wordt gevoelig is voor SQL injectie.

Als je wilt dat we je hebben hebben we méér code nodig. Vooral de code vóór de fout.

Edit: bah, had moeten refreshen.
Hierbij de code:

<?PHP

date_default_timezone_set('Europe/Amsterdam');
error_reporting(E_ALL); ini_set('display_errors', '1');


session_start();
include 'incl/function.php';
include 'incl/db_supportware.php';

if(isset($_GET['set'])&&($_GET['set']=="logout"))
{

session_destroy();
}

if(!isset($_GET['page']))
{
$page = 'leeg';
}
else
{
$page = $_GET['page'];
}


echo '<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=iso-8859-1" />
<meta name="author" content="RElshof" />
<meta name="viewport" content="width=device-width initial-scale=1.0 maximum-scale=1.0 user-scalable=yes" />

<title>Helpdesk Zorggroep Sirjon</title>

<link type="text/css" rel="stylesheet" href="src/css/demo.css" />
<link type="text/css" rel="stylesheet" href="src/css/jquery.mmenu.css" />
<link type="text/css" rel="stylesheet" href="src/css/extensions/jquery.mmenu.widescreen.css" media="all and (min-width: 900px)" />
<link type="text/css" rel="stylesheet" href="src/css/extensions/jquery.mmenu.themes.css" media="all and (min-width: 900px)" />

<style type="text/css">
@media all and (min-width: 900px) {
html, body {
height: 100%;
}
#menu {
background: #eee;
}
#page {
border-left: 1px solid #ccc;
min-height: 100%;
}
/* hide open-button */
a[href="#menu"]
{
display: none !important;
}
}
</style>

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<script type="text/javascript" src="src/js/jquery.mmenu.js"></script>
<script type="text/javascript" src="tinymce/tinymce.min.js"></script>
<script type="text/javascript">
$(function() {
$(\'nav#menu\').mmenu({
classes: \'mm-light\'
});
});
</script>
</head>

<body>
<div id="page">
<div id="header">
<a href="#menu"></a>
'.headertitle($page).'
</div>
<div id="content">';

$username = adselector('username', $_SESSION['username']);
$username = str_replace(' ', '', $username);

$query = "SELECT TOP (1) Categorie FROM zaken WHERE ZaakGebruiker = '".$username."' ORDER BY id DESC";
$qryU = sqlsrv_query($db, $query);
$echU = sqlsrv_fetch_object($qryU);

$lastCat = $echU->Categorie;

$qryU = sqlsrv_query($db, "SELECT Email, GebruikersNaam, Naam, Telefoon, KantoorId, TelefoonMobiel FROM gebruikers WHERE GebruikersNaam = '".$username."'");
$echU = sqlsrv_fetch_object($qryU);

$TelefoonMobiel = $echU->TelefoonMobiel;

echo tinymce('all').'<form action="'.$_SERVER['PHP_SELF'].'?page=addticket" method="post">
<table width="100%">
<tr>
<td class="lookofbutton" width="25%"><b>Onderwerp</b>:</td>
<td width="75%"><input type="text" name="Onderwerp" style="width:100%;"></td>
</tr>
<tr>
<td class="lookofbutton"><b>Telefoon</b>:</td>
<td><input type="text" name="Telefoon" style="width:100%;" value="'.$TelefoonMobiel.'"></td>
</tr>
<tr>
<td class="lookofbutton"><b>Categorie</b>:</td>
<td><select name="categorie" style="width:100%;" >

<option value="" /> -- Maak je keuze --</option>';


$qry = sqlsrv_query($db, "SELECT id, Naam, Omschrijving FROM categorie WHERE (Publiekelijk = 1) ORDER BY Naam");
while($ech = sqlsrv_fetch_object($qry))
{
if(stristr($ech->Naam, '*') === FALSE)
{
echo '<option value="'.$ech->id.'"'; if($lastCat==$ech->id) { echo 'selected'; } echo '>'.$ech->Naam.' ('.$ech->Omschrijving.')</option>';
}
}


echo '</select></td>
</tr>
<tr>
<td class="lookofbutton"><b>Lokatie</b>:</td>
<td><select name="lokatie" style="width:100%;" >

<option value="" /> -- Maak je keuze --</option>';


$qry = sqlsrv_query($db, "SELECT id, Naam FROM kantoren ORDER BY Naam");
while($ech = sqlsrv_fetch_object($qry))
{
if(stristr($ech->Naam, '*') === FALSE)
{
echo '<option value="'.$ech->id.'"'; if($echU->KantoorId==$ech->id) { echo 'selected'; } echo '>'.$ech->Naam.'</option>';
}
}


echo '</select></td>
</tr>
<tr>
<td colspan="2"><textarea name="omschrijving">'.$_SESSION['omschrijving'].'</textarea></td></td>
</tr>
<tr>
<td colspan="2"><input type="submit" name="login" style="width:100%;" value="Verzenden"></td>
</tr>
</table>
</form>';


echo '</div>
<nav id="menu">
<ul>
<li '; if(isset($_GET['login'])&&($_GET['login']=="")) { echo 'class="Selected"'; } echo '><a href="'.$_SERVER['PHP_SELF'].'">Home</a></li>
<li '; if(isset($_GET['login'])&&($_GET['login']=="addticket")) { echo 'class="Selected"'; } echo '><a href="'.$_SERVER['PHP_SELF'].'?page=addticket">Support aanvragen</a>
<li '; if(isset($_GET['login'])&&($_GET['login']=="mysupport")) { echo 'class="Selected"'; } echo '><a href="'.$_SERVER['PHP_SELF'].'?page=mysupport">Support status</a></li>
<li '; if(isset($_GET['login'])&&($_GET['login']=="storingen")) { echo 'class="Selected"'; } echo '><a href="'.$_SERVER['PHP_SELF'].'?page=storingen">Storingen overzicht</a></li>
<li '; if(isset($_GET['login'])&&($_GET['login']=="onderhoud")) { echo 'class="Selected"'; } echo '><a href="'.$_SERVER['PHP_SELF'].'?page=onderhoud">Onderhoudoverzicht</a></li>';

if($_SESSION['login']==true)
{
$ou = adselector('ou', $_SESSION['username']);
if(strrpos($ou, "I&A")==true)
{
echo '<li '; if(isset($_GET['login'])&&($_GET['login']=="Supportdesk")) { echo 'class="Selected"'; } echo '><a href="'.$_SERVER['PHP_SELF'].'?page=Supportdesk">Supportdesk</a></li>';
}
echo '<li><a href="'.$_SERVER['PHP_SELF'].'?set=logout">Uitloggen</a></li>';
}
else
{
echo '<li><a href="'.$_SERVER['PHP_SELF'].'?page=inloggen">Inloggen</a></li>';
}
echo '</ul>
</nav>
</div>
<script type="text/javascript" language="javascript" src="src/js/footer.js"></script>
</body>
</html>';

Even een stukje van php.net over de functie sqlsrv_fetch_object()

Return Values

Returns an object on success, NULL if there are no more rows to return, and FALSE if an error occurs or if the specified class does not exist.


Ik zie deze functie vier keer in je code staan en vier keer zonder fout-afhandeling.
Voorbeeldje:
<?php
$echU = sqlsrv_fetch_object($qryU);
if($echU === FALSE)
echo 'er is iets fout gegaan bij regel X.';
?>
Ik krijg dan deze error:

Array ( [0] => Array ( [0] => IMSSP [SQLSTATE] => IMSSP [1] => -14 [code] => -14 [2] => An invalid parameter was passed to sqlsrv_fetch_object. [message] => An invalid parameter was passed to sqlsrv_fetch_object. ) )

Wat ik niet snap is, waarom het op de tablet/laptop wel werkt en op windows phone niet.
De code veranderd niet. Roep de pagina op dezelfde wijze aan.
Ik vermoed dat er iets niet erg lekker gaat met de cookies, sessie of GET variabelen. Het is een kwestie van debuggen dus

[size=xsmall]Toevoeging op 26/05/2014 14:13:07:[/size]

Het betekent dat de query niet juist is. ik vermoed dat $username leeg is op regel 84. er gaat iets niet goed met je sessions.
@Frank, wat betreft de foutafhandeling, dat klopt inderdaad. Deze moet er nog in komen.
Was eigenlijk nog te veel bezig met de design. En ja, dat soort dingen hoor je gelijk te doen. Ik weet het.

Iemand nog een idee? Ik zal nog eens wat andere telefoons proberen van collega's. Even kijken of het nog meer voorkomt.

[size=xsmall]Toevoeging op 26/05/2014 14:15:51:[/size]

Als ik de query echo, dan is de gebruikersnaam netjes ingevuld.
Dat is het vreemde ervan. Dat had ik gelijk al gecheckt.

Reageren