PHP Fatal error: Uncaught Error: Call to a member function fetch_object() on boolean in
Code (php)
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
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;
}
{
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)
1
2
2
$display['thumbnail'] .=' <ul class="search-row" >';
while($row = $result->fetch_object())
while($row = $result->fetch_object())
Ik begrijp niet wat er met de error bedoelt word. Kan iemand mij dat misschien uitleggen?
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.
$db bestaat wel.
Ikzelf gebruik altijd fetch_assoc() welke sneller werkt, en efficiënter is.
Code (php)
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
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';
?>
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 -
Maar voer je query eens droog uit in phpMyAdmin of welke SQL-cliënt je maar gebruikt.
Toevoeging op 26/06/2018 22:11:02:
Code (php)
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)
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
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)
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 -
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:
Ook is het verstanding om te leren om @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)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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);
}
}
?>
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
Ik heb het inmiddels opgelost. Hartelijk dank voor de hulp ik miste een $db
Ik zal je array van gemaakte queries zeker aan mijn class toevoegen. Zeker handig!
@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
Geen slecht idee. Dat scheelt me dat eeuwige ge-echo in de classes :X
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...