不知道这样写能扛得住多少,我没测过 1. [代码] [PHP]代码 ?php/***** CREATE TABLE `UserList` (* `ID` int(10) unsigned NOT NULL AUTO_INCREMENT,* `UserID` int(10) unsigned DEFAULT NULL,* `ActivityID` int(10) unsigned DEFAULT
1. [代码][PHP]代码
<?php
/**
*
*
* CREATE TABLE `UserList` (
* `ID` int(10) unsigned NOT NULL AUTO_INCREMENT,
* `UserID` int(10) unsigned DEFAULT NULL,
* `ActivityID` int(10) unsigned DEFAULT '1',
* `Milliseconds` bigint(20) unsigned DEFAULT NULL,
* PRIMARY KEY (`ID`),
* UNIQUE KEY `uniqueKey` (`UserID`,`ActivityID`)
* ) ENGINE=InnoDB DEFAULT CHARSET=utf8
*
*
* CREATE TABLE `DateRange` (
* `DateID` int(10) unsigned NOT NULL AUTO_INCREMENT,
* `Total` int(10) unsigned DEFAULT '0',
* `Amount` int(10) DEFAULT '0',
* `Date` int(10) unsigned DEFAULT NULL,
* `Status` tinyint(3) unsigned DEFAULT '0',
* `Timestamp` int(10) unsigned DEFAULT NULL,
* PRIMARY KEY (`DateID`)
* ) ENGINE=InnoDB DEFAULT CHARSET=utf8
*
*
*/
$host = '127.0.0.1';
$user = 'root';
$password = '123456';
$charset = 'utf8';
$dbname = 'test';
$pdo = new PDO('mysql:host='.$host.';dbname='.$dbname, $user, $password);
$pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true);
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
$pdo->query('set names '. $charset);
$UserID = (int) $_GET['UserID'];
$ActivityID = (int) $_GET['ActivityID'];
// 库存检查
try {
$sql = 'update `DateRange` set `Amount` = `Amount` - 1 , `Timestamp` = UNIX_TIMESTAMP() where `Date` = ? and `Amount` > 0';
$sth = $pdo->prepare($sql);
$sth->BindValue(1, date('Ymd'), PDO::PARAM_INT);
$sth->execute();
if (!$sth->rowCount()) {
$message = 'Amount Invalid';
throw new ErrorException($message);
}
if ($sth->errorCode() != '00000') {
$errorInfo = $sth->errorInfo();
list($pdoerr, $err, $message) = $errorInfo;
throw new ErrorException($message);
}
}catch(Exception $e) {
echo sprintf('{ "exception" : "InvalidNumberException", "message": "%s" }', $e->getMessage());
exit;
}
// 准备入库
try {
$sql = 'insert into UserList set UserID = ?, ActivityID = ?, Milliseconds = ?';
$sth = $pdo->prepare($sql);
$sth->BindValue(1, $UserID, PDO::PARAM_INT);
$sth->BindValue(2, $ActivityID, PDO::PARAM_INT);
$sth->BindValue(3, round(microtime(true) * 1000), PDO::PARAM_STR);
$sth->execute();
if (!$sth->rowCount()) {
$message = 'Save Invalid';
throw new ErrorException($message);
}
if ($sth->errorCode() != '00000') {
$errorInfo = $sth->errorInfo();
list($pdoerr, $error, $message) = $errorInfo;
throw new ErrorException($message);
}
}catch(Exception $e) {
// 还原库存
$sql = 'update `DateRange` set `Amount` = `Amount` + 1 , `Timestamp` = UNIX_TIMESTAMP() where Date = ?';
$sth = $pdo->prepare($sql);
$sth->BindValue(1, date('Ymd'), PDO::PARAM_INT);
$sth->execute();
echo sprintf('{ "exception" : "SaveInvalidException", "message": "%s" }', $e->getMessage());
exit;
}
echo sprintf('{ "errno" : 0 , "data" : { "UserID" : %d, "Milliseconds": %.0f } }', $UserID, round(microtime(true) * 1000));
exit;
