Avatar billede delphiuser Mester
21. juni 2016 - 11:23 Der er 28 kommentarer og
1 løsning

hvad har jeg gjort galt her

Hej eksperter

Jeg sidder for ved nu engang og leger med MySqli. Har ikke rigtig kunnet forene mig med det. Men nu prøver jeg igen og denne gang skal jeg lære det.
Kan godt se alle fordelene ved det.

Nå men til mit spørgsmål. Jeg er ved at lave en simpel insert i min database tabel. men får denne fejl.

Warning: mysqli_query() expects at least 2 parameters, 1 given in C:\wamp64\www\test\config\db.class.php on line 23

min DB class ser sådan ud so far.

class DB {

    protected $db_host = 'localhost';
    protected $db_user = 'test';
    protected $db_pass = 'xxxx';
    protected $db_name = 'test';

    public function __construct() {
        $conn = mysqli_connect($this->db_host, $this->db_user, $this->db_pass, $this->db_name);
        if(mysqli_connect_errno()) {
            die('Connection Failed :' . mysqli_connect_error());
            exit;
        } else {
            echo 'Connection made successfully...';
        }
        return true;
    }

    public function insert($key, $val) {
        $sql = "insert into people($key) VALUES($val)";
        mysqli_query($sql);
    }
}

hvad har jeg gjort forkert. og eventuelt lige vise mig det så jeg ved hvad det er og hvorfor. for som sagt denne gang skal mysqli altså ind på lystavlen.

tak for jeres hjælp.
21. juni 2016 - 11:30 #1
Du mangler at gemme $conn på objektet og så inkludere det som den første parameter til mysqli_query

mysqli_query( $this->conn, $sql );
Avatar billede delphiuser Mester
21. juni 2016 - 11:43 #2
har jeg prøvet, får disse fejlmeddelse nu.

Notice: Undefined property: DB::$conn in C:\wamp64\www\test\config\db.class.php on line 24
Warning: mysqli_query() expects parameter 1 to be mysqli, null given in C:\wamp64\www\test\config\db.class.php on line 24

min kode ser sådan ud nu.

class DB {

    protected $db_host = 'localhost';
    protected $db_user = 'test';
    protected $db_pass = 'xxxx';
    protected $db_name = 'test';

    public function __construct() {
        $conn = mysqli_connect($this->db_host, $this->db_user, $this->db_pass, $this->db_name);
        mysqli_set_charset($conn, "utf8");
        if(mysqli_connect_errno()) {
            die('Connection Failed :' . mysqli_connect_error());
            exit;
        } else {
            echo 'Connection made successfully...';
        }
        return $conn;
    }

    public function insert($key, $val) {
        $sql = "insert into people($key) VALUES($val)";
        mysqli_query($this->conn, $sql);
    }
}
Avatar billede olsensweb.dk Ekspert
21. juni 2016 - 11:49 #3
som skrevet i #1 (fremhævet)

class DB {
    protected $db_host = 'localhost';
    protected $db_user = 'test';
    protected $db_pass = 'xxxx';
    protected $db_name = 'test';
    protected $conn="";

    public function __construct() {
        $conn = mysqli_connect($this->db_host, $this->db_user, $this->db_pass, $this->db_name);
        mysqli_set_charset($conn, "utf8");
        if(mysqli_connect_errno()) {
            die('Connection Failed :' . mysqli_connect_error());
            exit;
        } else {
            echo 'Connection made successfully...';
        }
        // return $conn;
        $this->conn = $conn;
    }

    public function insert($key, $val) {
        $sql = "insert into people($key) VALUES($val)";
        mysqli_query($this->conn, $sql);
    }
}
Avatar billede delphiuser Mester
21. juni 2016 - 11:53 #4
Så langt så godt. nu kommer der ikke nogen fejl. Men den lægger det ikke op i min database. hvad har jeg ellers gjort forkert.

Her kommer den smule kode jeg bruger ved min form...

<?php

require 'config/db.class.php';

$mysqli = new DB();

?>

<form action="#" method="post">
    <label>Name</label><input type="text" name="name" placeholder="Navn">
    <label>Date of Birth</label><input type="date" name="birthday" placeholder="YYYY-MM-DD">
    <label>Email</label><input type="email" name="email" placeholder="example@yourdomain.com">
    <input type="submit" value="Accept">
    <input type="reset" value="Clear Fields">
</form>
<?php
foreach ($_POST as $key => $val) {
        $add_query = $mysqli->insert($key, $val);
    }
?>

