在不应该的情况下插入多个行
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")等浏览器网络开发工具中轻松调试这些类型的错误,因此您可以看到对网站的所有请求。你也可以检查网络服务器请求日志。
我正在做一项大学作业,我需要在 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")等浏览器网络开发工具中轻松调试这些类型的错误,因此您可以看到对网站的所有请求。你也可以检查网络服务器请求日志。