Uppgift 01

Här är hur min databas ska se ut för min kombination av inloggningssystemet och bankapplikationen:

ER-diagram:

Databasmodell:

Först och främst skapade jag en user. user har en userId, ett username, passwordHash och passwordSalt. username har en unique constraint till sig, vilket är till för att förhindra att flera användare har samma användarnamn. passwordHash och passwordSalt använder char istället för varchar, eftersom de alltid har samma längd, vilket är någorlunda bättre för databasen. Den är ansluten med en 1:N relation till userAccount, vilket är en tabell som sköter de bankkonton som varje användare kan ha. userAccount har ett accountId som PK, ett userId som FK, name samt två flaggor med namnen isMainAccount och isActive, som avgör ifall det är huvudkontot respeketive om kontot är aktivt.

userAccount är anslutet med två stycken 1:N relationer till tabellen transaction, som innehåller senderAccountId och recipientAccountId – två stycken FK. De är även nullable, vilket sker när exempelvis en användare sätter in pengar, då det inte finns ett kontoId för sändaren. Utöver det har transaction sin PK, amount, date samt en transactionTypeId, vilket är i N:1 relation med transactionType, en tabell som lagrar vilken slags transaktion det var, samt ett name(unique) och text som ska visas. Detta beslutet gjordes för att förhindra att man lagrar ”Transkation” om och om igen. Nu lagrar man en transactionType med en slags sträng-id(exempelvis ”transaction”) och en text ”Transaktion”. Jag gjorde en int som PK och inte name eftersom det är någorlunda snabbare att söka en databas efter integer PK än varchar.

Uppgift 02

Databasdump:

-- phpMyAdmin SQL Dump
-- version 5.2.2
-- https://www.phpmyadmin.net/
--
-- Host: localhost:3306
-- Generation Time: Nov 16, 2025 at 07:20 PM
-- Server version: 11.4.8-MariaDB-cll-lve
-- PHP Version: 8.3.27

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
START TRANSACTION;
SET time_zone = "+00:00";


/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8mb4 */;

--
-- Database: `als070804sn_bank`
--

-- --------------------------------------------------------

--
-- Table structure for table `transaction`
--

