Avatar billede Morten Professor
04. april 2016 - 14:25 Der er 17 kommentarer og
2 løsninger

Mysqli update virker ikke

Hej har et problem med denne kode:
<?php
        /* Rediger vare */
if ($stmt = $con->prepare('UPDATE `tbl_galleri` SET `id`=?, `gid`=?, `billede`=?, `billede2`=?, `billede3`=?, `billede4`=?, `vare`=?, `laengde`=?, `hoejde`=?, `tykkelse`=?, `designet`=?, `tekst`=?, `oprettet`=?, `pris`=? WHERE `id`=?')) {

    /* Bind parametre */
    $stmt->bind_param('iisssssiiisssi', $id, $gid, $billede, $billede2, $billede3, $billede4, $vare, $laengde, $hoejde, $tykkelse, $designet, $tekst, $oprettet, $pris);

    /* Sæt værdier på parametrene */
    $id = $_POST['id'];
    $gid = $_POST['gid'];
    $billede = $_POST['billede'];
    $billede2 = $_POST['billede2'];
    $billede3 = $_POST['billede3'];
    $billede4 = $_POST['billede4'];
    $vare = $_POST['vare'];
    $laengde = $_POST['laengde'];
    $hoejde = $_POST['hoejde'];
    $tykkelse = $_POST['tykkelse'];
    $designet = $_POST['designet'];
    $tekst = $_POST['tekst'];
    $oprettet = $_POST['oprettet'];
    $pris = $_POST['pris'];

    /* Eksekver forespørgslen */
    $stmt->execute();

    /* Luk statement */
    $stmt->close();

} else {
    /* Der er opstået en fejl */
    echo 'Der opstod en fejl i erklæringen: ' . $con->error;
}
?>
Den bliver ved med at komme med denne fejl:
Warning: mysqli_stmt::bind_param(): Number of variables doesn't match number of parameters in prepared statement in C:\wamp\www\mgvandkanten\admin\rediger_vare.php on line 49 Call Stack: 0.0015 284480 1. {main}() C:\wamp\www\mgvandkanten\admin\rediger_vare.php:0 0.0079 303592 2. mysqli_stmt->bind_param() C:\wamp\www\mgvandkanten\admin\rediger_vare.php:49

Har tjekket min iisssssiiisssi om den skulle være rigtig og det er den.

Nogen der kan se fejlen??

Med venlig hilsen
Morten
Avatar billede arne_v Ekspert
04. april 2016 - 14:37 #1
Som jeg kan taelle er der 14 tegn i iisssssiiisssi og der er 15 spoergsmaaltegn i SQL.
Avatar billede olsensweb.dk Ekspert
04. april 2016 - 14:45 #2
du mangler parameteren for id i WHERE `id`=?'
   

>SET `id`=?, `gid`=
hvorfor sætter du id igen ??, den ændre sig vel ikke, da det er primær nøgle
Avatar billede olsensweb.dk Ekspert
04. april 2016 - 14:48 #3
>`billede`=?, `billede2`=?, `billede3`=?, `billede4`=?,
har du overvejet at normaliserer din database ??
billede er en repeterende gruppe, hvilke fjernes som det første, for at komme på 1 Normal form
Avatar billede olsensweb.dk Ekspert
04. april 2016 - 14:57 #4
hvor er det da bare meget nemmere med PDO, hvor man også kan bruge named placeholders.
dette tælle arbejde er en af grundene til at jeg gik bort fra mysqli.

i mysqli kan du kun bruge numberes placeholders (?)

i PDO kan du bruge numbered placeholders og named placeholders (jeg anvender kun named placeholders)
Avatar billede Morten Professor
04. april 2016 - 14:59 #5
Det virkede brugte GET i stedet for "?"

Hmm hvordan vil du gøre det med billeder ronols?

Det viker ikke helt efter hensigten den ændre dem ikke og de står der ikke kun hvis jeg opretter et tekst field så er er navnet fremme, men kan ikke ændre det.
<?php
  echo '<select name="billede">
    <option value=" ">----Ingen billeder----</option>';
   
    /* billede */
    if ($stmt = $con->prepare('SELECT `id`, `billedenavn`, `dato`, `tid` FROM `tbl_billedemenu`' )) {
        /* Bind parametre */
        $stmt->bind_param('i', $B_id);

        /* Sæt værdier på parametrene */
        $B_id = 1;

        /* Eksekver forespørgslen */
        $stmt->execute();

        /* Bind resultatet */
        $stmt->bind_result($B_id, $B_billedenavn, $B_dato, $B_tid);
        }
        while ($stmt->fetch()) {
            echo '<option>'.$B_billedenavn.'</option>';
            };
            echo '</select>';   
        ?>
        <label for="billede"></label>
        <input name="billede" type="text" id="billede" value="<?php echo $billede; ?>">
Avatar billede olsensweb.dk Ekspert
04. april 2016 - 15:44 #6
>Det virkede brugte GET i stedet for "?"
du bruger vel ikke GET direkte oppe i dit sql statement !!!, så smadre du sikkerheden i prepare statement, og åbner for sql injection

dette 
 
