Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[PHP] Query function niet aan te roepen.

Pagina: 1
Acties:

  • martin149
  • Registratie: Augustus 2009
  • Laatst online: 03-11 22:01
Ik heb voor een website altijd gebruik gemaakt van de standaard mysql functies, en ben sinds kort overgegaan naar mysqli. Nu is echter het probleem dat ik in een specifiek geval niet de query functie in mijn eigen class aan kan roepen...

De opbouw is als volgt:

Index.php -> Included base.php en home.php
base.php:
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
class engine{
    public function __construct(){
        $mysql_host = 
        $mysql_database = 
        $mysql_user = "
        $mysql_password = "
        $this->mysqli = new mysqli($mysql_host, $mysql_user, $mysql_password, $mysql_database);
        if ($this->mysqli->connect_errno) {
            $this->error("Connection to database failed.");
        }
    }

    public function query($query){
        if($content = $this->mysqli->query($query)){
            if($content->num_rows > 0){
                $data = array();
                while($row = $content->fetch_assoc()){
                    $data[] = $row;
                }
                return $data;
            }else{
                return false;
            }
        }else{
            $this->error($query.md5($this->mysqli->error));
        }
    }

}
$main = new engine();


home.php-> include header.php

header.php
PHP:
1
2
3
4
5
6
7
if($ads = $main->query("SELECT * FROM ad WHERE side = 'l' ORDER BY orde ASC")){
                foreach($ads as $ad){
                    echo "<li>";
                    echo "<a target=\"_blank\" href=\"{$ad['url']}\"><img src=\"{$ad['image']}\" /></a>";
                    echo "</li>";
                }
            }


Ik krijg echter de volgende error:
PHP Fatal error: Call to a member function query() on a non-object in /home5/***/header.php on line 113

Dit zou er mee te maken moeten hebben dat de query functie niet aan te roepen is, maar deze functie werkt wel degerlijk en dit zou het, naar mijn mening, gewoon moeten doen...

  • Whinger
  • Registratie: Mei 2012
  • Laatst online: 18-11 19:56
Kijk even naar je accolades, de functie query staat buiten je engine class.
My bad, je indents stonden niet goed, mijn fout inderdaad.

[ Voor 30% gewijzigd door Whinger op 18-08-2014 14:35 ]


  • martin149
  • Registratie: Augustus 2009
  • Laatst online: 03-11 22:01
j.devreede schreef op maandag 18 augustus 2014 @ 14:26:
Kijk even naar je accolades, de functie query staat buiten je engine class.
IK heb een beetje zitten knippen en plakken, hij staat er wel degerlijk in...

dit werkt namelijk wel (vanuit de class):
PHP:
1
2
3
4
    public function get_pages($sort="DESC", $first=0, $number=25){
        $query = "SELECT * FROM pages WHERE public = 1 ORDER BY id {$sort} LIMIT {$first},{$number};";
        return $this->query($query);
    }

  • Thijmen
  • Registratie: Juni 2011
  • Laatst online: 25-07 13:16
Wat je probleem is, is dat je in je header.php niet bij de $main kunt die je in de base.php declareert. Kun je in je header een var_dump doen op $main?

  • Whinger
  • Registratie: Mei 2012
  • Laatst online: 18-11 19:56
Wat gebeurd er als je een var_dump op $main doet in header.php?

  • martin149
  • Registratie: Augustus 2009
  • Laatst online: 03-11 22:01
