Avatar billede matz Nybegynder
07. august 2007 - 14:03 Der er 37 kommentarer og
2 løsninger

Hente data fra mysql i oop

Er der nogen her som kan komme med et eksempel på hvordan man kan hente data ud fra mysql i oop?

Det skal bare være et meget simpelt eksempel.
Avatar billede mysli Nybegynder
07. august 2007 - 15:15 #1
Lav et database objekt og brug det, ganske simpelt.

Database
- connect funktion
- error handling
- query funktion
- get rows funktion

Det består min af
Avatar billede mcardle Nybegynder
07. august 2007 - 16:04 #2
<?php

class sql
{
    var $_conn;
    var $_queries = array();
    var $_activeQuery;
   
        function connect(){
      $dbhost = "localhost";
      $database = "db";
      $dbuser = "user";
      $dbpass = "pass";
     
      $this->_conn = mysql_connect($dbhost, $dbuser, $dbpass);
      mysql_select_db($database, $this->_conn);
    }
   
    function q($sql_query){
        $query = mysql_query($sql_query, $this->_conn) or die(mysql_error());
      if($query !== false){
          array_unshift($this->_queries, $query);
        $this->_activeQuery = $query;
        return true;
      }
      return false;
    }
   
    function a($q){
        $array = null;
      if($this->_activeQuery){
          $array = mysql_fetch_array($this->_activeQuery, $this->_conn);
      }
      return $array;
    }
   
    function free(){
        if($this->_activeQuery){
          @mysql_free_result( $this->_activeQuery );
        $this->_activeQuery = array_shift( $this->_queries );
      }
    }
   
    function num_rows(){
        return mysql_num_rows($this->_activeQuery);
    }
   
    function close(){
      @mysql_close($this->_conn);
    }
}

?>
Avatar billede arne_v Ekspert
07. august 2007 - 16:14 #3
mysqli kommer jo OOP out-of-the-box.
Avatar billede sw_red_6 Nybegynder
07. august 2007 - 16:17 #4
arne_v>> det har du som sådan ret i, men den er designet til mysql v4.1.3 eller nyere så det er ikke sikkert den kan bruges..
Avatar billede matz Nybegynder
07. august 2007 - 16:36 #5
Hmm kan man ikke lave et udtræk mere simpelt? Eller er dette den korrekte måde at lave det på?
Avatar billede mcardle Nybegynder
07. august 2007 - 16:46 #6
Den her måde fik jeg anbefalet af de kloge herinde.

//mcardle
Avatar billede matz Nybegynder
07. august 2007 - 17:10 #7
Jeg fandt lige den her, den ser lidt mere overskueligt ud:

<?php
// OOP Example

// Include MySQL class
require_once 'Database/MySQL.php';

// Instantiate MySQL class, connect to MySQL and select database
$db = new MySQL('localhost', 'harryf', 'secret', 'sitepoint');

// Perform a query selecting five articles
$sql = 'SELECT * FROM articles LIMIT 0,5';
$result = $db->query($sql); // Creates a MySQLResult object

// Display the results
while ($row = $result->fetch()) {
// Display results here
}
?>
Avatar billede sw_red_6 Nybegynder
08. august 2007 - 08:38 #8
Du mangler stadig klassen i det eksempel..

Det du har der er ikke andet end et eksempel på hvordan man bruger en klasse som ligger i MySQL.php filen som bliver kaldt med require_once
Den fil indeholder sandsynligvis kode der kan minde om det mcardle foreslog 07/08-2007 16:04:57
Avatar billede matz Nybegynder
08. august 2007 - 17:03 #9
Okay, vil i komme med et eksempel på at udskrive data fra den kode mcardle skrev.
Avatar billede matz Nybegynder
08. august 2007 - 17:43 #10
Den her virker heller ikke, ved ik om jeg gør noget forkert gang på gang. Måske i kan se en fejl:

Klassen:

<?php

class MySQL {
    private $db;
    private $sql;

    public function __construct($sql) {
        $this->sql = $sql;
        $this->db = mysql_connect("localhost", "root", "");
        mysql_select_db("oop");
    }

