Вставка нового имени в поле mysql с временной таблицей

0

Я создаю дублирующую функциональность в своем приложении, это дублирует всю вакансию со следующим кодом, в примере, который я дублирую из вакансии 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).

Теги:
codeigniter

1 ответ

0
Лучший ответ

Почему бы просто не делать:

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;
  • 0
    Спасибо! Это проблема производительности, чтобы использовать это много запросов, как я делаю сейчас (с временной таблицей)?
  • 0
    Вы можете просто сделать все ОБНОВЛЕНИЯ по крайней мере в одном запросе.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню