我在应用程序中创建了重复功能,它使用以下代码复制了整个空缺,在示例中,我是从空缺ID 94(具有横幅名称“ image.jpg”)中进行复制的:
$vacdata = $this->vacancies_model->get($data['old_vacancy_id']);
$newvacbannername = return_unique_filename($vacdata->banner);
copy_file($vacdata->banner, $newvacbannername);
$data['newvacancyid'] = $this->vacancies_model->duplicate($data['old_vacancy_id'], $newvacbannername);
$ newvacbannername中有字符串“ image_8.jpg”。这是我复制的新文件名的唯一名称,该副本正在按预期工作。
函数重复看起来像这样:
function duplicate($vacid, $banner)
{
$this->db->query('CREATE TEMPORARY TABLE tmptable SELECT * FROM vacancies WHERE vacancy_id = ' . $vacid);
$this->db->query('UPDATE tmptable SET vacancy_id = NULL');
$this->db->query('UPDATE tmptable SET banner = ' . $banner );
$this->db->query('UPDATE tmptable SET create_time = now()');
$this->db->query('UPDATE tmptable SET watch_counter = 0');
$this->db->query('UPDATE tmptable SET contact_info_counter = 0');
$this->db->query('UPDATE tmptable SET status = 0');
$this->db->query('UPDATE tmptable SET reminder_mail_sent = 0');
$this->db->query('UPDATE tmptable SET extend_code = NULL');
$this->db->query('INSERT INTO vacancies SELECT * FROM tmptable');
$newvacancyid = $this->db->insert_id();
$this->db->query('DROP TEMPORARY TABLE IF EXISTS tmptable');
return $newvacancyid;
}
我尝试在$ banner上执行var_dump,以确保此变量包含正确的字符串,并且确实包含image_8.jpg。因此,它只是从原始空缺中复制横幅,但未设置新的横幅名称
如果查看执行的SQL,会看到以下结果:
0.0076 CREATE TEMPORARY TABLE tmptable SELECT * FROM职位空缺vacancy_id = 94
0.0090更新tmptable SET vacancy_id = NULL
0.0000更新tmptable设置标题= image_8.jpg
0.0005 UPDATE tmptable SET create_time = now()
0.0023 UPDATE tmptable SET watch_counter = 0
0.0001 UPDATE tmptable SET contact_info_counter = 0
0.0002 UPDATE tmptable SET状态= 0
0.0002 UPDATE tmptable SET hinter_mail_sent = 0
0.0002 UPDATE tmptable SET扩展代码= NULL
0.0153插入空位选择*从tmptable
但是,如果我在mysql本身中查找重复的新空缺,则它在update语句中插入了所有内容的行(除了$ banner除外),它插入的名称与原始空缺的名称完全相同(在此示例中为image.jpg而不是image_8 .jpg)。
最佳答案
为什么不做:
INSERT INTO vacancies
SELECT
NULL, --id field
other_columns,
go_here,
NULL,
:banner, --bind this from $banner,
now(),
0,
0,
0,
0,
NULL
FROM vacancies
WHERE vacancy_id = ' . $vacid
当您可以简单地在一个临时表中执行此操作时,似乎需要一个临时表和大量查询。另外:研究将变量绑定到您的查询:这更安全,是推荐的方法。
或者,您也可以通过事务来执行此操作:
START TRANSACTION;
INSERT INTO vacancies
SELECT
*
FROM vacancies
WHERE vacancy_id = :vacid;
UPDATE vacancies
SET banner = :banner,
create_time = now(),
watch_counter = 0,
...
WHERE vacancy_id = :vacid --Get the inserted ID from mysql_insert_id();
COMMIT;