    public function connect {
        $result = mysql_query($this->sql);
        while ($row = mysql_fetch_array($result)) {
         
    }
}

?>

Udskriv kode:

<?php
require_once("connect1.php");
$cb1 = new MySQL("select id, fornavn from navn");
$cb2 = new MySQL("select id, efternavn from navn");
?>

<html>
<head>
<title>Testing</title>
</head>
<body>
<p>Lad os se om det virker</p>
<?= $cb1 ?><br />
<?= $cb2 ?><br />
</body>
</html>



Fejl den melder:

Parse error: syntax error, unexpected '{', expecting '(' in C:\wamp\www\oop\connect1.php on line 13
Avatar billede mcardle Nybegynder
08. august 2007 - 22:23 #11
Du mangler () efter connect.

Den skal hedde:
public function connect(){
    $result = mysql_query($this->sql);
        while ($row = mysql_fetch_array($result)){

        }       
    }
Avatar billede matz Nybegynder
09. august 2007 - 00:42 #12
Nåh ja det er os rigtig.

Nu siger den:

Parse error: syntax error, unexpected ';', expecting T_FUNCTION in C:\wamp\www\oop\connect1.php on line 20

Og på linje 20 er der intet skrevet?
Avatar billede thesurfer Nybegynder
09. august 2007 - 01:19 #13
matz> Det er fordi fejlen ligger før linie 20..

Hvis man nu havde lavet indrykninger der passe, kunne man se at mangler et "}" til while.. :-)

Sådan skal det så ud:

<?php

class MySQL
{
    private $db;
    private $sql;

    public function __construct($sql)
    {
        $this->sql = $sql;
        $this->db = mysql_connect("localhost", "root", "");
        mysql_select_db("oop");
    }

    public function connect()
    {
        $result = mysql_query($this->sql);
        while ($row = mysql_fetch_array($result))
        {
        }

    }
}

?>
Avatar billede thesurfer Nybegynder
09. august 2007 - 01:21 #14
PS:

At startet en blok med "{" på samme linie med en IF-sætning, eller en funktion, er både dumt og grimt.

Tegnene "{" og "}" skal altid være på egen linie, ellers bliver koden uoverskuelig.

Eksempel:

