Я создаю дублирующую функциональность в своем приложении, это дублирует всю вакансию со следующим кодом, в примере, который я дублирую из вакансии 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". Который является уникальным именем моего нового имени файла, которое я копирую, копия работает по назначению.
Функция duplicate выглядит так:
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;
}
Я попытался сделать var_dump на $ banner, чтобы убедиться, что эта переменная содержит правильную строку, и она содержит image_8.jpg. Поэтому он просто копирует баннер из исходной вакансии, но не устанавливает имя нового баннера
Если я посмотрю на SQL, который был выполнен, я вижу следующие результаты:
0.0076 CREATE TEMPORARY TABLE tmptable SELECT * FROM вакансий WHERE vacancy_id = 94
0.0090 UPDATE tmptable SET vacancy_id = NULL
0.0000 ОБНОВЛЕНИЕ tmptable SET banner = 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 status = 0
0.0002 UPDATE tmptable SET reminder_mail_sent = 0
0.0002 UPDATE tmptable SET extend_code = NULL
0.0153 INSERT В вакансиях SELECT * FROM tmptable
Однако если я посмотрю в mysql сам для дублирования новой вакансии, строка, в которую он вставил все в операторе обновления, за исключением $ 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;