Avatar billede razorblade Nybegynder
30. juli 2006 - 12:34 Der er 42 kommentarer og
1 løsning

Klasser og db forbindelse med udskrift

Hej.
Jeg har et problem med nedenstående script.
Det jeg gerne vil er at oprette en forbindelse til databasen og derefter udskrive noget fra databasen.
Jeg kan bare ikke få det til at fungere. Det SKAL være vha klasser, men måske man skulle lave 2 klasser med 1 metode i hver som så nedarver, i stedet for 1 klasser med 2 metoder som vist herunder.

<?PHP

class dbConnect {
    public $conn;
    public function __construct($host,$user,$pass,$db) {
        $conn = mysqli_connect("$host","$user","$pass","$db");
    }

    public function tester() {
        $result = mysqli_query($conn,"SELECT * FROM techno");
        while ($row = mysqli_fetch($result)) {
            return $row['Id_techno']."<br />";
        }   
    }
}

$dbC = new dbConnect("localhost","bruger","kode","database");
$dbC->tester();

?>
Avatar billede razorblade Nybegynder
30. juli 2006 - 12:36 #1
Jeg får følgende fejl meddelelser på ovenstående script.

Notice: Undefined variable: conn in C:\dbtest.php on line 10

Warning: mysqli_query() expects parameter 1 to be mysqli, null given in C:\dbtest.php on line 10

Warning: mysqli_fetch() expects parameter 1 to be mysqli_stmt, null given in C:\dbtest.php on line 11
Avatar billede nielle Nybegynder
30. juli 2006 - 12:47 #2
<?PHP
class dbConnect {
    public $conn;

    public function __construct($host, $user, $pass, $db) {
        $this->conn = mysqli_connect($host, $user, $pass, $db);
    }

    public function tester() {
        $result = mysqli_query($this->conn, "SELECT * FROM techno");

        while ($row = mysqli_fetch($result)) {
            return $row['Id_techno']."<br />";
        }   
    }
}

$dbC = new dbConnect("localhost","bruger","kode","database");
$dbC->tester();
?>
Avatar billede erikjacobsen Ekspert
30. juli 2006 - 12:50 #3
Du kan ikke sige return for hver række
        while ($row = mysqli_fetch($result)) {
            return $row['Id_techno']."<br />";
        }   
men skal fx samle det op i et array:
        $a=Array();
        while ($row = mysqli_fetch($result)) {
            $a[]= $row['Id_techno']."<br />";
        }   
        return $a;
Avatar billede razorblade Nybegynder
30. juli 2006 - 12:51 #4
Den giver følgende fejl:

Warning: mysqli_fetch() expects parameter 1 to be mysqli_stmt, object given in C:\dbtest.php on line 11
Avatar billede erikjacobsen Ekspert
30. juli 2006 - 12:51 #5
Hvis det skal være i et array, skal du nok ikke sætte "<br>" bagefter ;)
Avatar billede razorblade Nybegynder
30. juli 2006 - 12:52 #6
Kommentaren d. 30/07-2006 12:51:15 var ment til nielle
Avatar billede nielle Nybegynder
30. juli 2006 - 12:53 #7
erikjacobsen har ret mht. din return, men det er ikke pga. den at du får en fejlbesked.
Avatar billede razorblade Nybegynder
30. juli 2006 - 12:54 #8
Jeg behøver ikke at have det i et array erikjacobsen, det jeg skal bruge det til er som et eksempel på hvordan man kan lave en db connection og et udtræk dynamisk i samme klasse eller i 2 klasser vha nedarving :)
Avatar billede razorblade Nybegynder
30. juli 2006 - 12:57 #9
Følgende kode:

<?PHP
class dbConnect {
    public $conn;

    public function __construct($host, $user, $pass, $db) {
        $this->conn = mysqli_connect($host, $user, $pass, $db);
    }

    public function tester() {
        $result = mysqli_query($this->conn, "SELECT * FROM techno");

        $a=Array();
        while ($row = mysqli_fetch($result)) {
            $a[]= $row['Id_techno']."<br />";
        } 
        return $a; 
    }
}

$dbC = new dbConnect("localhost","bruger","pass","database");
$dbC->tester();
?>

Giver følgende fejl:

Warning: mysqli_fetch() expects parameter 1 to be mysqli_stmt, object given in C:\dbtest.php on line 11
Avatar billede nielle Nybegynder
30. juli 2006 - 13:04 #10
Prøv med:

<?PHP
class dbConnect {
    public $conn;

    public function __construct($host, $user, $pass, $db) {
        $this->conn = mysqli_connect($host, $user, $pass, $db);
    }

    public function tester() {
    $stmt = mysqli_prepare($this->conn, "SELECT * FROM techno"));
    mysqli_stmt_execute($stmt);
        $result = mysqli_query($stmt);