igen jeg er helt ny med at bygge det op på denne måde.
Avatar billede olsensweb.dk Ekspert
21. juni 2016 - 11:54 #5
alternativ lav connect som en seperat function, og kald den inde fra insert
(utested)

class DB {
    protected $db_host = 'localhost';
    protected $db_user = 'test';
    protected $db_pass = 'xxxx';
    protected $db_name = 'test';
   

    public function __construct() {
       
       
    }
   
    public function connect() {
        $conn = mysqli_connect($this->db_host, $this->db_user, $this->db_pass, $this->db_name);
        mysqli_set_charset($conn, "utf8");
        if(mysqli_connect_errno()) {
            die('Connection Failed :' . mysqli_connect_error());
            exit;
        } else {
            echo 'Connection made successfully...';
        }
        return $conn;
    }   
   

    public function insert($key, $val) {
        $conn = $this->connect();
        $sql = "insert into people($key) VALUES($val)";
        mysqli_query($conn, $sql);
    }
}
Avatar billede delphiuser Mester
21. juni 2016 - 12:03 #6
Lavede lige en mysql_error() på min query.

der gav den mig denne fejl igen.

Warning: mysqli_error() expects exactly 1 parameter, 0 given in C:\wamp64\www\test\config\db.class.php on line 26

public function insert($key, $val) {
        $sql = "insert into people($key) VALUES('$val')";
        mysqli_query($this->conn, $sql) or die(mysqli_error());
    }
21. juni 2016 - 12:15 #7
Jeg tænker:
mysqli_query($this->conn, $sql) or die(mysqli_error($this->conn));
Avatar billede olsensweb.dk Ekspert
21. juni 2016 - 12:15 #8
prøv at echo din sql ud !!

i din insert

public function insert($key, $val) {       
    $sql = "insert into people($key) VALUES($val)";
    echo $sql;
    // mysqli_query($this->conn, $sql);
}

dine values skal i plinger da det er stringe

skal se ca sådan ud
public function insert($key, $val) {       
    $sql = "insert into people($key) VALUES('".$val."')";   
    mysqli_query($this->conn, $sql);
}
Avatar billede delphiuser Mester
21. juni 2016 - 12:26 #9
Den retunere fint de værdier som står i mine strings. den vil bare ikke udføre min indsæt til tabellen. det er det jeg ikke helt kan forstå.

class DB {

    protected $db_host = 'localhost';
    protected $db_user = 'test';
    protected $db_pass = '1234';
    protected $db_name = 'test';
    protected $conn = '';

    public function __construct() {

    }

    public  function connect(){
        $conn = mysqli_connect($this->db_host, $this->db_user, $this->db_pass, $this->db_name);
        mysqli_set_charset($conn, "utf8");
        if(mysqli_connect_errno()) {
            die('Connection Failed :' . mysqli_connect_error());
            exit;
        } else {
            echo 'Connection made successfully...';
        }
        return $conn;
        //$this->conn = $conn;
    }

    public function insert($key, $val) {
        $conn = $this->connect();
        $sql = "insert into people(".$key.") VALUES('".$val."')";
        //echo $sql;
        mysqli_query($conn, $sql) or die(mysqli_error());
    }
}
21. juni 2016 - 12:31 #10
Huske venligst som jeg skrev:  or die(mysqli_error($this->conn));

Så kan du se hvad fejlen i sql'en er.
Avatar billede Slater Ekspert
21. juni 2016 - 12:59 #11
#10: Det gjorde han allerede. Tjek #6.
21. juni 2016 - 13:03 #12
#11: Nej, fordi problemet var at mysqli_error() kræver en parameter ;-) og den havde han glemt.
Avatar billede Slater Ekspert
21. juni 2016 - 13:09 #13
#12: Ah, din rettelse var på forglemmelsen. Jeg troede du mente, han skulle forsøge at gøre det - altså benytte den statement - for at se fejlen. Beklager. Og godt set at han gjorde det samme igen.
Avatar billede delphiuser Mester
21. juni 2016 - 13:24 #14
Maya -> nu har jeg lavet det hele som det skal. og det virker som sådan sætter bare ikke noget ind. Får en fejl der skriver dette: Field 'birthday' doesn't have a default value. Hvad kan dette skyldes. har jeg aldrig oplevet før.

min form ser sådan ud...

<?php

require_once 'config/db.class.php';

$mysqli = new DB();

foreach($_POST as $key => $val) {
    // echo $key .' : ' .$val . '<br>';
    $mysqli->insert($key, $val);
}
?>
<form action="#" method="post">
    <label>Name</label><input type="text" name="name" value="Name">
    <label>Date of birth</label><input type="date" name="birthday" value="YYYY-MM-DD">
    <label>Email</label><input type="email" name="email" value="example@yourdomain.com">
    <input type="submit" value="Accept">
    <input type="reset" value="Clear Fields">
