PHP Fatal error: Uncaught Error: Call to a member function fetch_object() on boolean in

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Bollie Zwollie

Bollie Zwollie

26/06/2018 21:08:10
Quote Anchor link
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
function display_zoeken($query)
{
global $db;
global $uri;
$result = $db->query($query);
$display['thumbnail']='';
$i=0;
$display['thumbnail'] .=' <ul class="search-row" >';
 while($row =  $result->fetch_object())
   {
    $urls = detail($row);

    $img_src = $row->profile_image =='' ? 'img/no_image_'.$row->gender.'.jpg': $uri.'controller/'.$row->profile_image;
      $display['thumbnail'] .= '<li class="listzoek">
        <div class="search-user">
                    <a href="'.$urls.'" class="thumbnail" > <img src="'.$img_src.'" title="dating met '.$row->profile_name.'" > </a>
     </div>
                <div class="search-content">
                    <div class="left" style="width:170px;">
                        <strong><i class="icon-user"></i> '.$row->profile_name.'</strong>
                    </div>
                    <div class="left">
                        <span>'.$row->age.' jaar, uit '.$row->province.'</span>
                    </div>

                    <div class="span6" style="margin-left:0px; line-height: 21px;">
                       '.substr($row->aboutme,0,350).' ..
                    </div>
                </div>
                <div class="search-meta">
                    <a href="'.$urls.'" class="btn btn-small btn-info"><i class="icon-camera"></i> Bekijk profiel</a>
                    <a href="'.$urls.'" class="btn btn-small btn-success"><i class="icon-envelope"></i>  Stuur Bericht </a>
                    Test
                    <div class="btn btn-small">'.$row->fotos.' foto(s)</div>
                </div>
                </li>';
      $i++;
   }

if ($i == 0)
$display['thumbnail'] .=' <h3> Geen resultaten gevonden! </h3>';
$display['thumbnail'] .=' </ul>';
return $display;
}


Wanneer op de zoekpagina wil zoeken krijg ik de volgende error PHP Fatal error: Uncaught Error: Call to a member function fetch_object() on boolean in regel 329. Regel 329 is bij mij

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
$display['thumbnail'] .=' <ul class="search-row" >';
 while($row =  $result->fetch_object())


Ik begrijp niet wat er met de error bedoelt word. Kan iemand mij dat misschien uitleggen?
 
PHP hulp

PHP hulp

25/11/2024 08:09:06
 
- Ariën  -
Beheerder

- Ariën -

26/06/2018 21:36:25
Quote Anchor link
Bestaat $db eigenlijk wel? En bestaan de methods ook?
Zelf zou ik ze liever niet via globals inladen, maar als argument in je methods, of nog beter: via de __constructor als display_zoeken() onderdeel van een classe is.
 
Bollie Zwollie

Bollie Zwollie

26/06/2018 21:41:15
Quote Anchor link
$db bestaat wel.
 
- Ariën  -
Beheerder

- Ariën -

26/06/2018 21:46:34
Quote Anchor link
Dan denk ik dat je query niet goed is, en dat die een false teruggeeft, waar $result->fetch_object() niks mee kan.

Ikzelf gebruik altijd fetch_assoc() welke sneller werkt, en efficiënter is.
 
Bollie Zwollie

Bollie Zwollie

