Avatar billede delphiuser Mester
02. juli 2016 - 20:08 Der er 6 kommentarer og
1 løsning

hvad har jeg gjort galt her

Hej eksperter

hvad her jeg gjort galt i denne kode. Den sætter fint nok ind i min users tabel.
men den vil ikke sætte ind i min profiles tabel.

min kode ser sådan her ud.

<?php

class Users {

    protected $conn = '';

    function __construct() {
        $conn = new mysqli('localhost', 'xxx', 'xxx', 'xxx');
        if(mysqli_connect_errno()) {
            die('Database Connection Failed : ' . mysqli_connect_error($conn));
        }
        $this->conn = $conn;
    }

    function add_user ($user, $pass, $email) {
        $passkey = md5(rand(0, 123456789));
        $activated = '1';
        $level = 'user';
        $stmt = $this->conn->prepare("insert into users(user, pass, email, passkey, activated, level) values('$user', '$pass', '$email', '$passkey', '$activated', '$level')");
        if($stmt) {
            mysqli_stmt_execute($stmt);
            $user_id = mysqli_insert_id($this->conn);
            echo 'user id : ' .$user_id;
            $this->add_profile($user_id);
        }

        mysqli_stmt_close($stmt);
    }

    function add_profile($user_id) {
        $stmt = $this->conn->prepare("insert into profiles(user_id) values('$user_id')") or die(mysqli_error($this->conn));
        if($stmt) {
            mysqli_stmt_execute($stmt);
        }
        mysqli_stmt_close($stmt);
    }

}

Har prøvet mig frem på mange måder. jeg skal have det id nummer med som du får i users tabellen med over i profiles. for at det hænger sammen...
Avatar billede Slater Ekspert
02. juli 2016 - 20:38 #1
Får du nogen fejl? Hvordan ser din profiles tabel ud?
Har den f.eks. andre ikke-nullable felter? For så skal der sættes en værdi i dem, når du opretter en række.

Rent bortset fra det, virker det ret underligt at skulle oprette en tom profil for en bruger. Hvad skal det bruges til?

Og hvorfor bruger du prepared statements, når du ikke bruger placeholders, men bare sætter værdierne direkte ind? Så hjælper de ikke en bønne, og er faktisk bare en smule langsommere end en direkte query.
02. juli 2016 - 20:39 #2
Du skal også tjekke om mysqli_stmt_execute() returnerer fejl.

Prøv evt. også and bruge bind_param i stedet for at skrive $user_id direkte ind i sqlsætningen:
http://php.net/manual/en/mysqli-stmt.bind-param.php
Avatar billede arne_v Ekspert
02. juli 2016 - 23:11 #3
Hvad er primary key i profiles tabellen? Er det et auto increment felt?
Avatar billede arne_v Ekspert
02. juli 2016 - 23:11 #4
Kunne du proeve at close stmt i add_user foer end du kalde add_profile?
Avatar billede arne_v Ekspert
02. juli 2016 - 23:15 #5
Og saa givet det flere aars faengsel at bruge MD5 til noget som helst.

Saa:

$passkey = md5(rand(0, 123456789));

->

$passkey = hash("sha256", rand(0, 123456789));
Avatar billede arne_v Ekspert
02. juli 2016 - 23:27 #6
Og som allerede naevnt af andre::
* brug parameters
* bedre check for fejl
* undgaa mix af OO style og procedural style

Utestet:


function add_user($user, $pass, $email) {
    $passkey = hash ( "sha256", rand ( 0, 123456789 ) );
    $activated = 1;
    $level = 'user';
    if ($stmt = $this->conn->prepare ( "insert into users(user, pass, email, passkey, activated, level) values(?, ?, ?, ?, ?, ?)" )) {
        $stmt->bind_param ( 'ssssis', $user, $pass, $email, $passkey, $activated, $level );
        if ($stmt->execute ()) {
            $user_id = $this->conn->insert_id ();
            echo 'user id : ' . $user_id;
            $stmt->close ();
            $this->add_profile ( $user_id );
        } else {
            die ( $conn->error );
        }
    } else {
        die ( $conn->error );
    }
}
Avatar billede delphiuser Mester
03. juli 2016 - 08:14 #7
Slater -> ja det var det med at jeg ikke havde givet nogen null værdi til de andre felter i tabellen. efter jeg gjorde det. så lagde den op i begge tabeller.

tak for din hjælp...

arne_v -> Jeg fandt ud af hvad fejlen var via Slater da han skrev. det var fordi jeg manglede at give næsten alle felter en null værdi i min profiles tabel. nu virker det som det skal.
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

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