【发布时间】:2016-09-08 17:30:58
【问题描述】:
我的解决方案
我在 index.php 上调试我的函数,我没有注意到我的浏览器正在搜索 favicon.icon。目前,如果找不到请求的文件,我的路由器会将用户发送到 index.php,这会导致第二次触发。
你可以很容易地找到这个@你的网站访问日志!
*对不起我的语法,我希望它可读..
主题
我创建了一个小数据库脚本,只有一件事我无法解决。当我执行插入查询时,它将执行两次。这些值是不同的(值 = openssl_random_pseudo_bytes)。
private function __init($Query = '', $Params = NULL){
if($this->__getStatus() === false){
$this->__createConnection();
}
$this->__PQuery = $this->__Database->prepare($Query);
foreach($Params as $param => $value){
$dataType = PDO::PARAM_STR;
switch ($value){
case is_int($value):
$dataType = PDO::PARAM_INT;
break;
case is_bool($value):
$dataType = PDO::PARAM_BOOL;
break;
case is_null($value):
$dataType = PDO::PARAM_NULL;
break;
}
$this->__PQuery->bindValue($param, $value, $dataType);
}
$this->__PQuery->execute();
}
函数调用:
$this->__database->Query("INSERT INTO `Serials` (`SerialKey`, `Active`, `ActivatedOn`, `ValidTo`, `Paid`) VALUES (:Serial, 'no', NULL, NULL, 'no');", ['Serial' => openssl_random_pseudo_bytes(10)]);
(查询发送给__init)
你们能告诉我在哪里看吗?我现在正在寻找大约4个小时。
执行前的回溯
Core\Database\Handler->__init(INSERT INTO
Serials(SerialKey,Active,ActivatedOn,ValidTo,Paid) VALUES (:Serial, 'no', NULL, NULL , 'no');, Array ([Serial] => ��n�� �R)) 在 [PATH_TO_PUBLIC_HTMLpublic_html/Core/Database/Handler.php:45] 调用 Core\Database\Handler->Query(INSERT INTOSerials(SerialKey,Active,ActivatedOn,ValidTo,Paid) VALUES (:Serial, 'no', NULL, NULL, 'no ');, 数组 ([Serial] => ��n�� �R)) 在 [PATH_TO_PUBLIC_HTMLpublic_html/Core/serialManager/createSerial.php:17] 调用 Core\serialManager\createSerial->__storeToDB() 在 [PATH_TO_PUBLIC_HTMLpublic_html/Core/serialManager/createSerial.php:9] 调用 Core\serialManager\createSerial->__construct() 在 [PATH_TO_PUBLIC_HTMLpublic_html/Controllers/Website.php:6] 调用 网站->首页() call_user_func_array(Array ([0] => Website Object (),[1] => Home), Array ()) 在 [PATH_TO_PUBLIC_HTMLpublic_html/Core/Routing/Router.php:20] 调用 Core\Routing\Router->__construct() 在 [PATH_TO_PUBLIC_HTMLpublic_html/index.php:3] 调用
执行后的回溯
Core\Database\Handler->__init(INSERT INTO
Serials(SerialKey,Active,ActivatedOn,ValidTo,Paid) VALUES (:Serial, 'no', NULL, NULL , 'no');, Array ([Serial] => F�7�,.Kr�)) 在 [PATH_TO_PUBLIC_HTMLpublic_html/Core/Database/Handler.php:45] 调用 Core\Database\Handler->Query(INSERT INTOSerials(SerialKey,Active,ActivatedOn,ValidTo,Paid) VALUES (:Serial, 'no', NULL, NULL, 'no ');, 在 [PATH_TO_PUBLIC_HTMLpublic_html/Core/serialManager/createSerial.php:17] 调用的数组 ([Serial] => F�7�,.Kr�)) Core\serialManager\createSerial->__storeToDB() 在 [PATH_TO_PUBLIC_HTMLpublic_html/Core/serialManager/createSerial.php:9] 调用 Core\serialManager\createSerial->__construct() 在 [PATH_TO_PUBLIC_HTMLpublic_html/Controllers/Website.php:6] 调用 网站->首页() call_user_func_array(Array ([0] => Website Object (),[1] => Home), Array ()) 在 [PATH_TO_PUBLIC_HTMLpublic_html/Core/Routing/Router.php:20] 调用 Core\Routing\Router->__construct() 在 [PATH_TO_PUBLIC_HTMLpublic_html/index.php:3] 调用
[注意] 我的托管公司受到攻击..
*对不起我的语法,我尽力了..
【问题讨论】:
-
代码验证@其他服务器;代码 100% 工作? ddos/attack 会导致这个问题吗?
-
DDOS 可以暴露你不知道的竞争条件。它不会产生错误,它会暴露它们。如果您想阻止重复,请设置一个
UNIQUE索引来阻止它们,或者设置某种 idempotency system 以确保不会触发第二次调用。 -
db 是否获得两次条目?还是你只看痕迹就知道了?
-
您需要提供更多代码。可能是
$this->__database->Query()调用了它两次,或者调用了另一个函数第二次调用了__init()。 -
@AbcAeffchen 为这个主题添加了我的解决方案! (知道晚了)