26/06/2018 21:48:30
Quote Anchor link
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
<?php
if(isset($_GET['uitgebreid'])){
$clause =' WHERE ';
$limit=10;
$stages ='none';

$page = isset($_GET['page'])?escape_string($_GET['page']):0;
$start = ($page !== 0)?($page - 1) * $limit:0;

        
        if(isset($_GET['geslacht'])){
        
        foreach($_GET['geslacht'] as $geslacht) {
        $gd[]=$db->escape_string($geslacht);
        }

        if (!empty($gd))
        $clause .= "gender in ('".implode("','",$gd)."') AND ";
        }

        
        if(isset($_GET['eyekleur'])){
        
        foreach($_GET['eyekleur'] as $huidskleur) {
        $ek[]=$db->escape_string($huidskleur);
        }

        if (!empty($ek))
        $clause .= "eye_color in ('".implode("','",$ek)."') AND ";
        }

        
        if(isset($_GET['postuur'])){
        foreach($_GET['postuur'] as $postuur) {
        $pt[]=$db->escape_string($postuur);
        }

        if (!empty($pt))
        $clause .= "physique in ('".implode("','",$pt)."') AND ";
        }

        
        if(isset($_GET['haarkleur'])){
        foreach($_GET['haarkleur'] as $haarkleur) {
        $hk[]=$db->escape_string($haarkleur);
        }

        if (!empty($hk))
        $clause .= "hair_color in ('".implode("','",$hk)."') AND ";
        }

        
        if(isset($_GET['provincie'])){
        foreach($_GET['provincie'] as $provincie) {
        $pv[]=$db->escape_string($provincie);
        }

        if (!empty($pv))
        $clause .= "province in ('".implode("','",$pv)."') AND ";

        }

        
    $clause .= ' DATE_FORMAT(FROM_DAYS(TO_DAYS(NOW())-TO_DAYS(birthdate)), "%Y")+0  >= '.$db->escape_string($_GET['sfminleeftijd']).' AND DATE_FORMAT(FROM_DAYS(TO_DAYS(NOW())-TO_DAYS(birthdate)), "%Y")+0   <= '.$db->escape_string($_GET['sfmaxleeftijd']).'';

    $queryl = "select *, count(small) as fotos, DATE_FORMAT(FROM_DAYS(TO_DAYS(NOW())-TO_DAYS(birthdate)), '%Y')+0 as age from user_profiles a LEFT join `user_pictures` b
    ON a.profile_id = b.user_id "
.$clause." group by a.profile_id  order by rand() asc LIMIT ".$start.",".$limit;
    $query = "SELECT count(*) as num  FROM `user_profiles` ".$clause." ";
    $targetpage = 'zoeken.php?'.$_SERVER['QUERY_STRING'];
    $profiles = display_zoeken($queryl);
    $paginate = paginate2($page, $stages, $limit, $targetpage, $query, $start);//current page, stages, limit, query

}
$arr['type']=  'search';
?>

Dit is het stuk waar de query opgebouwd wordt
Gewijzigd op 26/06/2018 22:28:11 door - Ariën -
 
- Ariën  -
Beheerder

- Ariën -

26/06/2018 21:51:24
Quote Anchor link
Je code-tags kloppen niet helemaal.
Maar voer je query eens droog uit in phpMyAdmin of welke SQL-cliënt je maar gebruikt.
 
Bollie Zwollie

Bollie Zwollie

26/06/2018 22:00:23
Quote Anchor link
Mijn ervaring is nog niet voldoende om dit erdoor te krijgen. Krijg nu iedere errors maar dat komt door de $ in de query

Toevoeging op 26/06/2018 22:11:02:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
SELECT count(*) as num FROM `user_profiles` WHERE province in ('Flevoland','Friesland') AND DATE_FORMAT(FROM_DAYS(TO_DAYS(NOW())-TO_DAYS(birthdate)), "%Y")+0 >= 20 AND DATE_FORMAT(FROM_DAYS(TO_DAYS(NOW())-TO_DAYS(birthdate)), "%Y")+0 <= 74;


Weergave van records 0 - 0 (1 totaal, Query duurde 0.0009 seconden.)

Dus hier gaat dan al iets fout. Maar begrijp nu niet wat er fout gaat helaas

Toevoeging op 26/06/2018 22:15:57:

Hij geeft dus wel de num 7

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
SELECT count(*) as num FROM `user_profiles` WHERE province in ('Flevoland','Friesland') AND DATE_FORMAT(FROM_DAYS(TO_DAYS(NOW())-TO_DAYS(birthdate)), "%Y")+0 >= 20 AND DATE_FORMAT(FROM_DAYS(TO_DAYS(NOW())-TO_DAYS(birthdate)), "%Y")+0 <= 74;


Bij deze 223

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
SELECT count(*) as num FROM `user_profiles` WHERE DATE_FORMAT(FROM_DAYS(TO_DAYS(NOW())-TO_DAYS(birthdate)), "%Y")+0 >= 20 AND DATE_FORMAT(FROM_DAYS(TO_DAYS(NOW())-TO_DAYS(birthdate)), "%Y")+0 <= 74
 
- Ariën  -
Beheerder

- Ariën -

26/06/2018 22:24:06
Quote Anchor link
Als hij geen error aangeeft, dan is de query gewoon valide. Of het de juiste uitkomt geeft ligt of je alles goed ingevuld hebt.

