Avatar billede jwulff Nybegynder
12. februar 2010 - 14:06 Der er 9 kommentarer og
2 løsninger

Klasse til håndtering af db

Hej.

Jeg er lige gået i gang med OOP PHP, og har lavet en db.class.php som skal håndtere min db connections og forespørgelser.

Klassen har bl.a. funktionen:

-----------------------
public function query($sql) {
$this->result = mysqli_query($this->connection, $sql);
}
-----------------------

Mit spørgsmål er så, hvordan jeg henter mine resultater ud?

-----------------------
$db = new db();
$db->connect();

$db->query("SELECT * FROM Users");

????????????????

$db->disconnect();
-----------------------

Nogen der kan hjælpe?

Mvh.
Jacob
Avatar billede mike2002 Nybegynder
12. februar 2010 - 14:10 #1
$query = $db->query("SELECT * FROM Users");
while($row = mysql_fetch_array($query))
{
  echo $row["username"] . ", " . $row["age"];
}
Avatar billede jwulff Nybegynder
12. februar 2010 - 14:23 #2
Hej igen,

Det er mysqli og ikke mysql.

Jeg har forsøgt mig med:

-----------------------
$db = new db();
$db->connect();

$result = $db->query("SELECT * FROM Users");

while ($row = $result->fetch_object()) {
    echo $row->user;
}

$db->disconnect();
-----------------------

Men får fejlen: Call to a member function fetch_object() on a non-object on line 11

Line 11 er while linien..

Er jeg helt galt på den?
Avatar billede mike2002 Nybegynder
12. februar 2010 - 14:29 #3
Kan det være sådan (kan ikke helt huske det...)?

while ($row = mysqli_fetch_object($result)) {
    echo $row->user;
}
Avatar billede mike2002 Nybegynder
12. februar 2010 - 14:44 #4
Det her er mere eller mindre taget fra php.net:

$query = $db->query("SELECT * FROM Users");

if ($result = $mysqli->query($query)) {
    while ($obj = $result->fetch_object()) {
        printf ("%s\n", $obj->user);
    }

    $result->close();
}
Avatar billede jwulff Nybegynder
12. februar 2010 - 14:48 #5
Har vist fundet problemet. Hvis jeg kopiere min new mysqli linie ind i stedet for new db() i config.php, så virker koden. Men den kan åbenbart ikke ved at brugernavn osv. er i db.class.php:

db.class.php:
class db {

private $db;
private $connection;

public function connect() {
$this->connection = new mysqli("xx", "xx", "xx", "xx_booking");
}

config.php:
$db = new db();
db->connect();

$result = $db->query("SELECT name FROM Users WHERE user_id = '47'");

while ($row = $result->fetch_object()) {
    echo $row->name;
}

Gør jeg noget forket med $db i config.php?
Avatar billede jwulff Nybegynder
12. februar 2010 - 14:49 #6
der skal selvf. være $ foran db.
Avatar billede mike2002 Nybegynder
12. februar 2010 - 15:01 #7
Det her er ikke et result:
$result = $db->query("SELECT name FROM Users WHERE user_id = '47'");

Så den burde du kalde query
$query = $db->query("SELECT name FROM Users WHERE user_id = '47'");

Dit result hedder:
$result = mysqli_fetch_object($query);

Du burde kunne skrive data ud:
while($result = mysqli_fetch_object($query))
{
    echo $result->user;
}
Avatar billede dkfire Nybegynder
12. februar 2010 - 16:58 #8
Husk nu lige at lave et return i din funktion, ellers virker det jo slet ikke.

Dernæst giver det ingen mening at have mysqli funktioner udenfor din database klasse. Hvis du vælger dette, så er der jo lige meget med at lave en database klasse.

Din query funktion skal nok være:
public function query($sql) {
    return mysqli_query($this->connection, $sql);
}
Avatar billede jwulff Nybegynder
12. februar 2010 - 17:35 #9
Alletiders, en kombination af jeres svar virkede! :-) Smid et svar begge.

Lige et hurtigt spørgsmål: Vil jeg få bedre performance, ved at lave mysqli_query om til prepared statement i db.class? Og er der et et "keyword" alle mysqli_query til dette?
Avatar billede dkfire Nybegynder
13. februar 2010 - 10:32 #10
Prepared statement er altid at foretrække, det kan til dels hjælpe dig mod sql-injection.
Avatar billede mike2002 Nybegynder
13. februar 2010 - 22:46 #11
Forstår ikke helt "keyword"...

Men her er et svar ;-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester