Avatar billede delphiuser Mester
22. juni 2016 - 11:06 Der er 12 kommentarer og
1 løsning

Kan ikke finde min fejl

Hej igen eksperter.

Jeg har lavet et kald til en function i en classe som virker men alligevel kommer der en fejl i den. Den laver fejlen med tilføjer alligevel min data til min tabel.

Jeg får denne fejl besked:
Fatal error: Cannot redeclare class Admin in C:\wamp64\www\contacts\controllers\admin.php on line 18

<?php

class Admin extends DB {

    public function __construct() {
        parent::__construct();
    }

    public function adminUser($uid) {
        echo '<div class="adminheader">';
        $this->adminHeader($uid);
        echo '</div>';
    }
   
    public function addContact($firstname, $middlename, $lastname, $birthday, $phone, $email, $relation) {
        $this->insertContact($firstname, $middlename, $lastname, $birthday, $phone, $email, $relation);
    }
}
kan ikke rigtig finde ud af hvad fejlen er. for som sagt så skriver den fint mine dataer ind i databasen.
Avatar billede jakobdo Ekspert
22. juni 2016 - 11:15 #1
Hvad sker der på linje 18 i filen:

C:\wamp64\www\contacts\controllers\admin.php ?
Avatar billede delphiuser Mester
22. juni 2016 - 11:19 #2
linie 18 i filen er  denne } så der sker ikke noget i filen der. Det er det jeg ikke kan forstå.
Avatar billede jakobdo Ekspert
22. juni 2016 - 11:37 #3
Du må have noget mere kode. Da det du viser her alene ikke bør melde den fejl du har.
Avatar billede delphiuser Mester
22. juni 2016 - 11:44 #4
Min form side ser sådan her ud. i php koden.
<?php
    if(isset($_POST['add'])) {
        $firstname = $_POST['firstname'];
        $middlename = $_POST['middlename'];
        $lastname = $_POST['lastname'];
        $birthday = $_POST['birthday'];
        $phone = $_POST['phone'];
        $email = $_POST['email'];
        $relation = $_POST['relation'];
        require 'controllers/admin.php';
        $con = new Admin();
        $con->addContact($firstname, $middlename, $lastname, $birthday, $phone, $email, $relation);
    }
    ?>

derfra kalder jeg så functionen addContact(). Hvilket er denne smule kode som kommer neden under.

public function addContact($firstname, $middlename, $lastname, $birthday, $phone, $email, $relation) {
        $this->insertContact($firstname, $middlename, $lastname, $birthday, $phone, $email, $relation);
    }

i den kode kalder jeg så denne function insertContact() i min DB classe..

public function insertContact($firstname, $middlename, $lastname, $birthday, $phone, $email, $relation) {
        $sql = "insert into contacts(firstname, middlename, lastname, birthday, phone, email, relation) values('$firstname', '$middlename', '$lastname', '$birthday', '$phone', '$email', '$relation')";
        mysqli_query($this->conn, $sql) or die(mysqli_error($this->conn));
    }

kan du få noget mere ud af dette?
Avatar billede jakobdo Ekspert
22. juni 2016 - 11:52 #5
Jeg tror du bliver nød til at vise "alt" kode.
Prøv at smid alt koden herind.
Og med alt, mener jeg alt.
Fra top til bund.
Du har sikkert nogle includes etc..
Fjern evt. kodeord / logins, hvis du har sådanne.
Avatar billede olsensweb.dk Ekspert
22. juni 2016 - 13:36 #6
>Fatal error: Cannot redeclare class Admin in
prøv at checke om du ikke indlæsser functionen flere gange. / lavet den flere gange

brug altid _once når du indlæsser filen med functioner

http://php.net/manual/en/function.include.php
http://php.net/manual/en/function.require.php

disse skal du anvende
http://php.net/manual/en/function.include-once.php
http://php.net/manual/en/function.require-once.php

hvis det er vigtigt filen bliver indlæst, så brug require-once
Avatar billede delphiuser Mester
22. juni 2016 - 14:48 #7
ok jeg smider alt kode ind her. jeg skriver filnavnet over over koden så du kan følge med. kommer ikke liger med yderligere forklaringer. med mindre i beder mig om det.

db.class.php
<?php

class DB {

    protected $dbhost = 'localhost';
    protected $dbuser = 'test';
    protected $dbpass = 'xxxx';
    protected $dbname = 'test';
    protected $conn = '';

    public function __construct() {
        $conn = mysqli_connect($this->dbhost, $this->dbuser, $this->dbpass, $this->dbname);
        if(mysqli_connect_errno()) {
            die('Connection failed : <i>' . mysqli_connect_error($this->conn) . '</i>');
            exit;
        }
        $this->conn = $conn;
    }

    public function search($q) {
        $search = $q;
        $stmt = $this->conn->prepare("select firstname, middlename, lastname, phone, email from contacts where firstname = ?");
        if($stmt) {
            mysqli_stmt_bind_param($stmt, 's', $search);
            mysqli_stmt_execute($stmt);
            mysqli_stmt_bind_result($stmt, $firstname, $middlename, $lastname, $phone, $email);
            while(mysqli_stmt_fetch($stmt)) {
                $fullname = $firstname.' '.$middlename.' '.$lastname;
                echo '
                <span>'.$fullname.'</span>
                <span>'.$phone.'</span>
                <span>'.$email.'</span>
                ';
            }
            mysqli_stmt_close($stmt);
        }
    }

    public function adminHeader($uid) {
        $stmt = $this->conn->prepare("select user_id, fullname, access_level from admin where user_id = ?");
        if($stmt) {
            mysqli_stmt_bind_param($stmt, "i", $uid);
            mysqli_stmt_execute($stmt);
            mysqli_stmt_bind_result($stmt, $user_id, $fullname, $access_level);
            while(mysqli_stmt_fetch($stmt)) {
                echo '
                <label>Navn : </label>
                <span>'.$fullname.'</span>
                <label>Adgang : </label>
                <span>'.$access_level.'</span>
                <label>ID Nummer : </label>
                <span>'.$user_id.'</span>
                ';
            }
            mysqli_stmt_close($stmt);
        }
    }

    public function insertContact($firstname, $middlename, $lastname, $birthday, $phone, $email, $relation) {
        $sql = "insert into contacts(firstname, middlename, lastname, birthday, phone, email, relation) values('$firstname', '$middlename', '$lastname', '$birthday', '$phone', '$email', '$relation')";
        mysqli_query($this->conn, $sql) or die(mysqli_error($this->conn));
    }

    public function showAll() {
        $stmt = $this->conn->prepare("select firstname, middlename, lastname, phone, email, relation from contacts");
        if($stmt) {
            mysqli_stmt_execute($stmt);
            mysqli_stmt_bind_result($stmt, $firstname, $middlename, $lastname, $phone, $email, $relation);
            while(mysqli_stmt_fetch($stmt)) {
                $fullname = $firstname.' '.$middlename.' '.$lastname;
                echo '
                <span>'.$fullname.'</span>
                <span>'.$phone.'</span>
                <span>'.$email.'</span>
                <span>'.$relation.'</span>
                ';
            }
            mysqli_stmt_close($stmt);
        }
    }

admin.php
<?php

class Admin extends DB {

    public function __construct() {
        parent::__construct();
    }

    public function adminUser($uid) {
        echo '<div class="adminheader">';
        $this->adminHeader($uid);
        echo '</div>';
    }
   
    public function addContact($firstname, $middlename, $lastname, $birthday, $phone, $email, $relation) {
        $this->insertContact($firstname, $middlename, $lastname, $birthday, $phone, $email, $relation);
    }
}

add_contact.php

<div class="forms">
    <form action="" method="post">
        <label>Fornavn</label><input type="text" name="firstname" placeholder="Fornavn">
        <label>Mellemnavn</label><input type="text" name="middlename" placeholder="Mellemnavn">
        <label>Efternavn</label><input type="text" name="lastname" placeholder="Efternavn">
        <label>F&oslash;dselsdag</label><input type="date" name="birthday" placeholder="YYYY-MM-DD">
        <label>Telefon</label><input type="text" name="phone" placeholder="Telefon nummer">
        <label>Email</label><input type="text" name="email" placeholder="Email">
        <label>Relation</label><select name="relation">
            <option>V&aelig;lg Relation</option>
            <option value="family">Familie</option>
            <option value="owner">Ejer</option>
            <option value="friends">Venner</option>
            <option value="worker">Kollega</option>
            <option value="other">Andet</option>
        </select>
        <input type="submit" name="add" value="Opret Kontakt" id="btn">
        <input type="reset" value="Ryd Felter" id="btn">
    </form>
    <?php
    if(isset($_POST['add'])) {
        $firstname = $_POST['firstname'];
        $middlename = $_POST['middlename'];
        $lastname = $_POST['lastname'];
        $birthday = $_POST['birthday'];
        $phone = $_POST['phone'];
        $email = $_POST['email'];
        $relation = $_POST['relation'];
        require_once 'controllers/admin.php';
        $con = new Admin();
        $con->addContact($firstname, $middlename, $lastname, $birthday, $phone, $email, $relation);
    }
    ?>
</div>

bootstrap.php
<?php

class Bootstrap {