</form>
Avatar billede olsensweb.dk Ekspert
21. juni 2016 - 13:27 #15
> or die(mysqli_error($this->conn));
skal vel se sådan ud
or die(mysqli_error($conn));
nu når conn ligger i sammen functiuon jf #9

public function insert($key, $val) {
    $conn = $this->connect();
    $sql = "insert into people(".$key.") VALUES('".$val."')";   
    mysqli_query($conn, $sql) or die(mysqli_error($conn));
}




@delphiuser
har du tænkt over, hver collonne er i hver sin række, det er vist ikke det du vil !!!

lige nu ser din sql sådan ud:
insert into people(name) VALUES('ronn')
insert into people(birthday) VALUES('2016-12-31')
insert into people(email) VALUES('rjo@test.dk')

så du skal lave din insert helt om !!

så $key bliver ligmed name,birthday,email
og $val bliver ligmed 'lsjd', '2016-05-05', 'test@test.dk'





forbedrings forslag:
du bør nok vende dig af med at bruge procedural style, og gå over til OOP style, da det er nutiden og fremtiden

kig på Prepare Statement som er noget af det nye der er kommet til i mysqli og forbedret i PDO
21. juni 2016 - 13:32 #16
Du skal ikke have en løkke pr. key/value.

Der skal kun være en sql som skal køres og den skal være:
insert into people(name,birthday,email) VALUES('{$_POST['name]}','{$_POST['birthday]}','{$_POST['email]}')
Avatar billede delphiuser Mester
21. juni 2016 - 13:38 #17
så det jeg kan gøre er at lave en sql streng efter min submit. også kalde min sql streng ind i min function? vil det være en mulighed eller bliver det noget rod?
21. juni 2016 - 13:45 #18
Det er præcis det her du skal køre ved submit. Det bliver ikke objektorienteret, men det må du jo så forsøge at få det til, hvis du ikke blot er interesseret i at få det til at virke. Jeg tænker på at du i første omgang kunne fokusere på at få databasedelen til at virke. Derefter kan du så forsøge at overføre det til en klasse - i stedet for at det er proceduralt.

$db_host = 'localhost';
$db_user = 'test';
$db_pass = 'xxxx';
$db_name = 'test';

$conn = mysqli_connect($db_host, $db_user, $db_pass, $db_name);

if (mysqli_connect_errno()) {
  echo "Failed to connect to MySQL: " . mysqli_connect_error();
}
else
{

$sql = "insert into people(name,birthday,email) VALUES('{$_POST['name]}','{$_POST['birthday]}','{$_POST['email]}')"

mysqli_query($conn, $sql) or die(mysqli_error($conn));

}
Avatar billede delphiuser Mester
21. juni 2016 - 13:59 #19
nu fik jeg det til at virke på denne måde her.

class DB {
    protected $db_host = 'localhost';
    protected $db_user = 'test';
    protected $db_pass = '1234';
    protected $db_name = 'test';
    protected $conn="";

    public function __construct() {
        $conn = mysqli_connect($this->db_host, $this->db_user, $this->db_pass, $this->db_name);
        mysqli_set_charset($conn, "utf8");
        if(mysqli_connect_errno()) {
            die('Connection Failed :' . mysqli_connect_error());
            exit;
        } else {
            echo 'Connection made successfully...';
        }
        // return $conn;
        $this->conn = $conn;
    }

    public function insert($sql) {
        mysqli_query($this->conn, $sql) or die(mysqli_error($this->conn));
        //echo $sql;
    }
}
ved det ser lidt for simpelt ud. Men det er en start. så må jeg så se om jeg kan få det bygget ud stille og roligt så det kan blive mere oop med tiden når jeg kommer mere ind i det. nu skal jeg først lære alle grund principperne i mysqli. men jeg kommer helt sikkert med nogle flere spørgsmål inden længe.
21. juni 2016 - 14:05 #20
Det er sådan set ok. Du kan dog også bruge funktionen til at slette med b.la. f.eks.

"delete * from people"

Så i stedet for "Insert" kunne man kalde den "do_sql" eller "exec_sql" fordi den kan gøre/eksekverer lidt forskellige sql-sætninger.
21. juni 2016 - 14:06 #21
Du spørger bare :-)
Avatar billede olsensweb.dk Ekspert
21. juni 2016 - 14:13 #22
du kan gøre sådan her:

<?php
require_once 'debugheader.php';
require_once 'db.class.php';