code:
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
object(engine)#1 (1) {
  ["mysqli"]=>
  object(mysqli)#2 (19) {
    ["affected_rows"]=>
    int(0)
    ["client_info"]=>
    string(6) "5.5.37"
    ["client_version"]=>
    int(50537)
    ["connect_errno"]=>
    int(0)
    ["connect_error"]=>
    NULL
    ["errno"]=>
    int(0)
    ["error"]=>
    string(0) ""
    ["error_list"]=>
    array(0) {
    }
    ["field_count"]=>
    int(0)
    ["host_info"]=>
    string(25) "Localhost via UNIX socket"
    ["info"]=>
    NULL
    ["insert_id"]=>
    int(0)
    ["server_info"]=>
    string(15) "5.5.38-35.2-log"
    ["server_version"]=>
    int(50538)
    ["stat"]=>
    string(154) "Uptime: 227926  Threads: 10  Questions: 188966197  Slow queries: 2777  Opens: 2429807  Flush tables: 1  Open tables: 4096  Queries per second avg: 829.068"
    ["sqlstate"]=>
    string(5) "00000"
    ["protocol_version"]=>
    int(10)
    ["thread_id"]=>
    int(3027251)
    ["warning_count"]=>
    int(0)
  }
}

Dit is overigens wel hetzelfe als wanneer ik dit direct in de base.php doe

  • arnovr
  • Registratie: Juli 2009
  • Laatst online: 13-11 20:54
Even uit mijn hoofd, opties:
1)
Stopt het script bij:
$this->error("Connection to database failed.");
? Geen idee of the member wordt gezet bij connection failed. ( lijkt me wel )

2) Voeg eens mysql als member variable toe, werkt dit?

3) Exttend mysql, in plaats van initieren.
class engine extends mysqli {
public function __construct($host, $user, $pass, $db) {
parent::__construct($host, $user, $pass, $db);

  • Morrar
  • Registratie: Juni 2002
  • Laatst online: 21:44
Moet je die mysqli-variabele niet even in de klasse zelf definieren ook (i.v.m. scope)?

PHP:
1
2
3
4
5
6
7
class engine{
    public $mysqli = null;

    public function __construct(){
        ...
    }
}

  • martin149
  • Registratie: Augustus 2009
  • Laatst online: 03-11 22:01
Ik zie net dat na het weer inschakelen van notice's ik dit te zien krijg:
PHP Notice: Undefined variable: main in /home5/*/header.php on line 113

Het heeft er op dit moment dus puur mee te maken dat de class niet zichtbaar is voor de header.

  • Hipska
  • Registratie: Mei 2008
  • Laatst online: 10-11 14:09
Dat zei de foutmelding in je eerste post ook al.. Namelijk dat het geen object is.

  • martin149
  • Registratie: Augustus 2009
  • Laatst online: 03-11 22:01
Ik zit eens even wat proberen, en het aanroepen van dezelfde functie vanaf home.php werkt wel gewoon, zonder error (heeft dit te maken met de dubbele include?) Daarnaast lijkt het er wel op dat de functie, ondanks de error wel gewoon uitgevoerd wordt.

  • Whinger
  • Registratie: Mei 2012
  • Laatst online: 18-11 19:56
Doe je de include(s) toevallig binnen een functie? Includes binnen functies hebben weer bijzondere variabele scopes voor zover ik weet namelijk.

  • base_
  • Registratie: April 2003
  • Laatst online: 21-11 17:29
in die header.php zit niet toevallig een functie? Mocht $main ook binnen een functie beschikbaar moeten zijn dan moet je hem global maken.
When a file is included, the code it contains inherits the variable scope of the line on which the include occurs. Any variables available at that line in the calling file will be available within the called file, from that point forward. However, all functions and classes defined in the included file have the global scope.

  • martin149
  • Registratie: Augustus 2009
  • Laatst online: 03-11 22:01
Ik maak geen gebruik van functies om de includes te doen, helaas.

  • base_
  • Registratie: April 2003
  • Laatst online: 21-11 17:29
En ook geen functies in header?
edit:

Probeer eens met
PHP:
1
2
$ads = global $main;
if($ads != null && $ads != false) {

dan weet je iig of het met de scope te maken heeft.

[ Voor 28% gewijzigd door base_ op 18-08-2014 15:48 ]


  • martin149
  • Registratie: Augustus 2009
  • Laatst online: 03-11 22:01
Ik heb ondertussen dit in header.ph gezet, en er lijkt nog geen error log te verschijnen
code:
1
global $main;
Pagina: 1