CREATE TABLE `transaction` (
  `transactionId` int(11) NOT NULL,
  `senderAccountId` int(11) NOT NULL,
  `recipientAccountId` int(11) NOT NULL,
  `transactionTypeId` int(11) NOT NULL,
  `amount` int(11) NOT NULL,
  `date` timestamp NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

--
-- Dumping data for table `transaction`
--

INSERT INTO `transaction` (`transactionId`, `senderAccountId`, `recipientAccountId`, `transactionTypeId`, `amount`, `date`) VALUES
(1, 1, 2, 1, 100, '2025-11-13 09:14:11'),
(2, 1, 2, 1, 300, '2025-11-13 09:17:11'),
(3, 3, 2, 1, 500, '2025-11-13 09:23:55'),
(4, 2, 1, 1, 10000, '2025-11-13 09:24:45'),
(5, 1, 2, 1, 500, '2025-11-13 09:46:20'),
(6, 1, 2, 1, 200, '2025-11-13 09:46:55'),
(7, 1, 2, 1, 200, '2025-11-13 09:47:26'),
(8, 1, 2, 2, 200, '2025-11-13 09:47:51');

-- --------------------------------------------------------

--
-- Table structure for table `transactionType`
--

CREATE TABLE `transactionType` (
  `transactionTypeId` int(11) NOT NULL,
  `name` varchar(32) NOT NULL,
  `text` varchar(64) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

--
-- Dumping data for table `transactionType`
--

INSERT INTO `transactionType` (`transactionTypeId`, `name`, `text`) VALUES
(1, 'transaction', 'Överföring'),
(2, 'withdrawal', 'Uttag');

-- --------------------------------------------------------

--
-- Table structure for table `user`
--

CREATE TABLE `user` (
  `userId` int(11) NOT NULL,
  `username` varchar(20) NOT NULL,
  `passwordHash` char(64) NOT NULL,
  `passwordSalt` char(32) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

--
-- Dumping data for table `user`
--

INSERT INTO `user` (`userId`, `username`, `passwordHash`, `passwordSalt`) VALUES
(1, 'alex_jones', 'f559b433e67d2d4a31998f9207c9968c833f594036015b89163bf99488c91aae', 'ee34b214e72e486b8263dfad3e956a35'),
(2, 'maria.lopez', '59b6dbf564274a000e3e16e0443be09eae73fb251feb5dc3f8f1c72d87d4d73e', '3269f31e15de439a9e49f28a27628bdd'),
(3, 'daniel_smith', '1de8a03d8877f3d944ee373126d8919be97904173c3f60043321b38396ba8c21', '2d89a4e81e664cee90cec5a511520654'),
(4, 'emily_chen', '39c2931547cc3fcf03691af2924bcc13256f68988114a92ff7b77383a5c4b63a', '13368580f53e4977ac2466e1b9c0f702'),
(5, 'james_walker', 'e57690554c507476d12dd74710d4f1728584b3ba9f8a2d9dfd209e57817810b2', 'b39b4db95faf414ca3bc6e62c5e4c846'),
(6, 'olivia_brown', 'a0b45d70dbfb88eb9acf7a3f26e8d1df128db07508042fb077cda926725c030a', '6abc27c0163d4ec7a1db46cf8c9c55ad'),
(7, 'ryan_kim', '5eb78102838fb544543a33f4b72066a38fdcab7ed05f98e60c8758e9af73fb9e', '591a22093e2648b5ab2ac64e460fb87e'),
(8, 'sophia_garcia', '139d262b180c7ed12730f5834e12b9e7f6d18d146417cac462ab9fad25b57bcf', 'a2480538877c4563ab864d2ed0c99d8a'),
(9, 'michael_adams', '2f1149a1975bf4cb6764780b547a4d29af4b6ce739680ce9b4dd232de5eac995', '500cfbcba7d941449c65052223a4ca82'),
(10, 'isabella_lee', '1ae8e44415a9bed521fcb5295f1f8fa576714bb495125e9a5af0ba5dec10169c', '9c59d53f5e6146f4a8e28c4b4256500b'),
(11, 'ethan_clark', 'b5b36695fdc4f6c6d81aff721663bb72dc85e111150ee33b9eab0724bec6e523', 'b0314ada861642de8a2f7ae3b16e20eb'),
(12, 'ava_rodriguez', 'ee2590aadfdf98ac7b17fcb8b904d3a31a0ab1f8295d5096382184648ca224ee', '41d25d63cfe241d8a02392c02a3a0893'),
(13, 'liam_nguyen', '2e97522ba2aa7481ddc1be68241ad0451d73ea1fd135d02b3b1895c4af1ee7ef', '61b59cf9c76b468b8bb729d3b0edbf32'),
(14, 'mia_johnson', '6e5e81529487cb1c592074c58d61fea9bc3e2d230b7893261d7a109914cc4df4', 'cf04c8772732469e906b74b09d087510'),
(15, 'noah_patel', 'b137711b947b3d0bb2e3a75e3777782ac459e345e2357ec7729b7506f309a396', '71439e1a1cdf41e98ceb52f339f7188d'),
(16, 'amelia_morris', 'eebd1bce03a172e4e804b50eb079b8390145c48a839d9af5f99a3438bc28ea96', '8497240fd351423b87e4d1b20db4de36'),
(17, 'lucas_cooper', '312310fa20f56db2a2f38fb12e4f0c574b0b4d3ea27c1d55d63c6d1afa42fcf3', 'c9dd93c61930471eb87518f253d14ec9'),
(18, 'charlotte_hill', 'a9d2b501ec51546448a7275d4a976dffeed16fe21cec0b2cf0f25bd64dfc1bed', '745039e373204ee680b5974787e11c13'),
(19, 'benjamin_davis', 'd6d8efa511d8e180693d4bba4966f8a39229412dddb80cae2d8d36822204a706', '724e39de7bfd4d48b5f2194b53003474'),
(20, 'ella_white', '104adfb7642880e49ce662aa8c844f6df272bb19e894ff437ac19174054cbce6', '76a5094e573d407286ff383ea3484b2d'),
(21, 'jack_taylor', '8c1e19d3a2b0bcdfff946bb5207834e33725820b4c43b60e42ff19cca5e93711', '5914f49171194607838149d40e8cd73b'),
(22, 'harper_allen', 'fa78f1c5214f6c4c9e36bc5938409b1a831626082ff62bf596b81650f4eb34fc', '752df1871d594e93a90cf41bf04bb3d1'),
(23, 'william_moore', '795d76e81b21161e7ae0917f431d19038d52db802d253977e9972ae027bafad0', '152551442ed94a798bd4af6715c5de64'),
(24, 'evelyn_harris', 'b00273b16b87e4b83520a99a1b798e6d8aa2231bd8e4572ec55d929cd76b6f5a', '98d98886c16d418eb02d1c9802c45e58'),
(25, 'henry_thompson', '7e1f91ef02e5473a742f202524c0c0fc06c5640246448916d4136819347bce06', '2b47f8418ef3466eaf5628455de1dc06'),
(26, 'grace_martin', 'b76cc0a9f91ddf44fa9108fd4c2c9b70e8df75e606d070bf95f89c46902174c3', '1516f47a3be14e9d98879ad5ebc3c1ee'),
(27, 'samuel_james', '17187cd068b2785e6b8fb777f379a27135036d7428b023cd653d94eca5ebd3f7', '469d3ce0dd504ea49340ca01def75336'),
(28, 'lily_clark', '1df566a84e0138536566a3b44058f51c96002fa129d74fbf912a059af3c5c467', '06a2897389fc4661a890aad92c879f4d'),
(29, 'jacob_wilson', '2ab9201a8784ced5edc7f16f0afcdf00b8d372233d30646d8e6d31c3345f64db', '98c8299e35a34e00aa638943a772405e'),
(30, 'aria_evans', 'dec558060b216d5c4952ac2d47e629929fb580a04f56f2a4a9436a823a687ce1', 'd3d47b195a0840cd8d1847eb9e371077'),
(31, 'logan_turner', '131774538efcf4d969ca08b4db8e4de2dc03e2da15f1359bd22de010426e9d1d', 'e1dfceca9b504a92bdaafb197f3a36d8'),
(32, 'zoe_scott', 'e691b45de24d4dcf3b79ed68053c6b344c4fdb786fea3e0a6629db27a8a32669', '95ff56157f81437a9b3c6cb2baa7dc50'),
(33, 'sebastian_bell', '774985777ba4dff53a273a5d37364baf401506329c96797b6587fa4a5faa1fe5', 'b19e9d5b33024ca8906347e897d84e57'),
(34, 'nora_brooks', '9d0fd22a09ec2b26106e15e85754b870b1bd0c70945946b059c515a45f57bcb4', 'cd2fa60e79744673a26a16ecdde8bc60'),
(35, 'elijah_reed', '2e870f57e57b816bd9fe90b206bc383c055f380b1637306571e835f46c92a9ff', '9aeee94b39534461b1fbc2f6b1a16a60'),
(36, 'hannah_gray', '71c6c837d4972e8d5737abdd3b97972e82efe9b3e103f81620828d32bc0336df', 'c205284e82294798bc5be46a864a5cc3'),
(37, 'matthew_price', '56d5629f2ab1f198e47feb2449c27651916b98fdb46f7bdc32fea8fdb0ecd17d', 'e275caeb4cc644c8a0181b116748708b'),
(38, 'violet_wright', 'dc9f87bcb190a617c9100aa3ffcfaa647c915b48c9d457b7d13bd90335ae9bd9', 'd7c55fdc8b9a42a8b5cf78a056ca2bc7'),
(39, 'carter_bailey', '64bcc3c3805ff6b561a8ef7ec2388b48fbdaf85108e21a96fd75e94035746cc3', '769fa82b8f2740e6bb361a97c1bdac63'),
(40, 'ella_ross', '19f9d1a42915b29b0e8dadadf59e97dc281766ffc0a22d281e51ada3ef4e75d9', '7466417b4a64427ebfef9fb03765a9b8'),
(41, 'owen_parker', 'c450d3452a41945751bcdda63ffe026e170e72ea13e6bd3be937e34e0a1bdf3e', '95ae6a9eaa0f4f35880346cc90eaadfe'),
(42, 'stella_foster', '89fdb3e9777a6f69069f9f88999fdfb5407b32edd1a66db447da5b97671c39d6', '8e1f5004b94145f096421c743f7c3820'),
(43, 'jayden_wood', 'dd297ea33b9ae3ab00a1b6f143eee9399d4119ed2cfa7e2528f3687b3abdbf53', '7955fe65472d471e9e99225d19e90b0f'),
(44, 'lucy_hall', '927a12d07646a8c0d4ce8625c9213daa6284d590ee56151c9dde7872e99b1832', '39487a755fb74dd3bd4a26a8e60c96d4'),
(45, 'jackson_kelly', '475f059639172013d5c416baf7ebba399a4b0ff12c2262f9118ef8f06653f821', '118476915c7e47358f507fc30c709c9a'),
(46, 'hazel_reed', '134a81a2791853c8f11eb580497b4c5106c2722fb40ffef24dffe708bc9a564e', 'b5a99ccd44834083b714cf6e0df1c26d'),
(47, 'aiden_cook', '83bd9dd63e148e999e452db772f4422b6bc375a46cba47700534b93f96f9757f', 'f2e27da8043e46038e1723fea97554e6'),
(48, 'luna_richards', '8b501fc185fdaf79c5567e8823eb7b5be47515eb9d8cc2e71bb6a5d538fcbc0f', 'd748ffe1a3c84120945a865353e9b11c'),
(49, 'leo_howard', 'e588db33935162f75aa20a6034a93bf970910489eb1c0fc303bd426ba42f4827', 'e922643b01014ea695cf5b4e3eaba453'),
(50, 'chloe_bennett', 'af18e8a37df19b93d0615e56aedf01c64a37d66b4a70204b25794e6c367a50c1', '8a9985d6b8cd440a8cbd8c1faf331c04');
/*
Ohashade lösenord:
$users = array(
    'alex_jones' => 'BlueSky!82',
    'maria.lopez' => 'CoffeeBean#91',
    'daniel_smith' => 'RiverRun$37',
    'emily_chen' => 'MoonLight@14',
    'james_walker' => 'SunsetPath!56',
    'olivia_brown' => 'MintLeaf$92',
    'ryan_kim' => 'StormRider@75',
    'sophia_garcia' => 'RosePetal#48',
    'michael_adams' => 'CloudNine!67',
    'isabella_lee' => 'SilverWave$23',
    'ethan_clark' => 'BrightStar@19',
    'ava_rodriguez' => 'GoldenSun#73',
    'liam_nguyen' => 'OceanBreeze!41',
    'mia_johnson' => 'QuietNight$59',
    'noah_patel' => 'FireFly@32',
    'amelia_morris' => 'CherryTree#27',
    'lucas_cooper' => 'DreamCatcher!85',
    'charlotte_hill' => 'VelvetMoon$11',
    'benjamin_davis' => 'ForestPath@68',
    'ella_white' => 'RainDance#95',
    'jack_taylor' => 'CrystalLake!29',
    'harper_allen' => 'SoftWind$74',
    'william_moore' => 'MorningSky@26',
    'evelyn_harris' => 'WildRose#62',
    'henry_thompson' => 'SnowFall!34',
    'grace_martin' => 'SilverLeaf$57',
    'samuel_james' => 'FireStone@83',
    'lily_clark' => 'AmberGlow#49',
    'jacob_wilson' => 'WinterRain!21',
    'aria_evans' => 'GoldenBird$64',
    'logan_turner' => 'BlueRiver@38',
    'zoe_scott' => 'NightBloom#87',
    'sebastian_bell' => 'IronHeart!30',
    'nora_brooks' => 'CrystalHill$44',
    'elijah_reed' => 'FrostLight@53',
    'hannah_gray' => 'SilverRain#70',
    'matthew_price' => 'QuietStorm!46',
    'violet_wright' => 'OceanWave$77',
    'carter_bailey' => 'WildSky@55',
    'ella_ross' => 'GoldenLeaf#33',
    'owen_parker' => 'RainDrop!72',
    'stella_foster' => 'MorningStar$68',
    'jayden_wood' => 'FireMoon@47',
    'lucy_hall' => 'DreamLight#24',
    'jackson_kelly' => 'AmberSky!60',
    'hazel_reed' => 'QuietRiver$31',
    'aiden_cook' => 'CloudStep@79',
    'luna_richards' => 'VelvetStar#42',
    'leo_howard' => 'SilverMist!25',
    'chloe_bennett' => 'CrystalWave$58'
);
*/


-- --------------------------------------------------------

--
-- Table structure for table `userAccount`
--

CREATE TABLE `userAccount` (
  `accountId` int(11) NOT NULL,
  `userId` int(11) NOT NULL,
  `name` varchar(20) NOT NULL,
  `isMainAccount` int(11) NOT NULL DEFAULT 0,
  `isActive` int(11) NOT NULL DEFAULT 1
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

--
-- Dumping data for table `userAccount`
--

INSERT INTO `userAccount` (`accountId`, `userId`, `name`, `isMainAccount`, `isActive`) VALUES
(1, 1, 'AlexJonesBankkonto', 1, 1),
(2, 2, 'MariaLopezKonto', 1, 1),
(3, 1, 'AlexJonesKonto 2', 0, 1),
(4, 2, 'MLopezBank2', 0, 1);

-- --------------------------------------------------------

--
-- Stand-in structure for view `userAccountBalanceView`
-- (See below for the actual view)
--
CREATE TABLE `userAccountBalanceView` (
`accountId` int(11)
,`userId` int(11)
,`name` varchar(20)
,`isMainAccount` int(11)
,`isActive` int(11)
,`balance` decimal(41,0)
);

-- --------------------------------------------------------

--
-- Stand-in structure for view `userAccountTransactionView`
-- (See below for the actual view)
--
CREATE TABLE `userAccountTransactionView` (
`accountId` int(11)
,`otherAccountId` int(11)
,`amount` bigint(12)
);

--
-- Indexes for dumped tables
--

--
-- Indexes for table `transaction`
--
ALTER TABLE `transaction`
  ADD PRIMARY KEY (`transactionId`),
  ADD KEY `transaction_recipientAccount` (`recipientAccountId`),
  ADD KEY `transaction_senderAccount` (`senderAccountId`),
  ADD KEY `transaction_transactionType` (`transactionTypeId`);

--
-- Indexes for table `transactionType`
--
ALTER TABLE `transactionType`
  ADD PRIMARY KEY (`transactionTypeId`),
  ADD UNIQUE KEY `transactionType_name` (`name`);

--
-- Indexes for table `user`
--
ALTER TABLE `user`
  ADD PRIMARY KEY (`userId`),
  ADD UNIQUE KEY `user_username` (`username`);

--
-- Indexes for table `userAccount`
--
ALTER TABLE `userAccount`
  ADD PRIMARY KEY (`accountId`),
  ADD KEY `userAccount_user` (`userId`);

--
-- AUTO_INCREMENT for dumped tables
--

--
-- AUTO_INCREMENT for table `transaction`
--
ALTER TABLE `transaction`
  MODIFY `transactionId` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=9;

--
-- AUTO_INCREMENT for table `transactionType`
--
ALTER TABLE `transactionType`
  MODIFY `transactionTypeId` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=3;

--
-- AUTO_INCREMENT for table `user`
--
ALTER TABLE `user`
  MODIFY `userId` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=51;

--
-- AUTO_INCREMENT for table `userAccount`
--
ALTER TABLE `userAccount`
  MODIFY `accountId` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=5;

-- --------------------------------------------------------

--
-- Structure for view `userAccountBalanceView`
--
DROP TABLE IF EXISTS `userAccountBalanceView`;

CREATE ALGORITHM=UNDEFINED DEFINER=`als070804sn`@`localhost` SQL SECURITY DEFINER VIEW `userAccountBalanceView`  AS SELECT `a`.`accountId` AS `accountId`, `a`.`userId` AS `userId`, `a`.`name` AS `name`, `a`.`isMainAccount` AS `isMainAccount`, `a`.`isActive` AS `isActive`, ifnull(sum(`t`.`amount`),0) AS `balance` FROM (`userAccount` `a` left join `userAccountTransactionView` `t` on(`t`.`accountId` = `a`.`accountId`)) GROUP BY `a`.`accountId` ;

-- --------------------------------------------------------

--
-- Structure for view `userAccountTransactionView`
--
DROP TABLE IF EXISTS `userAccountTransactionView`;

CREATE ALGORITHM=UNDEFINED DEFINER=`als070804sn`@`localhost` SQL SECURITY DEFINER VIEW `userAccountTransactionView`  AS SELECT `a`.`accountId` AS `accountId`, CASE WHEN `t`.`recipientAccountId` = `a`.`accountId` THEN `t`.`senderAccountId` WHEN `t`.`senderAccountId` = `a`.`accountId` THEN `t`.`recipientAccountId` ELSE 0 END AS `otherAccountId`, CASE WHEN `t`.`recipientAccountId` = `a`.`accountId` THEN `t`.`amount` WHEN `t`.`senderAccountId` = `a`.`accountId` THEN -`t`.`amount` ELSE 0 END AS `amount` FROM (`userAccount` `a` join `transaction` `t` on(`t`.`senderAccountId` = `a`.`accountId` or `t`.`recipientAccountId` = `a`.`accountId`)) ;

--
-- Constraints for dumped tables
--

--
-- Constraints for table `transaction`
--
ALTER TABLE `transaction`
  ADD CONSTRAINT `transaction_recipientAccount` FOREIGN KEY (`recipientAccountId`) REFERENCES `userAccount` (`accountId`),
  ADD CONSTRAINT `transaction_senderAccount` FOREIGN KEY (`senderAccountId`) REFERENCES `userAccount` (`accountId`),
  ADD CONSTRAINT `transaction_transactionType` FOREIGN KEY (`transactionTypeId`) REFERENCES `transactionType` (`transactionTypeId`);

--
-- Constraints for table `userAccount`
--
ALTER TABLE `userAccount`
  ADD CONSTRAINT `userAccount_user` FOREIGN KEY (`userId`) REFERENCES `user` (`userId`);
COMMIT;

/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

SQL-satser:

-- Lista på SQL-satser som jag har tänkt använda i min bank.
-- Många satser använder PDO-parametrar, exempelvis :username


-- Lägg till användare
INSERT INTO user(username, passwordHash, passwordSalt) VALUES (:username, :passwordHash, :passwordSalt);

-- När man loggar in
-- Lösenordhashen och saltet hämtas, och jämförs med användarinmatningen på PHP-servern.
SELECT userId, passwordHash, passwordSalt FROM user WHERE username=:username;




--Skapade en vy för att visa ett specifikt bankkontos transaktioner, där amount-parametern är positiv för mottagande transkationer och negativ för utgående.
CREATE VIEW userAccountTransactionView AS
SELECT
t.transactionId,
t.transactionTypeId,
t.date,
tt.text transactionText,
CASE WHEN t.recipientAccountId = a.accountId THEN t.amount WHEN t.senderAccountId = a.accountId THEN - t.amount ELSE 0
END AS amount,
    a.*,
a2.accountId otherAccountId,
a2.userId otherUserId,
a2.name otherName,
a2.isMainAccount otherIsMainAccount,
a2.isActive otherIsActive
FROM
    userAccount a
INNER JOIN `transaction` t ON
    t.senderAccountId = a.accountId OR t.recipientAccountId = a.accountId
LEFT JOIN `transactionType` tt ON t.transactionTypeId = tt.transactionTypeId
LEFT JOIN userAccount a2 ON (CASE WHEN t.recipientAccountId = a.accountId THEN t.senderAccountId = a2.accountId WHEN t.senderAccountId = a.accountId THEN t.recipientAccountId = a2.accountId ELSE 0
END);


-- Skapade en vy för att visa kontons saldo.
CREATE VIEW userAccountBalanceView AS SELECT
    a.*,
    IFNULL(SUM(t.amount), 0) balance
FROM
    userAccount a
LEFT JOIN userAccountTransactionView t ON
    t.accountId = a.accountId
GROUP BY
    a.accountId;




-- Lägger till en ny transaktion mellan två konton.
-- Har en transactionType parameter, vilket är en sträng som automatiskt hittar motsvarande transactionTypeId.
INSERT INTO `transaction`(
    senderAccountId,
    recipientAccountId,
    transactionTypeId,
    amount,
    `date`
)
SELECT
    :senderAccountId,
    :recipientAccountId,
    tt.transactionTypeId,
    :amount,
    NOW() FROM transactionType tt WHERE tt.name=:transactionType;



-- Sats för att "ta bort"(låsa) ett bankkonto.
-- Dubbelkollar userId så slipper det göras i PHP, vilket hade kostat ett extra databasanrop.
UPDATE userAccount SET isActive=0 WHERE userId=:userId accountId=:accountId AND isMainAccount=0;

Nu är min databas redo för att användas med bankapplikationen. Jag har populerat databasen med 50 användare, som jag med hjälp av PHP hashade och sparade på databasen. Jag har även skapat en hel del satser och de mest märkvärdiga är mina två vyer för att se specifika kontons transaktioner samt saldo. Jag har använt mig av cases för att avgöra ifall transaktionen är inkommande eller utgående och på så vis göra mängden på transkationen negativ. För att senare summa ihop saldot har jag använt SUM-funktionen.

Dessa satser krävde en hel del prövning och har tagit lång tid att få fram, men som det ser ut just nu är de anpassade nog för min bank.

Inlämning

Länk till sida

Till slut blev jag färdig med banken, och det tog en hel del mer arbete än jag hade tänkt mig. Jag tänkte göra ett system som gjorde det enklare att interagera med databasen, men nu när jag tittar tillbaka på den är jag inte helt säker på om det verkligen är enklare. Om man tittar i database.php ser man min klass DatabaseTable. Poängen med den var att andra klasser, exempelvis User och Account enkelt ska kunna ärva den klassen och på så vis göra interaktionen med databasen enklare, och i början fungerade det bra. Man kunde ta en användares ID och skapa en ny user-instans med den och på så vis enkelt komma åt värderna.

Men gång på gång kom det utmaningar som jag behövde lösa. Vad händer när man ska lägga till en ny användare? Vad händer när man ska hämta en användare från användarnamn? Många av dessa löste jag genom att skriva egna SQL-satser i form av statiska funktioner för just den klassen, och även om det funkar är jag inte helt nöjd med det. Det allra svåraste var däremot att fixa relationer. Jag ville att man enkelt skulle kunna komma åt exempelvis en användares konton genom att enbart köra $user->accounts. I slutet lyckades jag med det, men då kände jag att koden var mer rörig än något annat.

Trots att min kod inte är helt perfekt tror jag fortfarande på principen. Nu för banken nödje jag mig med hur min kod såg ut, men om jag någon gång gör ett större projekt och jag lyckas få till det så att man enkelt kan komma åt relationer, skapa nya rader på databasen, osv. tror jag att hela projektet hade blivit mycket smidigare.

Utöver denna utmaning känner jag att uppgiften har flytit på bra. Eftersom jag redan innan hade klasser för User och Account så kunde jag lägga till extends DatabaseTable för klasserna, vilket gör dem till databastabeller. Därför krävdes det mycket lite arbete för att anpassa resten av koden till ändringen, eftersom det grundläggande sättet att använda klasserna förändrades ej.


Kommentarer

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *