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

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Senior .NET Back-end Developer in ons innovation t

Bedrijfsomschrijving Namens één van mijn betere klanten, gevestigd in de omgeving van Amstelveen, ben ik op zoek naar een ervaren Senior Back-end Developer met minimaal vier jaar werkervaring. Je komt terecht in een echte developmentorganisatie, waarbinnen momenteel ruim 40 enthousiaste mannen en vrouwen dagelijks werken aan de ontwikkeling van complexe applicaties, die veelal webbased zijn. Deze applicaties worden gebruikt door zowel grote als kleine organisaties in zowel binnen- als buitenland en zijn bedoeld om bedrijven te ondersteunen in alles wat te maken heeft met financiën. Zo levert deze organisatie standaard- en maatwerkapplicaties waarbinnen bedrijven bijvoorbeeld al hun zaken omtrent salarishuishouding

Bekijk vacature »

Pagina: 1 2 volgende »

Ruben Elshof

Ruben Elshof

26/05/2014 13:20:58
Quote Anchor link
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?
 
PHP hulp

PHP hulp

03/08/2021 08:35:26
 
- Ariën -
Beheerder

- Ariën -

26/05/2014 13:28:27
Quote Anchor link
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?
 
Racoon smasher

racoon smasher

26/05/2014 13:28:40
Quote Anchor link
Ik heb zelf ook windows phone toestellen, kan je me de website geven? dan kijk ik even :)
 
Ruben Elshof

Ruben Elshof

26/05/2014 13:35:19
Quote Anchor link
@racoon, de website is een afgeschermde website. Dus dat gaat helaas niet werken.

Dit is het stukje script:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?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.

- Aar -:
Gelieve in het vervolg bij code de [code][/code]-tags gebruiken.
Alvast bedankt!
Gewijzigd op 26/05/2014 13:41:50 door - Ariën -
 
Dos Moonen

Dos Moonen

26/05/2014 13:39:52
Quote Anchor link
"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.
Gewijzigd op 26/05/2014 13:40:29 door Dos Moonen
 
Ruben Elshof

Ruben Elshof

26/05/2014 13:46:41
Quote Anchor link
Hierbij de code:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
<?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>'
;
 
- Ariën -
Beheerder

- Ariën -

26/05/2014 14:01:49
Quote Anchor link
Kijken of sqlsrv_query() FALSE returned, en dan echo je sqlsrv_errors()

Zie ook: http://nl1.php.net/manual/en/function.sqlsrv-errors.php
 
Frank Nietbelangrijk

Frank Nietbelangrijk

26/05/2014 14:08:11
Quote Anchor link
Even een stukje van php.net over de functie sqlsrv_fetch_object()
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
$echU
    = sqlsrv_fetch_object($qryU);
if($echU === FALSE)
    echo 'er is iets fout gegaan bij regel X.';
?>
 
Ruben Elshof

Ruben Elshof

26/05/2014 14:09:17
Quote Anchor link
Ik krijg dan deze error:

Array ( [0] => Array ( [0] => IMSSP [SQLSTATE] => IMSSP [1] => -14
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
=> -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.
 
Frank Nietbelangrijk

Frank Nietbelangrijk

26/05/2014 14:09:43
Quote Anchor link
Ik vermoed dat er iets niet erg lekker gaat met de cookies, sessie of GET variabelen. Het is een kwestie van debuggen dus

Toevoeging op 26/05/2014 14:13:07:

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.
 
Ruben Elshof

Ruben Elshof

26/05/2014 14:15:06
Quote Anchor link
@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.

Toevoeging op 26/05/2014 14:15:51:

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

Frank Nietbelangrijk

26/05/2014 14:52:44
Quote Anchor link
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.
 
Ruben Elshof

Ruben Elshof

26/05/2014 15:04:40
Quote Anchor link
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'
 
Dos Moonen

Dos Moonen

26/05/2014 15:16:08
Quote Anchor link
Quote:
Open ik dezelfde pagina op mijn windows phone, krijg ik bool(false)


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

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


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


De door jou gegeven error:
Quote:
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.
Gewijzigd op 26/05/2014 15:18:30 door Dos Moonen
 
Ruben Elshof

Ruben Elshof

26/05/2014 15:20:09
Quote Anchor link
@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 (php)
PHP script in nieuw venster Selecteer het PHP script
1
=> 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 => 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'. ) )
 
Frank Nietbelangrijk

Frank Nietbelangrijk

26/05/2014 18:36:50
Quote Anchor link
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.
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

26/05/2014 19:01:03
Quote Anchor link
>> 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
 
Frank Nietbelangrijk

Frank Nietbelangrijk

26/05/2014 19:38:37
Quote Anchor link
Inderdaad ger, ik zag die $username als een waarde uit de database. iets te snel. Zou overigens indirect nog zo kunnen zijn.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$username
= adselector('username', $_SESSION['username']);
?>


Wat doet die functie?
 
Ruben Elshof

Ruben Elshof

28/05/2014 12:21:19
Quote Anchor link
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?

Toevoeging op 28/05/2014 14:47:49:

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?
 
- SanThe -

- SanThe -

28/05/2014 14:51:21
Quote Anchor link
Probeer trim() eens.
 
Dos Moonen

Dos Moonen

28/05/2014 15:07:21
Quote Anchor link
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
 

Pagina: 1 2 volgende »



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.