Forkert:

    public function connect {

Korrekt:

    public function connect
    {
Avatar billede thesurfer Nybegynder
09. august 2007 - 01:22 #15
Og så skal man huske () ved funktionen.. :-)

Eksempel:

Forkert:

    public function connect() {

Korrekt:

    public function connect()
    {
Avatar billede thesurfer Nybegynder
09. august 2007 - 01:24 #16
Meningen er at man skal kunne tegne en lodret streng, og så skal de passe sammen.. åben og luk..

Eksempel:

A
  B
      C

      C

      D

      D

  B
A

Meget bedre oversigt, og man er ikke i tvivl om hvilke der hører sammen..
Avatar billede matz Nybegynder
09. august 2007 - 01:28 #17
Mange tak! Det ser ud til at fungere.

Kan du sige hvad fejlen var, får jeg kan ikke få øje på den.
Avatar billede matz Nybegynder
09. august 2007 - 01:31 #18
Og hvis jeg vil trække ud via Mysql...Hvordan gør jeg det så? Skal bare være helt sikker på jeg forstår hvert trin :) Lige nu udskriver den "Lad os se om det virker". altså laver den intet udtræk fra databasen.

Koden:

<?php
require_once("connect1.php");
$cb1 = new MySQL("select id, fornavn from navn");
$cb2 = new MySQL("select id, efternavn from navn");
?>

<html>
<head>
<title>Testing</title>
</head>
<body>
<p>Lad os se om det virker</p>
<?= $cb1 ?><br />
<?= $cb2 ?><br />
</body>
</html>
Avatar billede mysli Nybegynder
09. august 2007 - 08:44 #19
Lidt OT:
thesurfer, det er da lige i overkanten at kalde det forkert og korrekt. Det er uden diskution en smagssag om det skal være i linje med eller under, hvad syntax angår er begge ting korrekte.
Avatar billede sw_red_6 Nybegynder
09. august 2007 - 09:24 #20
Du kan ikke se hvad den finder i DB fordi du ikke returnerer eller udskriver det nogen steder..
Det skal du til først lave i den while-løkke der var problemet før..
Hvis du vil have en helt enkelt udgave kunne du sætte en echo "<pre>"; print_r($row); echo "</pre>"; ind i den while, det skulle skrive indholdet af det du finder i DB
Avatar billede sw_red_6 Nybegynder
09. august 2007 - 10:14 #21
forøvrigt nu når jeg får kigget ordentligt på din kode så skal du lige kalde funktionen connect også ellers sker der jo ingenting..

Desuden ville jeg nok bruge det mcardle foreslog 07/08-2007 16:04:57
Hvis du er interesseret i et eksempel så kunne du prøve det her:
<?php

class sql
{
    var $_conn;
    var $_queries = array();
    var $_activeQuery;
  /* husk at indsætte de rigtige oplysniner til din database */
    function connect(){
      $dbhost = "localhost";
      $database = "db";
      $dbuser = "user";
      $dbpass = "pass";
   
      $this->_conn = mysql_connect($dbhost, $dbuser, $dbpass);
      mysql_select_db($database, $this->_conn);
    }
 
    function q($sql_query){
        $query = mysql_query($sql_query, $this->_conn) or die(mysql_error());
      if($query !== false){
          array_unshift($this->_queries, $query);
        $this->_activeQuery = $query;
        return true;
      }
      return false;
    }
  /* Fjernede $q fordi jeg ikke lige kunne regne ud hvorfor den var der */
    function a(){
        $array = null;
      if($this->_activeQuery){
          $array = mysql_fetch_array($this->_activeQuery, $this->_conn);
      }
      return $array;
    }
 
    function free(){
        if($this->_activeQuery){
          @mysql_free_result( $this->_activeQuery );
        $this->_activeQuery = array_shift( $this->_queries );
      }
    }
 
    function num_rows(){
        return mysql_num_rows($this->_activeQuery);
    }
 
    function close(){
      @mysql_close($this->_conn);
    }
}

$test = new sql();
$test->connect();
$test->q("SELECT id, fornavn FROM navn");
echo "<pre>";
print_r($test->a());
echo "</pre>";
echo "antal rækker: $test->num_rows()";
$test->free();
$test->close();
?>

De sidste 9 linjer kalder de forskellige funktioner i klassen..
Husk at læse de kommentarer der er..
Avatar billede matz Nybegynder
09. august 2007 - 11:27 #22
Jeg har nu brugt det eksempel, men den udskriver kun "Antal rækker: ()" og udskriver intet fra databasen.
Avatar billede matz Nybegynder
09. august 2007 - 12:41 #23
Jeg har ændret:

echo "antal rækker: $test->num_rows()";

Til

echo "antal rækker: ".$test->num_rows();

Nu skriver den "Antal rækker: 0" - så der udskriver den vel noget. Men nu skal jeg hente tekst også bruger man vel ikke num_rows() ?
Avatar billede matz Nybegynder
09. august 2007 - 12:48 #24
Sorry mig der havde glemt at putte data i mysql, nu skriver den:

Array
(
    [0] => 1
    [1] => Mats
)

antal rækker: 2
Avatar billede matz Nybegynder
09. august 2007 - 12:50 #25
Men hvordan får jeg den til at hente tekst ud normalt, ligesom hvis det var:

$row['fornavn'];
Avatar billede sw_red_6 Nybegynder
09. august 2007 - 13:33 #26
så ændrer du bare:
echo "<pre>";
print_r($test->a());
echo "</pre>";

til f.eks.
$array = $test->a();
echo "Fornavn: ".$array[1];

Så skulle den udskrive:
Fornavn: Mats
antal rækker: 2
Avatar billede olebole Juniormester
09. august 2007 - 14:01 #27
<ole>

Nu har mysli godtnok været fremme med samme sag, men det skal da ikke afholde mig:

thesurfer >> Din kommentar (09/08-2007 01:21:25) og den efterfølgende er ret papnakket! De rangerer på på højde med "det er dumt og forkert at have brun hud" eller "det er dumt og forkert at have engelsk som modersmål".

Der er to 'stilarter' indenfor bracketing. Nogle kodere foretrækker version A, mens andre slet ikke kan få overblik med version A og derfor sværger til version B. Den 'kamp' har raset i årevis og der er absolut intet belæg for at sige, den ene er bedre end den anden - eller at den ene er mere rigtig end den anden. At du foretrækker den ene, gør absolut ikke alle dine medmennesker, der vælger den anden, til idioter!

Når jeg møder en kode med 'din' bracketing, er jeg tæt ved kemisk renset for overblik. Jeg foretrækker helt klart min start-bracket på samme linje som if-betingelsen - eller funktionsnavnet. Det gør jeg ikke fordi, din bracketing er forkert ... det gør jeg fordi, jeg har vænnet mig til den 'min' opstilling.

Her er ikke tale om en valid og en invalid - men om to absolut ligeværdige fremgangsmåder. 'Din' fremgangsmåde giver mening og logik for dig - jeg og mange andre har det lige omvendt.
Derfor surfer du langt forbi tredie revle, når du fremstiller os andre som værende dumme og forkert på den, når vi ikke gør sådan, som du tilfældigvis bedst kan lide. Det ligner da ellers ikke dig  ;o)

/mvh
</bole>
Avatar billede thesurfer Nybegynder
09. august 2007 - 20:07 #28
mysli, olebole og andre der føler sig stødt>

Jeg beklager hvis I fik den ide, at jeg kaldte jer "dumme", "idiot" eller ligende (som olebole skrev), når jeg skrev "forkert" og "rigtigt".

For at få det hele i perpektiv:
"forkert" og "rigtigt" blev brugt for at vise hvad meningen var med mit indlæg 09/08-2007 01:19:52.

Min logik siger mig:
Hvis noget er stillet "op under" hinanden, kan man nemt se at de passer sammen, hvis man så også laver indrykninger.

Det hjælper nok ikke meget, hvis man stiller brackets under hinanden, hele vejen ned, uden indrykninger..

Jeg vil prøve på at vise min påstand, med et fuldstændigt overdrevet eksempel (overdrivelse plejer at fremme forståelsen), så man (forhåbentligt) ikke kan undgå at se pointen..

Eksempel på "forkert" brug af "under hinanden"-metoden:


function navn()
{

if (betingelse)
{

for(i = ....)
{

while (...)
{
yay
}

et-eller-andet
{
noget-mere

osvosv
{

    en masse kode osvosv

}

}

}

}


Her vil det være svært at se, at der faktisk mangler en slut-bracket til "osvosv".

Her er samme eksempel, med brackets på samme linie:


function navn() {

    if (betingelse) {

        for(i = ....) {

            while (...) {
                yay
            }

            et-eller-andet {
                noget-mere

                osvosv
                {

                    en masse kode osvosv

            }

        }

    }

}

Her er det nemmere at se, at der mangler en afsluttende bracket, end første eksempel


Samme eksempel med det jeg kalder en "logisk" struktur:

function navn()
{

    if (betingelse)
    {

        for(i = ....)
        {

            while (...)
            {
                yay
            }

            et-eller-andet
            {
                noget-mere

                osvosv
                {

                    en masse kode osvosv

            }

        }

    }

}

I det sidste eksempel, mener jeg, at man skal gøre sig umage, for ikke at kunne se hvor der mangler slut-bracket.

Jeg bruger "ny-linie-bracket" (kan vi kalde metoden) fordi det er sat logisk op, og ikke fordi jeg er vant til det.. :-)

Men jeg kan godt se, at der kan komme en lang diskution ud af det.. :-)

Man er velkommen til at kontakte mig via intern epost, på http://www.ebruger.dk (gratis at oprette profil), så man ikke spammer spørgsmålet..

PS: Man kan selvfølgeligt også tæller antallet af "{" og "}".. hvis det giver et uligt tal, er der noget galt.. :-)
Avatar billede olebole Juniormester
09. august 2007 - 22:20 #29
Jeg kender dig, så jeg havde da også svært ved at foretsille mig, du virkelig mente det sådan  ;o)