        while ($row = mysqli_fetch($result)) {
            return $row['Id_techno']."<br />";
        }   
    }
}

$dbC = new dbConnect("localhost","bruger","kode","database");
$dbC->tester();
?>
Avatar billede razorblade Nybegynder
30. juli 2006 - 13:08 #11
Den retunerer:
Parse error: parse error, unexpected ')' in C:\dbtest.php on line 35

Altså linjen:
$stmt = mysqli_prepare($this->conn, "SELECT * FROM techno"));

Og hvis jeg fjerner det ekstra ) så kommer følgende:
Warning: mysqli_query() expects at least 2 parameters, 1 given in C:\dbtest.php on line 37

Warning: mysqli_fetch() expects parameter 1 to be mysqli_stmt, null given in C:\dbtest.php on line 39
Avatar billede erikjacobsen Ekspert
30. juli 2006 - 13:11 #12
Så skal du netop have det i et array - ellers har du ikke adskilt dine konkrete data fra databasen, og dermed har du ikke opnået noget ved at have det i en separat klasse.
Avatar billede razorblade Nybegynder
30. juli 2006 - 13:11 #13
Men vil helst holde mig til simpel kode, sådan at f.eks. mysqli_prepare ikke er med og mysqli_stmt_execute osv da denne kode skal være som et eksempel på hvor nemt det egentlig er.
Så helst ikke en masse indbyggede funktioner udover den jeg allerede selv har :)
Hvis muligt.

Måske vi skulle lave det i 2 klasser ? Så kan db klassen jo bruges overalt uden man skal tænke på query klassen ?
Avatar billede razorblade Nybegynder
30. juli 2006 - 13:12 #14
Allright erikjacobsen, du siger noget.. Lad os holde os til at det bliver et array :)
Avatar billede erikjacobsen Ekspert
30. juli 2006 - 13:13 #15
Men hvorfor vil du ikke vide hvad der er galt ??  Fra din oprindelige kode
  $result = mysqli_query($this->conn, "SELECT * FROM techno");
retter du til
  $result = mysqli_query($this->conn, "SELECT * FROM techno") or die(mysqli_error($this->conn));
Avatar billede razorblade Nybegynder
30. juli 2006 - 13:17 #16
Jeg tager nu udgangspunkt i følgende script:

*********************************************
<?PHP

class dbConnect {
    public $conn;

    public function __construct($host, $user, $pass, $db) {
        $this->conn = mysqli_connect($host, $user, $pass, $db);
    }

    public function tester() {
        $result = mysqli_query($this->conn, "SELECT * FROM techno") or die(mysqli_error($this->conn));

        $a=Array();
        while ($row = mysqli_fetch($result)) {
            $a[]= $row['Id_techno'];
        } 
        return $a; 
    }
}

$dbC = new dbConnect("localhost","root","210382","technolog");
$dbC->tester();

?>
******************************************

