Сделките в MySQL 2

1. Отчет за проблема

За днешния урок, аз подготвени точно такова HTML страница:

Сделките в MySQL 2

Сделките в MySQL 2

Рамковата YII2. Бързото развитие на съвременни PHP рамки

Изследване на съвременните рамкови уеб програмиране тънкостите използващи YII2

Както можете да видите - това е само една страница на онлайн магазин. Именно страница излагане на стоки от каталога - централно звено, и коша, който вече съдържа няколко продукта.

В действителност - това е статична страница, и разбира се, че механизмът на добавяне продукти в кошницата не работи, тъй като темата на урока е различен. Въпреки това, три продукта, които се показват в една кошница - записват в сесията и ако кликнете върху линка "Поръчка", ще бъдат издадени по реда за покупка на тези стоки. Само един пример за поръчване на стоки за вас, ще видим ползите от използването на сделката с базата данни. Но преди това, нека погледнем как в зоната на изпитване.

Така че, цялото съдържание на сайта тест се съдържат в базата данни, а именно в таблицата за списание. Също така, базата данни съдържа три маси - otpravleno, user_cash, zakazi.

Таблица otpravleno - използва се за платена и като че ли се изпращат поръчки (отново виртуални), user_cash маса - магазини потребителското виртуални пари, колкото ако нашия сайт са виртуални пари в брой, които могат да бъдат платени за стоките (това е необходимо, просто като пример), и накрая, маса zakazi -всички да поръчате онлайн.
Това означава, че процеса на поръчка е намален до последователното прилагане на няколко SQL заявки към базата данни: добавяне на zakazi маса - за поръчване обработват данни, теглене на средства от страна на потребителя за закупените стоки (т.е. промяната на данните в user_cash маса), добавянето на една маса на данни otpravleno за платен за стоките, и най-накрая променя броя на продукти на склад (т.е. намаляване на броя на продуктите в таблицата за списание, че са закупени).
Разбира се, в един истински магазин такива искания не са изпълнени, но за този урок, един пример ще бъде точно на време.
Сега нека да вземем един кратък преглед на изходния код на сайта.

Така че, на базата на логиката на сайта - functions.php файл, който описва всички необходими функции за работа на сайта.

Накратко за двете функции:

connect_db - функция, която се свързва с базата данни.

get_goods - функция, която придобива, от база данни на данни за продукта и го връща като масив.

get_cart - функция, която съхранява първите три сесии на стоките от базата данни (само като пример, това ще бъде, когато в процеса на плащане).

zakaz - Поръчка на функция. Тази функция последователно изпълнява заявки към базата данни, към която е посочено по-горе данни.

Също така част от изходния код са cart.php index.php и файлове, но кода си, аз няма да дам сега, защото това е много проста. Тези файлове могат да бъдат намерени в изходния код на този урок.

От всички по-горе трябва да бъде - за това ще направи поръчка, която ще трябва да се извърши без грешки SQL заявки в zakaz функция. Но представете си следната ситуация: например потребителят е избрал продукти за покупка, като кликнете върху Checkout и започва да изпълнява zakaz функция, която се изпълнява на първата заявка - запазите данните от поръчката, а след втората - отписване на средства от сметката на потребителя (промяна на данните в таблицата, user_cash), но грешката се появява, когато ви свършат третото искане. Ами ако това се оказва - издал заповед, парите, изтеглени от акаунта на потребителя, но стоките не са били прехвърлени на изпращането. Съгласен съм доста неприятна ситуация. Така че нека да се намери решение на този проблем.

2. Какво е сделка?

Транзакция - е поредица от различни SQL заявки, които се изпълняват като цяло, а не да бъдат прекъснати от други клиенти. Това е, когато заявките са извършени транзакции, достъп до записи никой не може да получи.

Ние можем да благодарим на сделките, че да се създаде група от заявки, които са гарантирани за да бъде изпълнена без грешка. Ако по време на изпълнението на дадена сделка не се осъществи или възникне грешка, резултатите от всички заявки до мястото на произход на грешката се отменя. По този начин, за състоянието на базата данни се връща на оригинала - до искания за осъществяване на сделката.