if (isset($_POST['name'])) {
    $mysqli = new DB();
    // skal valideres
    $email = $_POST['email'];
    $name = $_POST['name'];
    $birthday = $_POST['birthday'];
   
    $mysqli->Create("people", array("name" => $name, "birthday" => $birthday, "email" => $email));
}
?>

<form action="#" method="post">
    <label>Name</label><input type="text" name="name" placeholder="Navn">
    <label>Date of Birth</label><input type="date" name="birthday" placeholder="YYYY-MM-DD">
    <label>Email</label><input type="email" name="email" placeholder="example@yourdomain.com">
    <input type="submit" value="Accept">
    <input type="reset" value="Clear Fields">
</form>


db.class.php

<?php
class DB {
    protected $db_host = 'localhost';
    protected $db_user = 'root';
    protected $db_pass = '';
    protected $db_name = 'test';

    public function __construct() {
       
    }

    public function connect() {
        $conn = mysqli_connect($this->db_host, $this->db_user, $this->db_pass, $this->db_name);
        mysqli_set_charset($conn, "utf8");
        if (mysqli_connect_errno()) {
            die('Connection Failed :' . mysqli_connect_error());
            exit;
        } else {
            echo 'Connection made successfully...';
        }
        return $conn;
        //$this->conn = $conn;
    }

    function Create($tbl, $ar = array()) {
        $conn = $this->connect();
        $values = "";
        $keys = "";
        foreach ($ar as $key => $value) {
            $keys .= $key . ", ";
            $values .= "'" . $value . "', ";
        }
        $sql = 'INSERT INTO ';
        $sql .= $tbl;
        $sql .= ' (';
        $sql .= substr($keys, 0, -2); // fjerner det sidste ", "
        $sql .= ') ';
        $sql .= 'VALUES ';
        $sql .= '(';
        $sql .= substr($values, 0, -2); // fjerner det sidste ", "
        $sql .= ')';
        // echo $sql; // test
        $rs = $conn->query($sql) or die(mysqli_error($conn));
        return $conn->insert_id;
    }
}
?>

jeg ville lave en class til people der arver db classen
Avatar billede delphiuser Mester
21. juni 2016 - 14:19 #23
ronols -> denne du lige har skrevet. den vil jeg vende tilbage til senere. men ser rigtig interessant ud. måske lidt mere kompliceret. Men klart jeg vil bruge alt hvad jeg får af gode eksempler på mine spørgsmål. Jeg er meget taknemmelig for hjælpen.
Avatar billede olsensweb.dk Ekspert
21. juni 2016 - 14:45 #24
her er en lidt pænere måde at gøre det på IMHO

<?php
require_once 'debugheader.php';
require_once 'db.class.php';


if (isset($_POST['name'])) {
    $people = new people();
    // skal valideres
    $email = $_POST['email'];
    $name = $_POST['name'];
    $birthday = $_POST['birthday'];
    $people->Create_($name, $birthday, $email);
}
?>

<form action="#" method="post">
    <label>Name</label><input type="text" name="name" placeholder="Navn">
    <label>Date of Birth</label><input type="date" name="birthday" placeholder="YYYY-MM-DD">
    <label>Email</label><input type="email" name="email" placeholder="example@yourdomain.com">
    <input type="submit" value="Accept">
    <input type="reset" value="Clear Fields">
</form>




<?php
class DB {
    protected $db_host = 'localhost';
    protected $db_user = 'root';
    protected $db_pass = '';
    protected $db_name = 'test';
    protected $tbl="";
   
    public function __construct() {
       
    }

    public function connect() {
        $conn = mysqli_connect($this->db_host, $this->db_user, $this->db_pass, $this->db_name);
        mysqli_set_charset($conn, "utf8");
        if (mysqli_connect_errno()) {
            die('Connection Failed :' . mysqli_connect_error());
            exit;
        } else {
            echo 'Connection made successfully...';
        }
        return $conn;
        //$this->conn = $conn;
    }

    public function Create($ar = array()) {       
        $conn = $this->connect();
        $values = "";
        $keys = "";
        foreach ($ar as $key => $value) {
            $keys .= $key . ", ";
            $values .= "'" . $value . "', ";
        }
        $sql = 'INSERT INTO ';
        $sql .= $this->tbl;
        $sql .= ' (';
        $sql .= substr($keys, 0, -2); // fjerner det sidste ", "
        $sql .= ') ';
        $sql .= 'VALUES ';
        $sql .= '(';
        $sql .= substr($values, 0, -2); // fjerner det sidste ", "
        $sql .= ')';
        echo $sql; // test
        $rs = $conn->query($sql) or die(mysqli_error($conn));
        return $conn->insert_id;
    }
}