Den giver så følgende fejl:
Warning: mysqli_fetch() expects parameter 1 to be mysqli_stmt, object given in C:\dbtest.php on line 14
Avatar billede razorblade Nybegynder
30. juli 2006 - 13:19 #17
Men er det egentlig ikke bedre at lave det i 2 klasser i stedet ?
Mere sådan at man har db klassen for sig selv så man altid kan gøre brug af den alene.
Men så skal vi vel igang med nedarving.
Avatar billede erikjacobsen Ekspert
30. juli 2006 - 13:21 #18
Så retter du
      while ($row = mysqli_fetch($result)) {
til
      while ($row = mysqli_fetch_array($result), MYSQLI_ASSOC) {
Avatar billede erikjacobsen Ekspert
30. juli 2006 - 13:22 #19
Og flytter en parentes, der sneg sig væk:
      while ($row = mysqli_fetch_array($result, MYSQLI_ASSOC)) {
Avatar billede erikjacobsen Ekspert
30. juli 2006 - 13:22 #20
Nej, det skal holdes i een klasse. Og din $conn variabel skal ikke være public, men private!
Avatar billede nielle Nybegynder
30. juli 2006 - 13:24 #21
30/07-2006 13:11:43> Men det er jo nu engang den måde som mysqli_stmt_fetch() - alias for mysqli_fetch() - virker.

Den kræver at du forbereder en statement via mysqli_prepare() osv. Fejlbeskeden går jo også netop på at den ikke får denne statement, men noget helt andet.

http://dk2.php.net/manual/da/function.mysqli-fetch.php
http://dk2.php.net/manual/da/function.mysqli-stmt-fetch.php
Avatar billede razorblade Nybegynder
30. juli 2006 - 13:24 #22
Rettede den til:
while ($row = mysqli_fetch_array($result, MYSQLI_ASSOC)) {

Og resultatet er nu en helt blank side??
Ingen db felter er tomme, så den burde udskrive noget.

******************************************************
<?PHP

class dbConnect {
    public $conn;

    public function __construct($host, $user, $pass, $db) {
        $this->conn = mysqli_connect($host, $user, $pass, $db);
    }

    public function tester() {
        $result = mysqli_query($this->conn, "SELECT * FROM techno") or die(mysqli_error($this->conn));

        $a=Array();
        while ($row = mysqli_fetch_array($result, MYSQLI_ASSOC)) {
            $a[]= $row['Id_techno'];
        } 
        return $a; 
    }
}

$dbC = new dbConnect("localhost","root","210382","technolog");
$dbC->tester();

?>
Avatar billede erikjacobsen Ekspert
30. juli 2006 - 13:26 #23
skriv noget ud, fx.
print_r($dbC->tester());
Avatar billede razorblade Nybegynder
30. juli 2006 - 13:33 #24
Nielle->Jeg kan se hvor du vil hen. Men vil helst undlade at benytte de funktioner i denne omgang :)

Okay, følgende script:

**********************************''''''
<?PHP

class dbConnect {
    private $conn;

    public function __construct($host, $user, $pass, $db) {
        $this->conn = mysqli_connect($host, $user, $pass, $db);
    }

    public function tester() {
        $result = mysqli_query($this->conn, "SELECT * FROM techno") or die(mysqli_error($this->conn));

        $a=Array();
        while ($row = mysqli_fetch_array($result)) {
            $a = $row['Id_techno'];
        } 
        return $a; 
    }
}

$dbC = new dbConnect("localhost","root","210382","technolog");
echo $dbC->tester();

?>

*****************************''''
Udskriver tallet 14, dette er da også korrekt da der står 14 i db. Men den looper jo ikke igennem db. Der er 8 rows, men udskriver kun 1 selvom den er i en while løkke ??
Avatar billede erikjacobsen Ekspert
30. juli 2006 - 13:34 #25
Men hvorfor har du fjernet []  ??

        $a[] = $row['Id_techno'];
Avatar billede razorblade Nybegynder
30. juli 2006 - 13:35 #26
Fordi hvis den var der, så udskrev den blot en tekst-string "Array"
Avatar billede razorblade Nybegynder
30. juli 2006 - 13:38 #27
erikjacobsen -> Hvordan kan det være du vil holde det i een klasse ?
Ville det at lave det i 2 ikke gøre klasserne mere dynamisk?
Forstået på den måde, at når du skal bruge en forbindelse til din db intialisere du kun db klassen og benytter dig af dette objekt.
Hvor imod hvis også queyen er i samme klasse får du den med selvom du måske ikke lige har brug for den.
Avatar billede erikjacobsen Ekspert
30. juli 2006 - 13:42 #28
Ja, selvfølgelig udskriver den "Array". Det er derfor jeg siger du kan prøve print_r(...).

Hold det i een klasse, til du kan se et behov for at dele det op. Hvis du ikke kan argumentere for behovet, så er det der nok ikke.  Og nej, bare fordi man komme til at have lidt ekstra funktioner med, som man ikke lige bruger, er ikke noget argument.
Avatar billede razorblade Nybegynder
30. juli 2006 - 13:48 #29
Det her:

*************************************

<?PHP

class dbConnect {
    private $conn;

    public function __construct($host, $user, $pass, $db) {
        $this->conn = mysqli_connect($host, $user, $pass, $db);
    }

    public function tester() {
        $result = mysqli_query($this->conn, "SELECT * FROM techno") or die(mysqli_error($this->conn));

        $a=Array();
        while ($row = mysqli_fetch_array($result)) {
            $a[] = $row['Id_techno'];
        } 
        return $a; 
    }
}

$dbC = new dbConnect("localhost","root","210382","technolog");
print_r($dbC->tester());

?>

*************************************

Udskriver følgende:

Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 [5] => 6 [6] => 14 )

Den er jo fin, tingene bliver udskrevet fra vores db.. Men jeg skal jo ikke bruge
"Array, ( ( [0] =>" til noget, kun de tal db indeholder..
Avatar billede razorblade Nybegynder
30. juli 2006 - 13:49 #30
Som i det her tilfælde er 1 2 3 4 5 6 14
Avatar billede razorblade Nybegynder
30. juli 2006 - 14:05 #31
Så spørgsmålet nu er jo hvordan jeg udskriver det sådan at den kun outputter det der står i db'en og ikke også "Array, ( ( [0] =>" osv
Avatar billede erikjacobsen Ekspert
30. juli 2006 - 14:07 #32
Det gør du med en passende løkke, der kan tage tingene fra dit array, fx http://php.net/foreach
Avatar billede razorblade Nybegynder
30. juli 2006 - 14:09 #33
<?PHP

class dbConnect {
    private $conn;

    public function __construct($host, $user, $pass, $db) {
        $this->conn = mysqli_connect($host, $user, $pass, $db);
    }

    public function tester() {
        $result = mysqli_query($this->conn, "SELECT * FROM techno") or die(mysqli_error($this->conn));

        $a=Array();
        while ($row = mysqli_fetch_array($result)) {
            $a[] = $row['Id_techno'];
        } 
        return $a; 
    }
}

$dbC = new dbConnect("localhost","root","210382","technolog");
//print_r($dbC->tester());

$arr = array($dbC->tester());
foreach ($arr as &$value) {
    echo $arr;
}

?>

outputter igen en tekst streng "Array"
Help!! hehe :)
Avatar billede razorblade Nybegynder
30. juli 2006 - 14:26 #34
Aha, jeg fik det løst.

********************************************
<?PHP

class dbConnect {
    private $conn;

    public function __construct($host, $user, $pass, $db) {
        $this->conn = mysqli_connect($host, $user, $pass, $db);
    }

    public function tester() {
        $result = mysqli_query($this->conn, "SELECT * FROM techno") or die(mysqli_error($this->conn));

        $a=Array();
        while ($row = mysqli_fetch_array($result)) {
            $a[] = $row['Id_techno'];
        } 
        return $a; 
    }
}

$dbC = new dbConnect("localhost","root","210382","technolog");
//print_r($dbC->tester());

foreach ($dbC->tester() as $value) {
  echo "$value<br />\n";
}

?>
********************************************

Nu vil jeg så gerne høre, om du kan hjælpe mig med at gøre klassen mere dynamisk?
Sådan at techno og Id_techno også kan sendes til klassen som en parameter.
Og at jeg også kan sende en "WHERE Id_techno==2" med hvis der er behov for en where clause.

Derved opnår vi en fuld ud dynamisk klasse der kan bruges til faktisk alle select queryes.
Avatar billede razorblade Nybegynder
30. juli 2006 - 14:42 #35
Har nu forsøgt mig med følgende script:

**************************************************
<?PHP

class dbConnect {
    private $conn;

    public function __construct($host, $user, $pass, $db) {
        $this->conn = mysqli_connect($host, $user, $pass, $db);
    }

    public function selectQuery($table, $field) {
        $result = mysqli_query($this->conn, "SELECT * FROM $table") or die(mysqli_error($this->conn));

        $a=Array();
        while ($row = mysqli_fetch_array($result)) {
            $a[] = $row["$field"];
        } 
        return $a; 
    }
}

$db = new dbConnect("localhost","root","210382","technolog");
$db->selectQuery("techno","Id_techno");

foreach ($db->selectQuery() as $value) {
  echo "$value<br />";
}

?>
**********************************************

Men får følgende resultat:

Warning: Missing argument 1 for dbConnect::selectQuery(), called in C:\dbtest.php on line 24 and defined in C:\dbtest.php on line 10
dbtest.php on line 10

Notice: Undefined variable: table in C:\dbtest.php on line 11

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1
Avatar billede razorblade Nybegynder
30. juli 2006 - 14:48 #36
Jeg lukker her, for at rydde lidt op - da det jo ikke er det oprindelige problem det handler om mere..

Opretter et nyt spørgsmål.

Smid et svar nielle og erikjacobsen
Avatar billede razorblade Nybegynder
30. juli 2006 - 14:58 #37
link til nyt spørgsmål: http://www.eksperten.dk/spm/723150
Avatar billede nielle Nybegynder
30. juli 2006 - 15:32 #38
Jeg springer over på point i denne her - erikjacobsen trak jo det meste :^)
Avatar billede razorblade Nybegynder
30. juli 2006 - 15:36 #39
Ok nielle..

Så mangler vi jo kun dig erikjacobsen
Avatar billede erikjacobsen Ekspert
30. juli 2006 - 15:37 #40
Jeg samler slet ikke på point, tak.
Avatar billede razorblade Nybegynder
30. juli 2006 - 15:42 #41
Okay, jamen så synes jeg nielle skal have dem.
Du var jo også med fra starten.

Vil ikke selv tage dem :)
Avatar billede razorblade Nybegynder
30. juli 2006 - 15:47 #42
Ingen vil have points, så æder jeg dem selv.
Avatar billede nielle Nybegynder
31. juli 2006 - 19:19 #43
God appetit ;^)
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



IT-JOB

Cognizant Technology Solutions Denmark ApS

Test Architect - Projects

MAN Energy Solutions

Department Manager Edge Platform

Nitor Energy A/S

IT Infrastructure Specialist