Например, ако трябва да се изпълнява ред 100 SQL заявки и вие сте в същото време с помощта на сделката, а след това, ако в хода на тези искания на поне един от тях е неуспешен, или изобщо не се изпълнява - състояние на базата данни ще се върне в първоначалното си състояние - по време на изпълнението на тези искания. Едва след успешното приключване на последната 100на искане всички промени да влязат в сила.

Същността на сделката е това, което е забранено по заявка потвърждение по подразбиране, което е, след като базата данни на заявката ще чака специално съобщение за потвърждаване на успешното изпълнение на искането - съобщението се ангажират. След като се получи това съобщение - влизат в сила промените. Ако се изпрати съобщение до намаление на цените на база данни - ще се откажете от всички промени (анулиране) в базата данни в началото на сделката.

Сделки, извършени чрез поддържане на регистър на всички промени, направени в базата данни, когато действието на всяка сделка. Когато се връщам на промените, базата данни се отнася до списанието и отменя всички искания, отправени към текущата сделката.

3. Прилагане на сделката за тест скрипт

Така че, за това ще започне да работи с транзакции, първото нещо, което искате да отмените автоматичното потвърждение изпълни SQL заявки към базата данни. За да направите това, използвайте функцията:

Искам да отбележа, че за да работи с базата данни да използвам езика на MySQLi разширение на PHP като MySQL модул вече е значително по-остарели, и не съдържа, функции за работа с транзакции. Една важна забележка: да се работи със сделката трябва да използва InnoDB таблици в типа на данните, типа на MyISAM - сделката не се поддържа.

Освен това, след всяка заявка трябва да се провери - ако е успешно изпълнена заявката, ако има грешка, а след това незабавно да се изпрати съобщение до база данни намаление на цените на всички промени. За да направите това, използвайте функцията:

Ако сте сигурни, че всички искания са завършили успешно - така че можете да изпратите съобщение ангажират - потвърждение на сделката:

Сега нека да промените функцията zakaz такъв начин, че изпращането и изпълнението на заявките, извършвани чрез сделки.

Както можете да видите, ние носим всички неща, които споменах по-горе, това е, деактивира автоматичното ангажира се изпълняват заявки (mysqli_autocommit ($ DB, FALSE)), а след това, след като за всяка заявка, проверява за грешки, ако има грешки веднага хвърля обратно всички промени (mysqli_rollback ( $ db)). Важно е също така да изпълняват функциите си, в този случай, просто връщане (връщане), защото ако тя е подадена с грешка, че няма смисъл да се продължи изпълнението на код zakaz функция. Ако всички молби са успешни, ние потвърждаваме сделката (mysqli_commit ($ db);).

Преди да се провери, предлагам zakaz функция е описано по друг начин, а именно, да се използва блок пробвам улов за тестване на заявката. Позволете ми да ви напомня, че блоковете се опитват улов - прилагане на механизма за обработка на изключения в PHP.

Виж всички от код цикъл можем да заключим, в опитам блок, и всеки блок, ако (вие) и аз се генерира изключение. Това означава, че когато бъдат изпълнени, най-малко една единица, ако, след като изключение се изхвърля, а сценарият ще бъде пренасочена незабавно към блока за улов, който на свой ред, и се връщам всички промени. Ако всичко върви добре, и ако никой от блоковете не се изпълняват, така че просто трябва да се потвърди сделка, ние всъщност правим.

Сега нека умишлено е направил грешка в едно от исканията и изпълнение на скрипта. Както можете да видите, ако проверявате дадена грешка се появява, след което веднага е налице намаление на цените на всички промени и да се възстанови базата данни в първоначалното му състояние. Това е всичко, работи успешно. Така че, ако трябва да извършите някои много важни въпроси, бази данни, винаги използвайте сделката да се избегнат неприятните последици от допускане на грешки.

С това стигам до извода, този урок, всичко, което добро и ще се видим в следващите уроци.

Най-IT новини и уеб разработки на нашия канал Телеграма