For mig er det logisk, at selve udtrykket danner begyndelsen på blokken. Dét er for mig logisk sat op - og det giver rigtig god overskuelighed. Sådan har jeg det slet ikke med den sidste ... logik er ikke bare en absolut størrelse  ;o)
Avatar billede matz Nybegynder
10. august 2007 - 01:45 #30
Mange tak, så har jeg lidt og lege videre med :)

Hvem vil have points?
Avatar billede matz Nybegynder
10. august 2007 - 01:48 #31
Jeg har lige et sidste spørgsmål. Kan man gemme det her i en fil, og include den i en anden fil hvor det stadig fungere med at hente data ud?

Eksempel:

connect.php

class sql
{
    var $_conn;
    var $_queries = array();
    var $_activeQuery;
  /* husk at indsætte de rigtige oplysniner til din database */
    function connect(){
      $dbhost = "localhost";
      $database = "oop";
      $dbuser = "root";
      $dbpass = "";
   
      $this->_conn = mysql_connect($dbhost, $dbuser, $dbpass);
      mysql_select_db($database, $this->_conn);
    }
 
    function q($sql_query){
        $query = mysql_query($sql_query, $this->_conn) or die(mysql_error());
      if($query !== false){
          array_unshift($this->_queries, $query);
        $this->_activeQuery = $query;
        return true;
      }
      return false;
    }
  /* Fjernede $q fordi jeg ikke lige kunne regne ud hvorfor den var der */
    function a(){
        $array = null;
      if($this->_activeQuery){
          $array = mysql_fetch_array($this->_activeQuery, $this->_conn);
      }
      return $array;
    }
 
