Avatar billede delphiuser Mester
20. december 2014 - 10:06 Der er 7 kommentarer og
1 løsning

array i mysql insert

Hej eksperter.

Jeg har lavet en array() som jeg vil bruge til min sql forspørgelse.
men bliver ved med at få en fejl.

mit script ser sådan her ud.

$columns = "";
    $values = "";
   
    foreach($data as $column => $value) {
        $columns .= ($columns == "") ? "" : ", ";
        $columns .= $column;
        $values .= ($values == "") ? "" : ", ";
        $values .= $value;
    }
    $sql = "insert into users($columns) values($values)";
    mysql_query($sql) or die(mysql_error());
}

den fejl jeg får er denne:
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 'Hansen, Baltorpvej 267, 2 tv, 2750, Balleup, 26331601, 26331601, job@jp-pro.dk)' at line 1

hvad er det jeg har gjort galt. kan ikke selv finde fejlen.
Avatar billede Slater Ekspert
20. december 2014 - 10:47 #1
Du skal have anførselstegn om alle ikke-numeriske værdier, når du ikke bruger parameterized queries.
Avatar billede delphiuser Mester
20. december 2014 - 11:16 #2
hvordan sætter jeg det op i min kode?
Avatar billede olsensweb.dk Ekspert
20. december 2014 - 13:45 #3
hvorfor anvender du stadig det gamle mysql API ??
de sidste 3 år har du fået denne besked ved alle mysql functioner
ref http://php.net/mysql_connect
     
This extension is deprecated as of PHP 5.5.0, and will be removed in the future. Instead, the MySQLi or PDO_MySQL extension should be used. See also MySQL: choosing an API guide and related FAQ for more information.


hvordan sætter jeg det op i min kode?
ca sådan (utested)
     
$columns = "";
    $values = ""; 
    foreach($data as $column => $value) {
        $columns .= ($columns == "") ? "" : ", ";
        $columns .= $column;
        $values .= "'".$value."'".",";       
    }
    $values = substr($values, 0, -1); // fjerner det sidste ","
    $sql = "insert into users($columns) values($values)";   
    mysql_query($sql) or die(mysql_error());



jeg har selv brugt denne function i mysqli.
mangler at sikre mod at array er tomt, hvilke kan gøres med en if og count($ar)
  
<?php
function Create($conn, $tbl, $ar = array()) {
    $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 .= ')';   
    $rs = $conn->query($sql);
    return $conn->insert_id;
}

// http://php.net/manual/en/mysqli.construct.php
$conn = new mysqli('localhost', 'root', '', "test");

$data =array("lastname"=>"Hansen", "address"=>"Baltorpvej 267, 2 tv", "zipcode"=>"2750", "city"=>"Balleup", "phone"=>"26331601", "fax"=>"26331601", "email"=>"job@jp-pro.dk");
$user_id = Create($conn, "users", $data);
?>
Avatar billede arne_v Ekspert
21. december 2014 - 01:53 #4
Med lidt snille kan man godt faa array, mysqli prepare, call_user_func_array med bind_param og execute til at virke.
Avatar billede olsensweb.dk Ekspert
21. december 2014 - 11:39 #5
@arne_v
Med lidt snille kan man godt faa array, mysqli prepare, call_user_func_array med bind_param og execute til at virke.
du tænker noget ala dette
http://board.phpbuilder.com/showthread.php?10388707-RESOLVED-mysqli-with-prepare-bind_param-and-arrays-for-an-insert-class&s=7968b2e5034e916799219dfa0061606a&p=11023035&viewfull=1#post11023035

jeg ville ikke skramme sprøgeren i første omgang med Prepare Statement, han arbejder jo desværrer stadig i det gamle API.

for mig var mysql kun et mellemtrin, da man kunne blande Procedural style som vi kender det fra det gamle mysql API og Object oriented style

Personligt er jeg gået bort fra mysqli og valgt PDO, som mit foretrukne API, der er Prepare Statement også nemmere.


@delphiuser hvis du vil have en kort intro til Prepare Statement under mysqli så kig på olebole's guide http://www.eksperten.dk/guide/1480
Avatar billede arne_v Ekspert
21. december 2014 - 18:13 #6
Ja.

Omend jeg laver det lidt anderledes:


function load($con, $sqlstr, $typs, $vals) {
    if($stmt = $con->prepare($sqlstr)) {
        call_user_func_array(array($stmt, 'bind_param'), array_merge(array($typs), array_map(function(&$v) { return $v; }, $vals)));
        $stmt->execute();
        if($res = $stmt->get_result()) {
            $retval = $res->fetch_all(MYSQLI_ASSOC);
            $res->free();
            $stmt->close();
        } else {
            die($con->error);
        }
    } else {
        die($con->error);
    }
    return $retval;
}


Men jeg er enig i at det er langt simplere med PDO.
Avatar billede delphiuser Mester
21. december 2014 - 18:25 #7
ronols læg et svar. det virker det du kom med.
Avatar billede olsensweb.dk Ekspert
22. december 2014 - 15:03 #8
svar
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