在不应该的情况下插入多个行

Multiple Inserted Rows When They Shouldn't Be

我正在做一项大学作业,我需要在 PHP 中创建一个任务管理系统(用户将工作分配给其他用户),但我一直遇到一个烦人的错误,我无法完全理解找出它发生的原因。

首先,我尝试跟踪调用了哪些函数,以查看其中一个函数是否被调用了两次并且它正在插入第二行。然后我尝试在不使用所有处理它的 类 的情况下将测试行插入数据库。它仍然如此,所以问题不会出现在 类.

这是我上次用于测试的代码(插入语句与我正在使用的数据映射器中的语句相同,只是为了测试目的而硬编码的值):

$sql = "INSERT INTO `jobs` (title, description, estimate, creator, responsible, lastEdit) VALUES ('".uniqid()."', 'some text', 48, 1, 2, NOW());";

// Note: I've already added the needed namespaces at the top of the page

$db = new \PDO('mysql:host=' . Config::get('mysql/host') .
            ';dbname=' . Config::get('mysql/db'),
            Config::get('mysql/username'),
            Config::get('mysql/password')
        );
$db->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);

$query = $db->prepare($sql);

$query->setFetchMode(\PDO::FETCH_ASSOC);

$query->execute();
echo '<pre>';
var_dump($query);
echo '</pre>';
die();

此代码将 2 行(标题和 ID 不同)插入到数据库中。

有趣的是 var_dump 显示查询是第一个 条目。如果页面 运行 多次,它应该显示第二个条目或两者。

我正在应用 /public/index.php 的入口点进行测试,没有任何重定向或刷新。我正在使用重写 url 的 .htaccess 文档(我正在为我的网站使用 MVC):

Options -MultiViews
RewriteEngine On

RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f

RewriteRule ^(.+) index.php?url= [QSA,L]

这是作业的创建代码 table:

CREATE TABLE `jobs` (
    `id` INT(11) NOT NULL AUTO_INCREMENT,
    `title` VARCHAR(50) NOT NULL,
    `description` TEXT NOT NULL,
    `status` ENUM('INPROGRESS','FINISHED') NOT NULL DEFAULT 'INPROGRESS',
    `estimate` INT(11) NOT NULL,
    `creator` INT(11) NOT NULL,
    `responsible` INT(11) NOT NULL,
    `created` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    `lastEdit` TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00',
    PRIMARY KEY (`id`),
    INDEX `job_creator_key` (`creator`),
    INDEX `job_responsible_key` (`responsible`),
    CONSTRAINT `job_creator_key` FOREIGN KEY (`creator`) REFERENCES `users` (`id`) ON UPDATE CASCADE ON DELETE CASCADE,
    CONSTRAINT `job_responsible_key` FOREIGN KEY (`responsible`) REFERENCES `users` (`id`) ON UPDATE CASCADE
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
;

你的脚本被执行了两次,我知道为什么:

您的 .htaccess 正在将所有 missing/404 文件重定向到 index.php

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f

RewriteRule ^(.+) index.php?url= [QSA,L]

所有文件如..... favicon.ico

当您访问您的网站时,浏览器会自动尝试下载 favicon.ico。但是它丢失了,所以请求被重定向到 index.php - 这就是为什么你 运行 index.php 两次。

可以在 firebug(选项卡 "Network")等浏览器网络开发工具中轻松调试这些类型的错误,因此您可以看到对网站的所有请求。你也可以检查网络服务器请求日志。