Ik raad aan om als debug je error even tijdelijk te echoén in je code, en deze output te gebruiken in je SQL-client.

Of bouw gewoon goede foutafhandeling in je script in. Ikzelf gebruik MySQLi en clone de query-method en plak er een mooie foutafhandeling bij in de vorm van een Exception.

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
<?php
class Database extends mysqli {
        
    function
query($query)
    {

        $result = parent::query($query);
    $this->totalQueries = $this->totalQueries+1;
        if($this->error) {
            throw new Exception(mysqli_error($this), mysqli_errno($this));
        }

        return $result;
    }
}
  
?>

Of het netjes is, laat ik aan anderen over. Maar voor nu werkt dit prima. ;-)
In de Exceptionhandler in mijn CMS vang ik vervolgens de Exception op.
Gewijzigd op 26/06/2018 22:29:10 door - Ariën -
 
Thomas van den Heuvel

Thomas van den Heuvel

27/06/2018 01:01:00
Quote Anchor link
Ook is het verstanding om te leren om dit soort foutmeldingen te doorgronden (interne link). Dit is niet echt moeilijk omdat PHP je precies vertelt wat er misgaat. Het is simpelweg een kwestie van het kruimelpad volgen.

@Ariën
Ik doe iets soortgelijks, maar ik tel geen queries die niet slagen. Er is op zich niet mis met een wrapper, sterker nog, deze is zelfs aan te bevelen mits deze wat werk verzet. Ik weet niet of dat jouw hele klasse is, of (en waarschijnlijker) slechts een fragment?

Op de volgende manier kun je ook je eigen result klasse gebruiken, die wellicht extend van mysqli_result (en mogelijk ook een database-result-interface implementeert), hierbij kun je ook een trace van alle tot dan toe uitgevoerde queries bijhouden:
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
<?php
public function query($query) {
    $this->_query = $query; // meest recente query
    if ($this->_trackQueries) {
        $this->_queries[] = $query; // lijst van alle queries
    }
    if ($this->_connection->real_query($this->_query)) {
        $this->_queryCount++; // aantal succesvol uitgevoerde queries
        return new My_Mysqli_Result_Class($this->_connection);
    }
else {
        throw new My_Exception($this->_connection->error);
    }
}

?>
Gewijzigd op 27/06/2018 15:23:55 door Thomas van den Heuvel
 
Bollie Zwollie

Bollie Zwollie

28/06/2018 14:40:30
Quote Anchor link
Ik heb het inmiddels opgelost. Hartelijk dank voor de hulp ik miste een $db
 
- Ariën  -
Beheerder

- Ariën -

28/06/2018 14:54:30
Quote Anchor link
@Thomas Dit was een deel van mijn class. Er zat ook een method in voor het tellen van querie's, maar dat was niet relevant om dit te tonen. Wel bleef er een restdeeltje achter, zoals je zag ;-)

Ik zal je array van gemaakte queries zeker aan mijn class toevoegen. Zeker handig!
 
Thomas van den Heuvel

Thomas van den Heuvel

28/06/2018 16:42:14
Quote Anchor link
@Bollie Zwollie: mooi dat het is opgelost
@Ariën: dan zou ik ook een property introduceren waarmee je de "query trace" aan en uit kunt zetten, uit performanceoverwegingen, maar ook omdat niet altijd alle queries interessant zijn, maar slechts sommige
 
- Ariën  -
Beheerder

- Ariën -

28/06/2018 17:08:49
Quote Anchor link
Geen slecht idee. Dat scheelt me dat eeuwige ge-echo in de classes :X
 
Thomas van den Heuvel

Thomas van den Heuvel

29/06/2018 14:01:16
Quote Anchor link
Bollie Zwollie op 28/06/2018 14:40:30:
ik miste een $db

Heb hier nog even over nagedacht. Dit stemt niet overeen met de oorspronkelijke foutmelding. Als $db inderdaad zou ontbreken dan zou de code al stuk moeten lopen op $db->query() met een melding als: Fatal error: Uncaught Error: Call to a member function query() on something.

De foutmelding wekt (nog steeds) de sterke suggestie dat er (wellicht soms, maar mogelijk niet altijd) iets mis is met het format van $query.

Indien het codefragment niet langer in de pas loopt met de foutmelding of vice versa dan is het natuurlijk koffiedik kijken wat er nu daadwerkelijk aan de hand is...
 



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.