How to cancel an order in php?
php method to implement order cancellation: first, when [order_status] is 1, it means that the customer has placed an order; then when it is 2, it means that the customer has paid; and finally when it is 0, it means that the order has been cancelled, using swoole's asynchronous millisecond timing device.
php method to cancel an order:
1. Business scenario: When a customer places an order at a specified time If there is no payment within the time limit, then we need to cancel the order. For example, a good way to deal with it is to use delayed cancellation. Here we use swoole
. Using swoole's asynchronous millisecond timer will not affect the current The operation of the program.
2. Description, when order_status
is 1, it means that the customer has placed an order, when it is 2, it means that the customer has paid, and when it is 0, it means that the order has been canceled (this is what swoole does). I don’t use a framework for the following representation. The relatively pure PHP representation is easy to understand and apply.
3. For example, in the inventory table csdn_product_stock, the inventory quantity of the product with product ID 1 is 20, and the inventory quantity with product ID 2 is 40, then when the customer places an order, product ID1 will be reduced by 10, and product ID2 will be reduced by 20, so the inventory table is only enough for 2 orders. In the example, the inventory will be automatically restored after 10 seconds, as shown below:
Illustration:
1. After placing the first order, the inventory of product ID1 was reduced from 20 to 10, and the inventory of product ID2 was reduced from 40 to 20;
2. After placing the second order, the inventory of product ID was 0. , the inventory of product ID2 is also 0;
3. When placing an order for the third time, the program prompts Out of stock;
4. After 10 seconds (each order is placed 10 seconds later), the customer placed orders twice. Since there was no payment (the order_status of the csdn_order table was 1), the inventory of product 1 and product 2 was restored (the order_status of the csdn_order table became 0), and the customer could continue. Placed an order
1. Required sql database table
DROP TABLE IF EXISTS `csdn_order`; CREATE TABLE `csdn_order` ( `order_id` int(10) unsigned NOT NULL AUTO_INCREMENT, `order_amount` float(10,2) unsigned NOT NULL DEFAULT '0.00', `user_name` varchar(64) CHARACTER SET latin1 NOT NULL DEFAULT '', `order_status` tinyint(2) unsigned NOT NULL DEFAULT '0', `date_created` datetime NOT NULL, PRIMARY KEY (`order_id`) ) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8; DROP TABLE IF EXISTS `csdn_order_detail`; CREATE TABLE `csdn_order_detail` ( `detail_id` int(10) unsigned NOT NULL AUTO_INCREMENT, `order_id` int(10) unsigned NOT NULL, `product_id` int(10) NOT NULL, `product_price` float(10,2) NOT NULL, `product_number` smallint(4) unsigned NOT NULL DEFAULT '0', `date_created` datetime NOT NULL, PRIMARY KEY (`detail_id`), KEY `idx_order_id` (`order_id`) ) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8; DROP TABLE IF EXISTS `csdn_product_stock`; CREATE TABLE `csdn_product_stock` ( `auto_id` int(10) unsigned NOT NULL AUTO_INCREMENT, `product_id` int(10) NOT NULL, `product_stock_number` int(10) unsigned NOT NULL, `date_modified` datetime NOT NULL, PRIMARY KEY (`auto_id`), KEY `idx_product_id` (`product_id`) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8; INSERT INTO `csdn_product_stock` VALUES ('1', '1', '20', '2018-09-13 19:36:19'); INSERT INTO `csdn_product_stock` VALUES ('2', '2', '40', '2018-09-13 19:36:19');
2.config.php
<?php $dbHost = "192.168.0.110"; $dbUser = "root"; $dbPassword = "123"; $dbName = "test"; ?>
3、<strong>order_submit.php</strong>
<?php require("config.php"); try { $pdo = new PDO("mysql:host=" . $dbHost . ";dbname=" . $dbName, $dbUser, $dbPassword, array(PDO::ATTR_PERSISTENT => true)); $pdo->setAttribute(PDO::ATTR_AUTOCOMMIT, 1); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $orderInfo = array( 'order_amount' => 10.92, 'user_name' => 'yusan', 'order_status' => 1, 'date_created' => 'now()', 'product_lit' => array( 0 => array( 'product_id' => 1, 'product_price' => 5.00, 'product_number' => 10, 'date_created' => 'now()' ), 1 => array( 'product_id' => 2, 'product_price' => 5.92, 'product_number' => 20, 'date_created' => 'now()' ) ) ); try{ $pdo->beginTransaction();//开启事务处理 $sql = 'insert into csdn_order (order_amount, user_name, order_status, date_created) values (:orderAmount, :userName, :orderStatus, now())'; $stmt = $pdo->prepare($sql); $affectedRows = $stmt->execute(array(':orderAmount' => $orderInfo['order_amount'], ':userName' => $orderInfo['user_name'], ':orderStatus' => $orderInfo['order_status'])); $orderId = $pdo->lastInsertId(); if(!$affectedRows) { throw new PDOException("Failure to submit order!"); } foreach($orderInfo['product_lit'] as $productInfo) { $sqlProductDetail = 'insert into csdn_order_detail (order_id, product_id, product_price, product_number, date_created) values (:orderId, :productId, :productPrice, :productNumber, now())'; $stmtProductDetail = $pdo->prepare($sqlProductDetail); $stmtProductDetail->execute(array(':orderId' => $orderId, ':productId' => $productInfo['product_id'], ':productPrice' => $productInfo['product_price'], ':productNumber' => $productInfo['product_number'])); $sqlCheck = "select product_stock_number from csdn_product_stock where product_id=:productId"; $stmtCheck = $pdo->prepare($sqlCheck); $stmtCheck->execute(array(':productId' => $productInfo['product_id'])); $rowCheck = $stmtCheck->fetch(PDO::FETCH_ASSOC); if($rowCheck['product_stock_number'] < $productInfo['product_number']) { throw new PDOException("Out of stock, Failure to submit order!"); } $sqlProductStock = 'update csdn_product_stock set product_stock_number=product_stock_number-:productNumber, date_modified=now() where product_id=:productId'; $stmtProductStock = $pdo->prepare($sqlProductStock); $stmtProductStock->execute(array(':productNumber' => $productInfo['product_number'], ':productId' => $productInfo['product_id'])); $affectedRowsProductStock = $stmtProductStock->rowCount(); //库存没有正常扣除,失败,库存表里的product_stock_number设置了为非负数 //如果库存不足时,sql异常:SQLSTATE[22003]: Numeric value out of range: 1690 BIGINT UNSIGNED value is out of range in '(`test`.`csdn_product_stock`.`product_stock_number` - 20)' if($affectedRowsProductStock <= 0) { throw new PDOException("Out of stock, Failure to submit order!"); } } echo "Successful, Order Id is:" . $orderId .",Order Amount is:" . $orderInfo['order_amount'] . "。"; $pdo->commit();//提交事务 //exec("php order_cancel.php -a" . $orderId . " &"); pclose(popen('php order_cancel.php -a ' . $orderId . ' &', 'w')); //system("php order_cancel.php -a" . $orderId . " &", $phpResult); //echo $phpResult; }catch(PDOException $e){ echo $e->getMessage(); $pdo->rollback(); } $pdo = null; } catch (PDOException $e) { echo $e->getMessage(); } ?>
4. <strong>order_cancel.php</strong>
<?php require("config.php"); $queryString = getopt('a:'); $userParams = array($queryString); appendLog(date("Y-m-d H:i:s") . "\t" . $queryString['a'] . "\t" . "start"); try { $pdo = new PDO("mysql:host=" . $dbHost . ";dbname=" . $dbName, $dbUser, $dbPassword, array(PDO::ATTR_PERSISTENT => true)); $pdo->setAttribute(PDO::ATTR_AUTOCOMMIT, 0); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); swoole_timer_after(10000, function ($queryString) { global $queryString, $pdo; try{ $pdo->beginTransaction();//开启事务处理 $orderId = $queryString['a']; $sql = "select order_status from csdn_order where order_id=:orderId"; $stmt = $pdo->prepare($sql); $stmt->execute(array(':orderId' => $orderId)); $row = $stmt->fetch(PDO::FETCH_ASSOC); //$row['order_status'] === "1"代表已下单,但未付款,我们还原库存只针对未付款的订单 if(isset($row['order_status']) && $row['order_status'] === "1") { $sqlOrderDetail = "select product_id, product_number from csdn_order_detail where order_id=:orderId"; $stmtOrderDetail = $pdo->prepare($sqlOrderDetail); $stmtOrderDetail->execute(array(':orderId' => $orderId)); while($rowOrderDetail = $stmtOrderDetail->fetch(PDO::FETCH_ASSOC)) { $sqlRestoreStock = "update csdn_product_stock set product_stock_number=product_stock_number + :productNumber, date_modified=now() where product_id=:productId"; $stmtRestoreStock = $pdo->prepare($sqlRestoreStock); $stmtRestoreStock->execute(array(':productNumber' => $rowOrderDetail['product_number'], ':productId' => $rowOrderDetail['product_id'])); } $sqlRestoreOrder = "update csdn_order set order_status=:orderStatus where order_id=:orderId"; $stmtRestoreOrder = $pdo->prepare($sqlRestoreOrder); $stmtRestoreOrder->execute(array(':orderStatus' => 0, ':orderId' => $orderId)); } $pdo->commit();//提交事务 }catch(PDOException $e){ echo $e->getMessage(); $pdo->rollback(); } $pdo = null; appendLog(date("Y-m-d H:i:s") . "\t" . $queryString['a'] . "\t" . "end\t" . json_encode($queryString)); }, $pdo); } catch (PDOException $e) { echo $e->getMessage(); } function appendLog($str) { $dir = 'log.txt'; $fh = fopen($dir, "a"); fwrite($fh, $str . "\n"); fclose($fh); } ?>
Related learning recommendations: PHP programming from entry to proficiency
The above is the detailed content of How to cancel an order in php?. For more information, please follow other related articles on the PHP Chinese website!

Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

Hot Topics



PHP 8.4 brings several new features, security improvements, and performance improvements with healthy amounts of feature deprecations and removals. This guide explains how to install PHP 8.4 or upgrade to PHP 8.4 on Ubuntu, Debian, or their derivati

If you are an experienced PHP developer, you might have the feeling that you’ve been there and done that already.You have developed a significant number of applications, debugged millions of lines of code, and tweaked a bunch of scripts to achieve op

Visual Studio Code, also known as VS Code, is a free source code editor — or integrated development environment (IDE) — available for all major operating systems. With a large collection of extensions for many programming languages, VS Code can be c

JWT is an open standard based on JSON, used to securely transmit information between parties, mainly for identity authentication and information exchange. 1. JWT consists of three parts: Header, Payload and Signature. 2. The working principle of JWT includes three steps: generating JWT, verifying JWT and parsing Payload. 3. When using JWT for authentication in PHP, JWT can be generated and verified, and user role and permission information can be included in advanced usage. 4. Common errors include signature verification failure, token expiration, and payload oversized. Debugging skills include using debugging tools and logging. 5. Performance optimization and best practices include using appropriate signature algorithms, setting validity periods reasonably,

This tutorial demonstrates how to efficiently process XML documents using PHP. XML (eXtensible Markup Language) is a versatile text-based markup language designed for both human readability and machine parsing. It's commonly used for data storage an

A string is a sequence of characters, including letters, numbers, and symbols. This tutorial will learn how to calculate the number of vowels in a given string in PHP using different methods. The vowels in English are a, e, i, o, u, and they can be uppercase or lowercase. What is a vowel? Vowels are alphabetic characters that represent a specific pronunciation. There are five vowels in English, including uppercase and lowercase: a, e, i, o, u Example 1 Input: String = "Tutorialspoint" Output: 6 explain The vowels in the string "Tutorialspoint" are u, o, i, a, o, i. There are 6 yuan in total

Static binding (static::) implements late static binding (LSB) in PHP, allowing calling classes to be referenced in static contexts rather than defining classes. 1) The parsing process is performed at runtime, 2) Look up the call class in the inheritance relationship, 3) It may bring performance overhead.

What are the magic methods of PHP? PHP's magic methods include: 1.\_\_construct, used to initialize objects; 2.\_\_destruct, used to clean up resources; 3.\_\_call, handle non-existent method calls; 4.\_\_get, implement dynamic attribute access; 5.\_\_set, implement dynamic attribute settings. These methods are automatically called in certain situations, improving code flexibility and efficiency.
