[PHP] Problemen met database klasse

Pagina: 1
Acties:
  • 120 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Sjoerd
  • Registratie: December 2003
  • Niet online
Ik ben begonnen met klasses en een database klasse leek me leuk om mee te beginnen.

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
class database{

var $db;   //db connection variabele
var $dbName;
var $dbUser;
var $query;
var $result;

//lets connect to the database
function connect($dbName, $dbUser, $pass = "", $host = "localhost"){
    //lets finally connect
    $this->db = mysql_connect($host, $this->dbUser, $pass);
    return $this->db=mysql_select_db ($dbName, $this->db) or die
('ERROR: Cant find database"'.$this->dbName.'" niet vinden');
}

//lets execute a specific query
function setQuery($sql){
    if(empty($sql)){
        die("You entered an empty query!");
        return false;
    }else{
        $this->query = mysql_query($sql) or die(mysql_error());
        return true;
    }
}

//return the result
function getResult(){
    $this->result=mysql_fetch_array($this->query);
    return $this->result;
}

//return a very specific value of the result
function getSingleResult($column){
    $this->result=mysql_fetch_array($this->query, MYSQL_BOTH);
    return $this->result[$column];
}

//lets return the number of rows of the result
function getNumRows(){
    return mysql_num_rows($this->query);
}


Dat is dus een deel van mijn klasse die gebruik ik nu als volgt:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
function getSiteNavVertImg(){
    $db=new database();
    $db->connect('multimediaatcommandnew','','','');
    $db->setQuery("SELECT *
                FROM navigation
                WHERE linkOrder<>'0'
                ORDER BY linkOrder, parentID DESC
                ");
    $temp=$db->getResult();
    print_r($temp);
    
    return $db->getNumRows();
}


Nu het probleem, wanneer ik deze query uitvoer in bv mysql query browser krijg ik 2 rijen terug (zoals bedoeld), de functie returned ook de waarde 2 (dat klopt dus) echter krijg ik in $temp slechts een array met 1 rij.

En ik zie werkelijk niet waar ik de mist in ga, heb al verschillende database klasse bekeken en die doen het vrijwel op delzefde manier.

Modelbouw - Alles over modelbouw, van RC tot diorama


Acties:
  • 0 Henk 'm!

Verwijderd

mysql_fetch_array haalt ook maar 1 row uit je hele set. Als je alles in 1 array wilt returnen moet je in de desbetreffende functie dus een loop maken die een array opbouwt uit alle rows van je dataset.

Acties:
  • 0 Henk 'm!

  • Sjoerd
  • Registratie: December 2003
  • Niet online
Verwijderd schreef op dinsdag 04 december 2007 @ 13:03:
mysql_fetch_array haalt ook maar 1 row uit je hele set. Als je alles in 1 array wilt returnen moet je in de desbetreffende functie dus een loop maken die een array opbouwt uit alle rows van je dataset.
niet eens topic waardig 8)7 dat ik hier overheen keek :X

nuja dus:

PHP:
1
2
3
4
5
6
7
8
9
10
//return the result
function getResult(){
    $this->result=array();

    while($arrayItem=mysql_fetch_row($this->query)){
        array_push ($this->result, $arrayItem[0]);
    }
  
    return $this->result;
}

Modelbouw - Alles over modelbouw, van RC tot diorama


Acties:
  • 0 Henk 'm!

  • Joolee
  • Registratie: Juni 2005
  • Niet online
Óf je zult bij het aanroepen van getResult, deze functie net zo moeten behandelen als je normaalgesproken mysql_fetch_array zou gebruiken.

Acties:
  • 0 Henk 'm!

  • Mister_X
  • Registratie: Februari 2000
  • Laatst online: 17-04 14:07
voor records heb ik zoiets:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    function records($sql)
    {
        if(!$resource = mysql_query($sql, $this->mysql))
        {
            $this->logger(mysql_error()."\n{$sql}");
        }
        else
        {
            while($row = mysql_fetch_array($resource, MYSQL_ASSOC))
            {
                $records[] = $row;
            }
            return($records);
        }
    }


misschien heb je er iets aan ;)

update:

heb even me eigen class bekeken en heb wat aangepast dankzij die van topic starter :)

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
    private $mysql;

    function __construct($host, $user, $pass, $database)
    {
        if(!$this->mysql = mysql_connect($host, $user, $pass))
        {
            $this->logger(mysql_error());
        }
        else
        {
            if(!mysql_select_db($database)) $this->logger(mysql_error());
        }
    }
    function resource($sql)
    {
        if(!$resource = mysql_query($sql, $this->mysql))
        {
            $this->logger(mysql_error()."\n{$sql}");
        }
        else
        {
            return($resource);
        }
    }

    function row($sql)
    {
        if($resource = mysql_query($sql, $this->mysql))
        {
            return(mysql_fetch_array($resource, MYSQL_ASSOC));
        }
    }

    function records($sql)
    {
        if($resource = $this->resource($sql))
        {
            while($row = mysql_fetch_array($resource, MYSQL_ASSOC))
            {
                $records[] = $row;
            }
            return($records);
        }
    }


nu verloopt het zo, normaal zat in elke functie die $resource = mysql_query($sql), met een verwijzing naar de functie logger als het fout gaat, deze zit nu in functie resources, thx, kwam er ineens op, ding is onderdeel van een framework, zoveel code totaal dat je niet zomaar alles effe up to date houd zeg maar ;-)

[ Voor 77% gewijzigd door Mister_X op 04-12-2007 15:56 ]


Acties:
  • 0 Henk 'm!

  • YopY
  • Registratie: September 2003
  • Laatst online: 13-07 01:14
@Mister_X: ik zou als ik jou was wel voor iets beschrijvendere functienamen kiezen. Logischerwijs geef je een functie een naam die in een of twee woorden beschrijft wat het doet. Een functie 'records'... tsja, wat zou die nu doen? Je zou de functies "fetch_records" en "fetch_row" en dergelijke kunnen noemen, wat wat duidelijker aangeeft wat het doet.

Als ik zelf ooit weer eens met PHP bezig ga, ga ik of een bestaande ORM-oplossing gebruiken, of zelf weer eens met database klassen spelen. Maar dan niet weer een klasse Database oid, maar een DBConnection, Query, QueryResult etc structuur, inclusief abstractere vormen en interfaces voor meerdere databasesystemen.

Acties:
  • 0 Henk 'm!

  • Sjoerd
  • Registratie: December 2003
  • Niet online
Toch nog een probleem:

PHP:
1
2
3
4
5
6
7
function getResult(){
    $this->result=array();
    while($arrayItem=mysql_fetch_row($this->query)){
        array_push ($this->result, $arrayItem[0]);
    }
    return $this->result;
}


Mijn query is natuurlijk gevult ;)


stukje php waar de query wordt uitgevoerd

PHP:
1
2
3
4
5
6
7
8
    $db->setQuery("SELECT n.id,p.title
                FROM navigation n JOIN pages p
                ON n.id=p.id
                WHERE parentID='0'
                ORDER BY n.parentID DESC
                ");
    $parents=($db->getResult());
    print_r($parents);


uitkomst:
Array ( [0] => 1 [1] => 4 )

Echter in mijn mysql query browser:

id title
1 test1
4 test4


Schijnbaar toch nog een foutje :) maar ik zie hem weer niet ;)

Modelbouw - Alles over modelbouw, van RC tot diorama


Acties:
  • 0 Henk 'm!

  • sky-
  • Registratie: November 2005
  • Niet online

sky-

qn nna 👌

Snap je wel wat arrays doen ?

Je vult de array met steeds de eerste waarde.
Gebruik voor 't gemaakt mysql_fetch_assoc, en doe gewoon bijv array_push($this->result, $arrayItem)

Klaar.

don't be afraid of machines, be afraid of the people who build and train them.


Acties:
  • 0 Henk 'm!

Verwijderd

Sjoerd schreef op woensdag 05 december 2007 @ 11:31:
Toch nog een probleem:

PHP:
1
2
3
4
5
6
7
function getResult(){
    $this->result=array();
    while($arrayItem=mysql_fetch_row($this->query)){
        array_push ($this->result, $arrayItem[0]);
    }
    return $this->result;
}


...

Schijnbaar toch nog een foutje :) maar ik zie hem weer niet ;)
Je pusht alleen index 0 van je array naar je result, je moet gewoon het hele item als array pushen. Je krijgt wel een andere array als result die je misschien gewend bent, maar die kan je dan wel weer omzetten (of op een andere manier pushen) ;)

