Breid SQL transactie uit
Voor data te updaten in de database heb ik eerst informatie nodig die al in de database zit.
Ik wil dit in een transactie stoppen.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
<?php
//De id en new_data word aangeleverd door een AJAX call.
$id = $_POST['id'];
$newdata = $_POST['new_data'];
$mysqli->begin_transaction();
$mysqli->query("UPDATE details SET manage='true' WHERE id=$id'");
$mysqli->query("UPDATE details SET manage_value='$newdata' WHERE id=$id");
$mysqli->commit();
$mysqli->close();
?>
//De id en new_data word aangeleverd door een AJAX call.
$id = $_POST['id'];
$newdata = $_POST['new_data'];
$mysqli->begin_transaction();
$mysqli->query("UPDATE details SET manage='true' WHERE id=$id'");
$mysqli->query("UPDATE details SET manage_value='$newdata' WHERE id=$id");
$mysqli->commit();
$mysqli->close();
?>
In de tabel details kolom color kunnen de waardes red, yellow of blue staan en die waarde wil ik hebben voor het updaten van de data.
Deze waarde wil ik in een statement kunnen gebruiken alvorens de update.
Dus het plaatje zou moeten worden
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
//De id en new_data word aangeleverd door een AJAX call.
$id = $_POST['id'];
$newdata = $_POST['new_data'];
$mysqli->begin_transaction();
//SELECT color FROM details...
//result van bovenstaand
//if(color == 'blue'){$color = blue;}elseif(color == 'red'){$color = red;}else{$color = yellow;}
$mysqli->query("UPDATE details SET manage='true' WHERE id=$id'");
$mysqli->query("UPDATE details SET manage_value='$newdata' WHERE id=$id");
$mysqli->query("UPDATE details SET team='$color' WHERE id=$id");
$mysqli->commit();
$mysqli->close();
?>
//De id en new_data word aangeleverd door een AJAX call.
$id = $_POST['id'];
$newdata = $_POST['new_data'];
$mysqli->begin_transaction();
//SELECT color FROM details...
//result van bovenstaand
//if(color == 'blue'){$color = blue;}elseif(color == 'red'){$color = red;}else{$color = yellow;}
$mysqli->query("UPDATE details SET manage='true' WHERE id=$id'");
$mysqli->query("UPDATE details SET manage_value='$newdata' WHERE id=$id");
$mysqli->query("UPDATE details SET team='$color' WHERE id=$id");
$mysqli->commit();
$mysqli->close();
?>
Kan het bovenstaande zoals ik wil in een transactie plaatsvinden?
Gewijzigd op 10/06/2020 22:08:06 door Stefan Janssen
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
//De id en new_data word aangeleverd door een AJAX call.
$id = $_POST['id'];
$newdata = $_POST['new_data'];
$mysqli->begin_transaction();
//DEZE LIJN HEB IK NOG TOEGEVOEGD maar dan?
$mysqli->query("SELECT color FROM details WHERE id=$id FOR UPDATE");
//if(color == 'blue'){$color = blue;}elseif(color == 'red'){$color = red;}else{$color = yellow;}
$mysqli->query("UPDATE details SET manage='true' WHERE id=$id'");
$mysqli->query("UPDATE details SET manage_value='$newdata' WHERE id=$id");
$mysqli->query("UPDATE details SET team='$color' WHERE id=$id");
$mysqli->commit();
$mysqli->close();
?>
//De id en new_data word aangeleverd door een AJAX call.
$id = $_POST['id'];
$newdata = $_POST['new_data'];
$mysqli->begin_transaction();
//DEZE LIJN HEB IK NOG TOEGEVOEGD maar dan?
$mysqli->query("SELECT color FROM details WHERE id=$id FOR UPDATE");
//if(color == 'blue'){$color = blue;}elseif(color == 'red'){$color = red;}else{$color = yellow;}
$mysqli->query("UPDATE details SET manage='true' WHERE id=$id'");
$mysqli->query("UPDATE details SET manage_value='$newdata' WHERE id=$id");
$mysqli->query("UPDATE details SET team='$color' WHERE id=$id");
$mysqli->commit();
$mysqli->close();
?>
Wat is er mis met:
FOR UPDATE zorgt voor een lock op een record.
Ik zou de DATA-delen wel escapen, ook weet ik niet of een textuele waarde "true" nou zoveel doet, waarom geen 0 of 1?
Om transacties te kunnen gebruiken heb je wel de InnoDB database engine nodig, ik ga er vanuit dat je deze gebruikt?
Waar loop je nu nog op vast? Lees anders het volgende verhaal eens.
Ik heb even gekeken naar het type database en dat is MyISAM
Dan zal ik dus gebruik moeten maken losse queries?
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
$get_color = "SELECT color FROM details WHERE is=$id";
$result = mysqli_query($connection, $get_color);
while($row = mysqli_fetch_assoc($result)){
$color = $row['color'];
}
$update_manage = "UPDATE details SET manage='true' WHERE id=$id";
mysqli_query($connection, $update_manage);
$update_manage_value = "UPDATE details SET manage_value='$newdata' WHERE id=$id";
mysqli_query($connection, $update_manage_value);
if($color == 'blue'){
$color_number = 1;
}elseif($color == 'yellow'){
$color_number = 2;
}else{
$color_number = 3;
}
$add_team "INSERT INTO (id, team) VALUES ($id, $color_number)";
mysqli_query($connection, $add_team);
?>
$get_color = "SELECT color FROM details WHERE is=$id";
$result = mysqli_query($connection, $get_color);
while($row = mysqli_fetch_assoc($result)){
$color = $row['color'];
}
$update_manage = "UPDATE details SET manage='true' WHERE id=$id";
mysqli_query($connection, $update_manage);
$update_manage_value = "UPDATE details SET manage_value='$newdata' WHERE id=$id";
mysqli_query($connection, $update_manage_value);
if($color == 'blue'){
$color_number = 1;
}elseif($color == 'yellow'){
$color_number = 2;
}else{
$color_number = 3;
}
$add_team "INSERT INTO (id, team) VALUES ($id, $color_number)";
mysqli_query($connection, $add_team);
?>
Waarom pas je die niet aan naar InnoDB?
De bovenstaande UPDATEs kun je echter al als enkele UPDATE-query opstellen zoals ik in mijn voorbeeld aangaf. Een enkele query is in principe al atomair (ondeelbaar) dus daar heb je niet altijd een transactie voor nodig.