SQLSTATE[42000]: Syntax error or access violation: 1064 bla bla bla

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Ronald Koopmans

Ronald Koopmans

04/02/2018 21:50:40
Quote Anchor link
Volgens mij heb ik ergens iets niet goed staan, ik kom er nu even niet meer uit...

Er moet een record gewijzigd worden maar ja... dat gebeurt dus niet ;-)


UPDATE assets SET regnumber,device,brand,model,type,snnumber,pnnumber,specification,status WHERE id=4
SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'device,brand,model,type,snnumber,pnnumber,specification,status WHERE id=4' at line 1

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?php
if(isset($_POST['update']))
    {

        try
        {
            $id    = $_POST['id'];
            $update_asset = array(
                "regnumber"        => $_POST['regnumber'],
                "device"        => $_POST['device'],
                "brand"            => $_POST['brand'],
                "model"            => $_POST['model'],
                "type"            => $_POST['type'],
                "snnumber"        => $_POST['snnumber'],
                "pnnumber"        => $_POST['pnnumber'],
                "specification"    => $_POST['specification'],
                "status"        => $_POST['status']
            );

            $sql=sprintf("UPDATE assets SET %s WHERE id=$id",implode(",",array_keys($update_asset)),":".implode(",:",array_keys($update_asset)));
            $statement = $conn->prepare($sql);
            $statement->execute($update_asset);
        }

    
        catch(PDOException $error)
        {

            echo $sql . "<br>" . $error->getMessage();
        }
    }

?>


Wellicht ziet iemand hier het gelijk?
Edit:
Ik heb code-tags geplaatst. Gelieve dit in het vervolg zelf toe te voegen aan je bericht.
Zie ook: Veel gestelde vragen: Welke UBB-codes kan ik gebruiken.
Gewijzigd op 04/02/2018 22:13:14 door - Ariën -
 
PHP hulp

PHP hulp

26/11/2024 16:45:07
 
- Ariën  -
Beheerder

- Ariën -

04/02/2018 22:17:34
Quote Anchor link
Je SET specificatie in je query klopt niet. Je moet per veld de juiste waarde invoeren, en dat gebeurt niet in je query.
 
Ben van Velzen

Ben van Velzen

04/02/2018 22:23:55
Quote Anchor link
Daarbij, waarom probeer je prepared statements te gebruiken als je toch je data rechtstreeks in je query parkeert? Ja, de query is onveilig en daar gaan prepared statements in jouw geval niets aan veranderen.
 
Thomas van den Heuvel

Thomas van den Heuvel

04/02/2018 22:26:36
Quote Anchor link
Wait, what.

Een prepared statement + een sprintf + een $variabele in een SQL-statement?

Wow. Just wow. Dat is een heleboel dingen gecombineerd op een niet-juiste wijze :p.

Dump $sql eens naar je scherm, dan zie je inderdaad dat de syntax (vorm) van je SQL niet klopt.

Je doet er verstandiger aan om je query op een andere manier op te bouwen. Bijvoorbeeld met een soort van whitelist van velden die geupdate mogen worden + een for-loop.

Maar zelfs dan, waar is de validatie van deze gegevens?
 
Ronald Koopmans

Ronald Koopmans

04/02/2018 22:36:32
Quote Anchor link
Hmmz heb het omgebouwd van in een invoer, ik denk dat ik te lang uit de PHP ben.

Ik zou het graag op de juiste wijze doen, het systeem is in de eerste instantie bedoeld voor intern gebruik maar moet later wel vanaf extern benaderbaar worden (moet dus veilig en goed opgebouwd worden).

Misschien iemand die voor mij alles even zou willen bekijken en mij even de juiste weg kan laten zien?
Is nog maar een heel basic invoer/uitvoer database systeempje hoor...
 
- Ariën  -
Beheerder

- Ariën -

04/02/2018 22:38:12
Quote Anchor link
Kijk eens naar deze voorbeelden ter opheldering:
http://php.net/manual/en/pdo.prepared-statements.php
 
Ronald Koopmans

Ronald Koopmans

