Breid SQL transactie uit

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Stefan Janssen

Stefan Janssen

10/06/2020 20:36:37
Quote Anchor link
Goede avond,


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)
PHP script in nieuw venster Selecteer het PHP script
1
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();
?>


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)
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
<?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();
?>


Kan het bovenstaande zoals ik wil in een transactie plaatsvinden?
Gewijzigd op 10/06/2020 22:08:06 door Stefan Janssen
 
PHP hulp

PHP hulp

23/12/2024 10:30:19
 
Adoptive Solution

Adoptive Solution

10/06/2020 21:49:29
Quote Anchor link
Met de handige zoekfunktie op de interwebs, kwam ik o.a. deze uitleg met voorbeelden tegen.

https://dev.mysql.com/doc/refman/8.0/en/innodb-locking-reads.html
 
Stefan Janssen

Stefan Janssen

10/06/2020 22:18:43
Quote Anchor link
@Adoptive Solution, bedankt voor je reactie. Ik kom er nog niet helemaal uit :S.

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
<?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();
?>
 
Thomas van den Heuvel

Thomas van den Heuvel

10/06/2020 22:48:08
Quote Anchor link
Waarom niet 1 UPDATE query? :/

Wat is er mis met:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
UPDATE details SET
manage = '...',
manage_value = '...',
team = '...'
WHERE id = '...'


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.
 
Stefan Janssen

Stefan Janssen

10/06/2020 23:49:40
Quote Anchor link
Hoi Thomas,


Ik heb even gekeken naar het type database en dat is MyISAM
Dan zal ik dus gebruik moeten maken losse queries?

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
<?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);
?>
 
- Ariën  -
Beheerder

- Ariën -

11/06/2020 00:18:16
Quote Anchor link
Waarom pas je die niet aan naar InnoDB?
 
Thomas van den Heuvel

Thomas van den Heuvel

11/06/2020 00:25:47
Quote Anchor link
Indien je een echte relationele database wilt hebben voor (uitgebreide) administratieve systemen dan verdient InnoDB waarschijnlijk de voorkeur, maar dan moet je ook echt relaties tussen tabellen aanleggen anders hangt alles nog steeds als los zand aan elkaar een heeft het "relationele" deel geen meerwaarde.

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.
 



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.