if ($stmt = $con->prepare('UPDATE `tbl_galleri` SET `id`=?, `gid`=?, `billede`=?, `billede2`=?, `billede3`=?, `billede4`=?, `vare`=?, `laengde`=?, `hoejde`=?, `tykkelse`=?, `designet`=?, `tekst`=?, `oprettet`=?, `pris`=? WHERE `id`=?')) {
$stmt->bind_param('iisssssiiisssi', $id, $gid, $billede, $billede2, $billede3, $billede4, $vare, $laengde, $hoejde, $tykkelse, $designet, $tekst, $oprettet, $pris);

/* Sæt værdier på parametrene */
$id = $_POST['id'];
$gid = $_POST['gid'];   
....


skulle vel se sådan ud
 
if ($stmt = $con->prepare('UPDATE `tbl_galleri` SET `gid`=?, `billede`=?, `billede2`=?, `billede3`=?, `billede4`=?, `vare`=?, `laengde`=?, `hoejde`=?, `tykkelse`=?, `designet`=?, `tekst`=?, `oprettet`=?, `pris`=? WHERE `id`=?')) {
$stmt->bind_param('isssssiiisssii', $gid, $billede, $billede2, $billede3, $billede4, $vare, $laengde, $hoejde, $tykkelse, $designet, $tekst, $oprettet, $pris, $id);
   
/* Sæt værdier på parametrene */
$id = $_POST['id']; // får du din id over som GET eller POST ??
$gid = $_POST['gid'];   
....
   



>Hmm hvordan vil du gøre det med billeder ronols?
lav en seperat billed tabel


http://www.udvikleren.dk/artikler/146/normalformer-baseret-paa-primaernoegler/
https://en.wikipedia.org/wiki/Database_normalization
https://en.wikipedia.org/wiki/First_normal_form
http://www.studytonight.com/dbms/database-normalization.php
Avatar billede Morten Professor
04. april 2016 - 16:01 #7
Må jeg så POST i SQL uden det går ud over "så smadre du sikkerheden i prepare "
Avatar billede Morten Professor
04. april 2016 - 17:07 #8
Jeg fandt da ud af det med billederne, så virker det da.
Men det andet der med at undgå injection, jeg kan ikke bruge ? så fejler den. med den samme fejl til at starte med i oplæget
Avatar billede olsensweb.dk Ekspert
04. april 2016 - 18:39 #9
>Må jeg så POST i SQL uden det går ud over "så smadre du sikkerheden i prepare "
nej

du må ikke skrive bruger input direkte i denne linje
$con->prepare('UPDATE `tbl_galleri` SET `gid`=?,
hverken som POST eller GET
input skal via bind


>jeg kan ikke bruge ?
prøv denne som jeg skrev i #6

if ($stmt = $con->prepare('UPDATE `tbl_galleri` SET `gid`=?, `billede`=?, `billede2`=?, `billede3`=?, `billede4`=?, `vare`=?, `laengde`=?, `hoejde`=?, `tykkelse`=?, `designet`=?, `tekst`=?, `oprettet`=?, `pris`=? WHERE `id`=?')) {
$stmt->bind_param('isssssiiisssii', $gid, $billede, $billede2, $billede3, $billede4, $vare, $laengde, $hoejde, $tykkelse, $designet, $tekst, $oprettet, $pris, $id);


jeg opdaterer ikke id, men bruger værdien i where, og dens placering i bind er flyttet
Avatar billede Morten Professor
04. april 2016 - 19:52 #10
Ahh det virkede den må jeg lige huske, så jeg er forberet på næste gang.
Og så jeg får kodet rigtigt.
Mange tak for hjælpen.

Skal vi ikke dele point? Fik noget fra jer begge, det gav mig overblik over hvad der gav mig problemer og jeg fik en løsning.

Med venlig hilsen
Morten
Avatar billede Morten Professor
04. april 2016 - 20:02 #11
hmm nu får jeg en masse fejl mine $_POST kan ikke ses længere

mærkeligt :-/

Jeg kæmper videre
Avatar billede Morten Professor
04. april 2016 - 20:29 #12
Lige meget fandt fejlen ;-)
Det var en fejl 40 cm.
Avatar billede Morten Professor
04. april 2016 - 20:32 #13
Ej helt ærligt det var det så ikke :(
Avatar billede Morten Professor
04. april 2016 - 21:16 #14
Nå men jeg fik det til at virke min fejl kommer stadig mærkeligt nok
Avatar billede olsensweb.dk Ekspert
05. april 2016 - 10:16 #15
#5
får du ikke en bind fejl her:

if ($stmt = $con->prepare('SELECT `id`, `billedenavn`, `dato`, `tid` FROM `tbl_billedemenu`' )) {
    /* Bind parametre */
    $stmt->bind_param('i', $B_id); // <-- denne linje skal slettes
    /* Sæt værdier på parametrene */
    $B_id = 1; // <-- denne linje skal slettes

du har jo ikke noget spørglmåls tegn parameteren kan binde til 
   
-------------------------   
   

#10
du får et svar her fra min side.
husk at vente på arne_v's tilbage melding i 1 uge, før du lukker
Avatar billede olsensweb.dk Ekspert
05. april 2016 - 10:54 #16
nå glemte at markere som svar
der er det sku nemmere på udvikleren.dk med karma, der skal man ikke tænke på svar

du får et svar her fra min side.
husk at vente på arne_v's tilbage melding i 1-2 uger, før du lukker
Avatar billede Morten Professor
05. april 2016 - 11:44 #17
Jeps jeg venter bare ;o)

Nej får ikke nogen fejl, men kan godt se hvad du mener med, der ikke er noget at binde til.

Endnu en gang tak for hjælpen.
Må sige du har gjort mig noget klogere på mysqli opsætningen.

Med venlig hilsen
Morten
Avatar billede arne_v Ekspert
07. april 2016 - 01:35 #18
svar
Avatar billede arne_v Ekspert
07. april 2016 - 01:38 #19
Men overvej at give ronols flere point end mig.

Hans indsats har vaeret mange gange stoerre.
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