05/02/2018 11:18:07
Quote Anchor link
Thomas van den Heuvel op 04/02/2018 22:26:36:
Je doet er verstandiger aan om je query op een andere manier op te bouwen. Bijvoorbeeld met een soort van whitelist van velden die geupdate mogen worden + een for-loop.

Maar zelfs dan, waar is de validatie van deze gegevens?


Zou je mij kunnen laten zien hoe jij hem zou maken? Alle waarden mogen geupdate worden.
Wat zouden er aan aan de gegevens gevalideerd moeten worden?
 
Thomas van den Heuvel

Thomas van den Heuvel

05/02/2018 15:38:13
Quote Anchor link
Ik zou dit zo niet maken, ik zou in eerste instantie geen PDO gebruiken, maar het zou er dan bijvoorbeeld als volgt uitzien:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
<?php
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    try {
        $whitelist = array(
            'regnumber',
            'device',
            'brand',
            'model',
            'type',
            'snnumber',
            'pnnumber',
            'specification',
            'status',
        );

        if (array_key_exists('id', $_POST) === false) {
            throw new Exception('id not present in POST');
        }


        // build SQL string
        $sql = 'UPDATE assets SET ';
        $first = true;
        $values = array();
        foreach ($whitelist as $key) {
            if (array_key_exists($key, $_POST) === false) {
                throw new Exception('key '.$key.' not present in POST');
            }

            if ($first) {
                $first = false;
            }
else {
                $sql .= ', ';
            }

            $sql .= '`'.$key.'` = ?';
            $values[] = $_POST[$key];
        }
// foreach
        $sql .= ' WHERE id = ?';
        $values[] = $_POST['id'];

        $st = $con->prepare($sql);

        // debug hier $sql en $values
        // ...


        $st->execute($values);
    }
catch(Exception $e) {
        echo $e->getMessage();
    }
}

?>

Ik kon dit verder niet testen, maar de strekking zou duidelijk moeten zijn. Dit is wel een vreselijk omslachtige manier om een query op te bouwen. Maar je zou dit als een soort van sjabloon kunnen gebruiken voor UPDATE queries, als je dat zou willen...

Quote:
Wat zouden er aan aan de gegevens gevalideerd moeten worden?

Nou het id zou numeriek moeten zijn en het record zou moeten bestaan, ook zouden regnumber, device, brand, model, type etc. ook moeten voldoen aan bepaalde formats lijkt mij zo - komen deze uit dropdownlijsten? Als je een formuliersysteem hebt dan zou je de toegestane waarden zowel kunnen gebruiken om je formulier te populeren maar ook om na de submit deze informatie nogmaals te valideren.
 
Ronald Koopmans

Ronald Koopmans

05/02/2018 21:33:29
Quote Anchor link
Thomas van den Heuvel op 05/02/2018 15:38:13:

Quote:
Wat zouden er aan aan de gegevens gevalideerd moeten worden?

Nou het id zou numeriek moeten zijn en het record zou moeten bestaan, ook zouden regnumber, device, brand, model, type etc. ook moeten voldoen aan bepaalde formats lijkt mij zo - komen deze uit dropdownlijsten? Als je een formuliersysteem hebt dan zou je de toegestane waarden zowel kunnen gebruiken om je formulier te populeren maar ook om na de submit deze informatie nogmaals te valideren.


Thanks, heel verschil maar hier zie ik meer duidelijkheid in dan wat ik had.

Heb net even bekeken maar krijg het niet werkende, na het versturen krijg ik alleen een blanco pagina.

Naar mijn gevoel maakt het gebruik van PDO het uiteindelijk aan maar moeilijker...

Morgen maar eens weer kijken :-)
 
- Ariën  -
Beheerder

- Ariën -

05/02/2018 21:51:00
Quote Anchor link
Met Thomas zijn code krijg je geen melding als het gelukt is. Je zult het zelf moeten integreren in je eigen code en daar op aansluiten.
 
Ronald Koopmans

Ronald Koopmans

05/02/2018 21:59:20
Quote Anchor link
- Ariën - op 05/02/2018 21:51:00:
Met Thomas zijn code krijg je geen melding als het gelukt is. Je zult het zelf moeten integreren in je eigen code en daar op aansluiten.