class people extends DB{
    public function __construct() {
        // tbl er nedarvet
        $this->tbl = "people";
    }
   
    public function Create_($name, $birthday, $email){
        return $this->Create(array("name" => $name, "birthday" => $birthday, "email" => $email));       
    }   
}
?>
Avatar billede delphiuser Mester
21. juni 2016 - 15:12 #25
ronols -> på den måde der kan jeg så gå ind og og lave min tbl nedarvet til enhver tbl jeg har i min database og lave den følgende kode? så jeg kun har brug for en database fil hvor jeg bare laver nogle forskellige functioner med samme grund princip. Dette ville jo klart gå hen og blive meget nemmere hvis man bare kunne nøjes med at lave et kald på sin side med en navneliste feks.

så jeg eventuelt kunne nøjes med at lave en linie som denne...

class contacts extends DB {

$this->tbl = "people";

function contactList() {
      $this->showAll();
}

}
ville det være muligt at kunne gøre det sådan?
Avatar billede olsensweb.dk Ekspert
21. juni 2016 - 15:31 #26
>så jeg eventuelt kunne nøjes med at lave en linie som denne...
ja det ville du kunne gøre.

showAll retunere så bare en liste af alle brugere

skal du bare lave en function oppe i DB der retunerer alle poster i pågældende tabel


så de functioner (metoder) der ligger i DB er generiske, og i underliggende classser er specifikke.

så en metode der joiner flere tabeller vil ikke ligge i DB med i en underliggende class, feks contacts
Avatar billede arne_v Ekspert
22. juni 2016 - 03:15 #27
Jeg ville aldrig bruge en konstruktion som:


<?php
class P {
    protected $v;
    public function test() {
        echo $this->v;
    }
}

class C extends P {
    public function __construct() {
        $this->v = 'It works!';
    }
}

$o = new C();
$o->test();
?>


Der er for meget implicit kontrakt mellem super og sub klasse.

Enten:


<?php
class P {
    private $v;
    public function __construct($v) {
        $this->v = $v;
    }
    public function test() {
        echo $this->v;
    }
}

class C extends P {
    public function __construct() {
        parent::__construct('It works!');
    }
}

$o = new C();
$o->test();
?>


eller:


<?php
abstract class P {
    public abstract function getV();
    public function test() {
        echo $this->getV();
    }
}

class C extends P {
    public function getV() {
        return 'It works!';
    }
}

$o = new C();
$o->test();
?>
Avatar billede arne_v Ekspert
22. juni 2016 - 03:49 #28

      $values = "";
        $keys = "";
        foreach ($ar as $key => $value) {
            $keys .= $key . ", ";
            $values .= "'" . $value . "', ";
        }
        $sql = 'INSERT INTO ';
        $sql .= $this->tbl;
        $sql .= ' (';
        $sql .= substr($keys, 0, -2); // fjerner det sidste ", "
        $sql .= ') ';
        $sql .= 'VALUES ';
        $sql .= '(';
        $sql .= substr($values, 0, -2); // fjerner det sidste ", "
        $sql .= ')';


kunne laves som:


        $values = implode(',', array_values($ar));
        $keys = implode(',', array_keys($ar));
        $sql = 'INSERT INTO ';
        $sql .= $tbl;
        $sql .= ' (';
        $sql .= $keys;
        $sql .= ') ';
        $sql .= 'VALUES ';
        $sql .= '(';
        $sql .= $values;
        $sql .= ')';
Avatar billede arne_v Ekspert
22. juni 2016 - 04:06 #29
Allerhelst ville jeg lave den insert a la:


function insert($con, $tbl, $ar = array()) {     
        $values = implode(',', array_fill(0, count($ar), '?'));
        $keys = implode(',', array_keys($ar));
        $sql = 'INSERT INTO ';
        $sql .= $tbl;
        $sql .= ' (';
        $sql .= $keys;
        $sql .= ') ';
        $sql .= 'VALUES ';
        $sql .= '(';
        $sql .= $values;
        $sql .= ')';
        echo $sql;
        $stmt = $con->prepare($sql);
        $types = implode('', array_map(function($v) { return is_int($v) ? 'i' : 's'; }, array_values($ar)));
        call_user_func_array(array($stmt, 'bind_param'), array_merge(array($types), array_map(function(&$v) { return $v; }, array_values($ar))));
        $stmt->execute();
        $stmt->close();
}


men den kode ville nok kraeve en laengere forklaring.
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