SQLSTATE[42000]: Syntax error or access violation: 1064 bla bla bla
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)
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
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();
}
}
?>
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.
Zie ook: Veel gestelde vragen: Welke UBB-codes kan ik gebruiken.
Gewijzigd op 04/02/2018 22:13:14 door - Ariën -
Je SET specificatie in je query klopt niet. Je moet per veld de juiste waarde invoeren, en dat gebeurt niet in je query.
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.
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?
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...
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?
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?
Code (php)
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
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();
}
}
?>
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.
Thomas van den Heuvel op 05/02/2018 15:38:13:
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.
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 :-)
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.
- 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)
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
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";
?>
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)
1
2
3
4
5
6
7
8
9
10
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);
?>
$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..
Een kwestie van debuggen voor wat lijn 44 zegt ;-)
Daar zou je een foutmelding over moeten krijgen. Zou je de foutmeldingen niet eens aanzetten?