Klopt maar de er wordt ook niks gewijzigd in het het database.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
<?php
    include "template/header.php";
    require "../config.php";
    require "../common.php";
    
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    try {
       $whitelist = array(
            'regnumber',
            'device',
            'brand',
            'model',
            'type',
            'snnumber',
            'pnnumber',
            'specification',
            'status'
        );
        if (array_key_exists('id', $_POST) === false) {
            throw new Exception('id not present in POST');
        }


        // build SQL string
        $sql = 'UPDATE assets SET ';
        $first = true;
        $values = array();
        foreach ($whitelist as $key) {
            if (array_key_exists($key, $_POST) === false) {
                throw new Exception('key '.$key.' not present in POST');
            }

            if ($first) {
                $first = false;
            }
else {
                $sql .= ', ';
            }

            $sql .= '`'.$key.'` = ?';
            $values[] = $_POST[$key];
        }
// foreach
        $sql .= ' WHERE id = ?';
        $values[] = $_POST['id'];

        $st = $con->prepare($sql);

        // debug hier $sql en $values
        // ...


        $st->execute($values);
    }
catch(Exception $e) {
        echo $e->getMessage();
    }
}

//Nog aanpassen...
/*    if (isset($_POST['update']) && $statement) {
?>
    <blockquote><?php echo escape($_POST['device']); ?> successfully changed.</blockquote>
<?php
    }
*/
    
    $id = $_GET['id'];
    $sql = "SELECT * FROM assets WHERE id=$id";
    $query = $conn->prepare($sql);
    $query->execute(array(':id' => $id));
    $row = $query->fetch(PDO::FETCH_ASSOC);
?>


<h2>Edit a device</h2>
<form method="post">
    <label for="regnumber">Registration</label>
    <input type="text" name="regnumber" value="<?php echo $row['regnumber'];?>">
    <label for="device">Device</label>
    <input type="text" name="device" value="<?php echo $row['device'];?>">
    <label for="brand">Brand</label>
    <input type="text" name="brand" value="<?php echo $row['brand'];?>">
    <label for="model">Model</label>
    <input type="text" name="model" value="<?php echo $row['model'];?>">
    <label for="type">Type</label>
    <input type="text" name="type" value="<?php echo $row['type'];?>">
    <label for="snnumber">S/N</label>
    <input type="text" name="snnumber" value="<?php echo $row['snnumber'];?>">
    <label for="pnnumber">P/N</label>
    <input type="text" name="pnnumber" value="<?php echo $row['pnnumber'];?>">
    <label for="specification">Specification</label>
    <textarea rows="4" cols="50" name="specification"><?php echo $row['specification'];?></textarea>
    <label for="status">Status</label>
    <input type="text" name="status" value="<?php echo $row['status'];?>">
    <input type="hidden" name="id" value=<?php echo $_GET['id'];?>><br />
    <br />
    <input type="submit" name="update" value="Update">
    <br />
    <br />
</form>
<?php
    include "template/footer.php";
?>


config.php
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
<?php
$host
    = "127.0.0.1";
$port    = "3307";
$user    = "*****";
$pass    = "*****";
$dbname    = "*****";
$dsn    = "mysql:host=$host;port=$port;dbname=$dbname";
$option    = array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION);
$conn    = new PDO($dsn, $user, $pass, $option);
?>



Toevoeging op 05/02/2018 22:02:47:

Ik zie hem al...

$st = $con->prepare($sql);

staat con ipv conn....

Had alles al na gelopen maar deze zie ik net pas bij het plaatsen van reactie...
werkt nu wel..
 
- Ariën  -
Beheerder

- Ariën -

05/02/2018 22:03:52
Quote Anchor link
Een kwestie van debuggen voor wat lijn 44 zegt ;-)
 
Frank Nietbelangrijk

Frank Nietbelangrijk

06/02/2018 09:11:16
Quote Anchor link
Daar zou je een foutmelding over moeten krijgen. Zou je de foutmeldingen niet eens aanzetten?
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.