    public function bootstrap() {
        $url = 'page';
        if(!isset($_GET[$url])) {
            if(isset($_SESSION['logged']) == true) {
                $this->view('admin/index');
            } else {
                $this->view('home/index');
            }

        } else {
            switch($_GET[$url]) {
                case "search":
                    $this->view('home/search');
                    break;
                case "admin":
                    $this->view('home/admin');
                    break;
                case "add_contact":
                    $this->view('admin/add_contact');
                    break;
                case "contacts":
                    $this->view('admin/contacts');
                    break;
                case "show_all_contacts":
                    $this->view('home/contacts');
                    break;
            }
        }
    }

    public function view($name) {
        $file = 'views/'.$name.'.php';
        if(file_exists($file)) {
            require 'views/header.php';
            require $file;
            require 'views/footer.php';
        } else {
            $this->error();
        }
    }

    public function error() {
        require 'views/header.php';
        require 'views/error/404.php';
        require 'views/footer.php';
        return false;
    }
}

og her til sidst min index.php
<?php
session_start();

require 'config/paths.php';
require 'config/db.class.php';
require 'libs/bootstrap.php';

$app = new Bootstrap();
if(isset($_SESSION['sesid']) && $_SESSION['sesid'] == true) {
    $app->bootstrap();
} else {
    $app->bootstrap();
}

det er alt koden på de filer som bliver brugt.
håber du kan få noget brugbart ud af det...
Avatar billede jakobdo Ekspert
22. juni 2016 - 15:12 #8
Det ser jo "ok" ud.
Hvad har du af kode i view/admin.php ?
Kan det tænkes der er noget admin i den kode ?
Avatar billede olsensweb.dk Ekspert
22. juni 2016 - 19:35 #9
til din DB class, hvad laver alle de metoder der ??, mange af dem hører til i sub classerne

jeg ville ikke bruge arv, da man kun kan arve fra 1 class :( , multibel arv er ikke med i PHP, så jeg vil hellere lave en instance af den klasse jeg ville arve fra, inde i min klasse

jeg ville ikke ligge generisk CRUD ind i DB men have en seperat class til dem.

jeg plejer at samle alle mine classer der har med databasen at gøre i en fil, en model.php, da det er en model af min database

fra admin.php
hvorfor ligger adminHeader i DB classen og ikke i denne class, hvor den naturligt hører til ??

public function adminUser($uid) {
    echo '<div class="adminheader">';
    $this->adminHeader($uid);
    echo '</div>';
}

skulle adminUser og adminHeader ikke være slået sammen i en metode ??
Avatar billede delphiuser Mester
23. juni 2016 - 19:54 #10
Jo det har du nok ret i. Men som sagt jeg er ganske ny i programmering med classer og sådan. Så jeg prøver mig frem med en masse måder og på et eller andet tidspunkt rammer jeg nok noget som bliver ganske fornuftigt. Men igen jo du har helt sikkert ret i det du skriver. Du kender meget mere til det end jeg gør.
Avatar billede delphiuser Mester
23. juni 2016 - 19:57 #11
jakobdo -> hvis du tænker på den admin.php der ligger i view('home/admin');

så er det bare min login form. den har ikke andet end min form.

den ser sådan her ud.
<div class="adminlogin">
    <form action="controllers/login.php" method="post">
        <p>Administrations Login</p>
        <label>Brugernavn</label><input type="text" name="user" placeholder="Burgernavn">
        <label>Adgangskode</label><input type="password" name="pass" placeholder="Adgangskode">
        <input type="submit" name="logon" value="Log p&aring;" id="btn">
    </form>
</div>
Avatar billede olsensweb.dk Ekspert
23. juni 2016 - 21:47 #12
ved at samle dine sql classer i en model component får du et bedre overblik, og kan lettere se hvad du kan genbruge andre steder.
ved at referarer til denne fil og bruge require_once, får du heller ikke fejlen med method er allerede defineret, med mindre du laver sammen methode flere gange i sammen class.
den code du har vist i #7 er her vist som jeg skrev i #9



jeg har ikke ændret på arven, men jeg ville nok lave en instance i hver class frem for at arven DB, som vist i myclass


blot til inspiration
(utested)
model.php

<?php
// db.class.php omdøbt til model.php, da det er en model af databasen
// admin.php er slettet, indhold flyttet over i denne fil

class DB {
    // private kan ikke nedarves, kan ikke nåes udefra
    // protected kan nedarves 1 led, men ikke nåes udefra
    // public kan nedarves mange led, og nåes udefra
   
    protected $dbhost = 'localhost';
    protected $dbuser = 'test';
    protected $dbpass = 'xxxx';
    protected $dbname = 'test';
    protected $conn = '';

    public function __construct() {
        $conn = mysqli_connect($this->dbhost, $this->dbuser, $this->dbpass, $this->dbname);
        if (mysqli_connect_errno()) {
            die('Connection failed : <i>' . mysqli_connect_error($this->conn) . '</i>');
            exit;
        }
        $this->conn = $conn;
    }
   
    public function connection(){
        return $this->conn;
    }
}


class Admin extends DB {

    public function __construct() {
        parent::__construct();
    }

    // flyttet fra DB classen
    /*
    public function adminHeader($uid) {
        $stmt = $this->conn->prepare("select user_id, fullname, access_level from admin where user_id = ?");
        if ($stmt) {
            mysqli_stmt_bind_param($stmt, "i", $uid);
            mysqli_stmt_execute($stmt);
            mysqli_stmt_bind_result($stmt, $user_id, $fullname, $access_level);
            while (mysqli_stmt_fetch($stmt)) {
                echo '
                <label>Navn : </label>
                <span>' . $fullname . '</span>
                <label>Adgang : </label>
                <span>' . $access_level . '</span>
                <label>ID Nummer : </label>
                <span>' . $user_id . '</span>
                ';
            }
            mysqli_stmt_close($stmt);
        }
    }
    */
   
    public function adminUser($uid) {
        echo '<div class="adminheader">';
       
        $stmt = $this->conn->prepare("select user_id, fullname, access_level from admin where user_id = ?");
        if ($stmt) {
            mysqli_stmt_bind_param($stmt, "i", $uid);
            mysqli_stmt_execute($stmt);
            mysqli_stmt_bind_result($stmt, $user_id, $fullname, $access_level);
            while (mysqli_stmt_fetch($stmt)) {
                echo '
                <label>Navn : </label>
                <span>' . $fullname . '</span>
                <label>Adgang : </label>
                <span>' . $access_level . '</span>
                <label>ID Nummer : </label>
                <span>' . $user_id . '</span>
                ';
            }
            mysqli_stmt_close($stmt);
        }
       
        // $this->adminHeader($uid);
        echo '</div>';
    }
   
    // flyttet fra DB classen
    /*
    public function insertContact($firstname, $middlename, $lastname, $birthday, $phone, $email, $relation) {
      $sql = "insert into contacts(firstname, middlename, lastname, birthday, phone, email, relation) values('$firstname', '$middlename', '$lastname', '$birthday', '$phone', '$email', '$relation')";
      mysqli_query($this->conn, $sql) or die(mysqli_error($this->conn)); 
    }
    */

    // flyttet fra admin.php
    // jeg ville flytte denne metode ned i "class Contacts"
    public function addContact($firstname, $middlename, $lastname, $birthday, $phone, $email, $relation) {
        $sql = "insert into contacts(firstname, middlename, lastname, birthday, phone, email, relation) values('$firstname', '$middlename', '$lastname', '$birthday', '$phone', '$email', '$relation')";
        mysqli_query($this->conn, $sql) or die(mysqli_error($this->conn));
       
       
        // $this->insertContact($firstname, $middlename, $lastname, $birthday, $phone, $email, $relation);
    }

}

// fra http://www.computerworld.dk/eksperten/spm/1011351
class Contacts extends DB {

    // hvorfor denne ekstra function ??, kald search direkte, eller lig search ind i dene function
    public function find_contact($seek) {
        $q = $seek;
        echo 'Du har s&oslash;gt p&aring;: <i><b>'.$q.'</b></i>';
        $this->search($q);
    }
   
    // flyttet fra DB classen
    public function search($q) {
        $search = '%'.$q.'%';
        $stmt = $this->conn->prepare("select firstname, middlename, lastname, phone, email from contacts where firstname = ?");
        if($stmt) {
            mysqli_stmt_bind_param($stmt, 's', $search);
            mysqli_stmt_execute($stmt);
            mysqli_stmt_bind_result($stmt, $firstname, $middlename, $lastname, $phone, $email);
            while(mysqli_stmt_fetch($stmt)) {
                $fullname = $fisrtname.' '.$middlename.' '.$lastname;
                echo '
                <span class="info">'.$fullname.'</span>
                <span class="info">'.$phone.'</span>
                <span class="info">'.$email.'</span>
                ';
            }
        }
    }
   
    // igen hvorfor denne wrapper function ??
    public function contactList() {
      $this->showAll();
    }
   
    // omtalt i http://www.computerworld.dk/eksperten/spm/1011340 #25
    // flyttet fra DB classen   
    public function showAll() {
        $stmt = $this->conn->prepare("select firstname, middlename, lastname, phone, email, relation from contacts");
        if ($stmt) {
            mysqli_stmt_execute($stmt);
            mysqli_stmt_bind_result($stmt, $firstname, $middlename, $lastname, $phone, $email, $relation);
            while (mysqli_stmt_fetch($stmt)) {
                $fullname = $firstname . ' ' . $middlename . ' ' . $lastname;
                echo '
                <span>' . $fullname . '</span>
                <span>' . $phone . '</span>
                <span>' . $email . '</span>
                <span>' . $relation . '</span>
                ';
            }
            mysqli_stmt_close($stmt);
        }
    }
   
}


// her gider jeg ikke arve min connection, jeg kan jo kun arve fra én class, så jeg holder arven i baghånden
// dette gør jeg normalt
class myclass{
    private $db; // hvis jeg skal bruge andre motoder fra DB,
    private $conn;
   
    public function __construct() {
        $this->db=new DB();
        $this->conn = $this->db->connection();
    }   
}
?>




index.php

<?php
session_start();
require 'config/paths.php';
// require 'config/db.class.php';
require_once 'controllers/model.php';

require 'libs/bootstrap.php';

$app = new Bootstrap();
if (isset($_SESSION['sesid']) && $_SESSION['sesid'] == true) {
    $app->bootstrap();
} else {
    $app->bootstrap();
}
?>


add_contact.php

<div class="forms">
    <form action="" method="post">
        <label>Fornavn</label><input type="text" name="firstname" placeholder="Fornavn">
        <label>Mellemnavn</label><input type="text" name="middlename" placeholder="Mellemnavn">
        <label>Efternavn</label><input type="text" name="lastname" placeholder="Efternavn">
        <label>F&oslash;dselsdag</label><input type="date" name="birthday" placeholder="YYYY-MM-DD">
        <label>Telefon</label><input type="text" name="phone" placeholder="Telefon nummer">
        <label>Email</label><input type="text" name="email" placeholder="Email">
        <label>Relation</label><select name="relation">
            <option>V&aelig;lg Relation</option>
            <option value="family">Familie</option>
            <option value="owner">Ejer</option>
            <option value="friends">Venner</option>
            <option value="worker">Kollega</option>
            <option value="other">Andet</option>
        </select>
        <input type="submit" name="add" value="Opret Kontakt" id="btn">
        <input type="reset" value="Ryd Felter" id="btn">
    </form>
    <?php
    if (isset($_POST['add'])) {
        $firstname = $_POST['firstname'];
        $middlename = $_POST['middlename'];
        $lastname = $_POST['lastname'];
        $birthday = $_POST['birthday'];
        $phone = $_POST['phone'];
        $email = $_POST['email'];
        $relation = $_POST['relation'];
        require_once 'controllers/model.php';
        // require_once 'controllers/admin.php';

        $con = new Admin();
        $con->addContact($firstname, $middlename, $lastname, $birthday, $phone, $email, $relation);
    }
    ?>
</div>



bootstrap.php (uændret)
Avatar billede arne_v Ekspert
05. juli 2016 - 03:32 #13
Halvgammelt spoergsmaal men lige et par kommentarer.


// private kan ikke nedarves, kan ikke nåes udefra
// protected kan nedarves 1 led, men ikke nåes udefra
// public kan nedarves mange led, og nåes udefra


protected nedarves mange led.


// her gider jeg ikke arve min connection, jeg kan jo kun arve fra én class, så jeg holder arven i baghånden


Traits loeser dette problem.
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