如何在单个 MySQL 查询中执行此操作:
if (select count(*)..)=10
select a record from the same table
else
insert a record into the same table
如何在单个 MySQL 查询中执行此操作:
if (select count(*)..)=10
select a record from the same table
else
insert a record into the same table
只要只涉及一个网络服务器,我就会尝试 APC http://php.net/manual/de/book.apc.php和一些不错的超时系统。
比如说:如果一个 IP 在过去 2 秒内已经发送了一个请求,它的当前请求应该被拒绝,并且超时更改为 4 秒,之后 10 秒等。
if ($timeoutLevel = apc_fetch("locked_" . $ip)){
$timeoutLevel++;
$timeout = getNextTimeout($timeoutLevel);
apc_store("locked_".$ip, $timeoutLevel, $timeout);
show_my_error_page(get_friendly_text("please do not try again for $timeout seconds! You are Blocked!"));
exit();
}
else{
$timeoutLevel = 1;
$timeout = INITIAL_PAGE_TIMEOUT;
apc_store("locked_".$ip, $timeoutLevel, $timeout);
}
在最后 x 秒内,每个 ip 的最大成本应该是 50 字节,所以如果它不是 DDOS,那么网络服务器应该有那个 RAM。
但要小心:一些 html 页面包含对 css、javascript、图像、声音的引用,ajax 调用可能会稍后出现,json-requests 等。
$timeout 秒后 APC 会自动降低该值,因此无需雇用清洁工。
如果您想使用一个 SQL 命令(但我不知道为什么),您可以使用存储过程:
CREATE PROCEDURE `select_or_insert`()
MODIFIES SQL DATA
COMMENT 'blah blah'
BEGIN
IF ((SELECT COUNT(*) FROM `your_table`) = 10) THEN
SELECT ... FROM ... ;
ELSE
INSERT INTO ... ;
END IF;
END;
要调用该过程,您将发出以下命令:
CALL `select_or_insert`();
如果SELECT
执行,该语句将返回一个结果集。