Acties:
  • 0 Henk 'm!

  • Mister_X
  • Registratie: Februari 2000
  • Laatst online: 17-04 14:07
YopY schreef op woensdag 05 december 2007 @ 09:10:
@Mister_X: ik zou als ik jou was wel voor iets beschrijvendere functienamen kiezen. Logischerwijs geef je een functie een naam die in een of twee woorden beschrijft wat het doet. Een functie 'records'... tsja, wat zou die nu doen? Je zou de functies "fetch_records" en "fetch_row" en dergelijke kunnen noemen, wat wat duidelijker aangeeft wat het doet.

Als ik zelf ooit weer eens met PHP bezig ga, ga ik of een bestaande ORM-oplossing gebruiken, of zelf weer eens met database klassen spelen. Maar dan niet weer een klasse Database oid, maar een DBConnection, Query, QueryResult etc structuur, inclusief abstractere vormen en interfaces voor meerdere databasesystemen.
er moeten nog comments bij, op zich zou elke programmeur wel snappen wat wat doet ? overigens hier de volledige class, om even in te spelen op meerdere database servers/systemen:

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
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
<?
class dbServer
{
    var $server;

    static function init($object = false) //makes db connection static
    {
        static $instance;

        if(!is_object($instance)) $instance = new dbServer($object);
        return($instance->server);
    }

    function __construct($object)
    {
        if(is_subclass_of($object,'dbServer')) $this->server = $object;
    }

    function display() //returns database structure as array
    {
        if(is_array($records = $this->records("SHOW TABLES")))
        {
            foreach($records as $table)
            {
                foreach($this->records("DESCRIBE ".implode(" ",$table)) as $properties)
                {
                    foreach($properties as $key => $value)
                    {
                        $objects[implode(" ",$table)][$properties['Field']][strtolower($key)] = strtolower($value);
                    }
                }
            }
            return($objects);
        }
    }
}

class Mysql extends dbServer
{
    private $mysql;

    function __construct($host, $user, $pass, $database) //connection
    {
        if(!$this->mysql = mysql_connect($host, $user, $pass))
        {
            $this->logger(mysql_error());
        }
        else
        {
            if(!mysql_select_db($database)) $this->logger(mysql_error());
        }
    }

    function resource($sql) //do query get resource
    {
        if(!$resource = mysql_query($sql, $this->mysql))
        {
            $this->logger(mysql_error()."\n{$sql}");
        }
        else
        {
            return($resource);
        }
    }

    function row($sql) //returns single row
    {
        if($resource = mysql_query($sql, $this->mysql)) return(mysql_fetch_array($resource, MYSQL_ASSOC));
    }

    function records($sql) //returns recordset
    {
        if($resource = $this->resource($sql))
        {
            while($row = mysql_fetch_array($resource, MYSQL_ASSOC))
            {
                $records[] = $row;
            }
            return($records);
        }
    }

    function rows($sql) //count
    {
        if($resource = $this->resource($sql)) return(mysql_num_rows($resource));
    }

    function query($sql) //update/insert/delete
    {
        if($resource = $this->resource($sql)) return(mysql_insert_id());
    }

    function version() //version
    {
        return(str_replace("-standard-log", "", mysql_get_server_info($this->mysql)));
    }

    function stats() //stats
    {
        return(explode('  ', mysql_stat($this->mysql)));
    }

    function logger($error) //logs error, uses module File.php
    {
        $files = new File("mysql.log");
        $files->save(date("Y-m-d H:i:s")."\n{$error}\n\n", "a");
    }
}
?>

[ Voor 105% gewijzigd door Mister_X op 05-12-2007 14:37 ]


Acties:
  • 0 Henk 'm!

  • killercow
  • Registratie: Maart 2000
  • Laatst online: 18-09 12:47

killercow

eth0

TS

Ik zou voor t nette ook references meegeven over welke verbinding je het hebt aan de mysql_query functie, en over wele result set je het hebt aan de andere functies.

Daarnaast vergeet je volgens mij this->dbName te vullen met de invoer van je connectie functie waardoor je DIE functie nooit een database naam zal geven in de error, tenzij je die vars direct al gevuld had (maar waarom vraagt de connect functie er dan nog om)

openkat.nl al gezien?

Pagina: 1