    function free(){
        if($this->_activeQuery){
          @mysql_free_result( $this->_activeQuery );
        $this->_activeQuery = array_shift( $this->_queries );
      }
    }
 
    function num_rows(){
        return mysql_num_rows($this->_activeQuery);
    }
 
    function close(){
      @mysql_close($this->_conn);
    }
}

test.php

include_once 'connect.php';
$test = new sql();
$test->connect();
$test->q("SELECT id, fornavn FROM navn");
$array = $test->a();
echo "Fornavn: ".$array[1];
echo "antal rækker: ".$test->num_rows();
$test->free();
$test->close();
Avatar billede arne_v Ekspert
10. august 2007 - 01:55 #32
For dem som måtte være interesseret så hedder:

if(...) {
  ...
}

"K&R style" og:

if(...)
{
  ...
}

"Allman style".

Det er stort set ligegyldigt hvilken stil man bruger sålænge det er konskvent - kun 1 stil per projekt tak ! Projektet bør have en guide der fortæller hvilken stil der skal benyttes.
Avatar billede olebole Juniormester
10. august 2007 - 02:10 #33
Arne >> Er der noget om, at Allman stilen er den mest udbredte blandt C(++) og Java programmører - eller er det bare en misforståelse?
Avatar billede arne_v Ekspert
10. august 2007 - 02:27 #34
K&R style:
  C - Unix
  C - Linux
  Java

Allman style:
  C/C++ - Windows
  C#

GNU style = lettere modificeret Allman style:
  C - GNU

[tildels baseret på wikipedia]
Avatar billede sw_red_6 Nybegynder
10. august 2007 - 09:04 #35
Eftersom de andre ikke har svaret på det så vil jeg lige indskyde at der skulle ikke være noget galt i at dele det op som du har gjort 10/08-2007 01:48:33

mht point må du selv kigge på kommentarerne og udbede svar fra dem du mener skal have point
Avatar billede matz Nybegynder
10. august 2007 - 12:42 #36
mcardle og sw_red_6 skal have points. Lig et svar.
Avatar billede mcardle Nybegynder
10. august 2007 - 12:57 #37
Tak, tak.. ;o)
Avatar billede sw_red_6 Nybegynder
10. august 2007 - 13:14 #38
OK
Avatar billede matz Nybegynder
10. august 2007 - 13:29 #39
og tak for hjælpen!
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