php - 使用临时表在字段 mysql 中插入新名称

标签 php mysql codeigniter

我正在我的应用程序中创建重复功能,这使用以下代码复制整个空缺,在示例中,我从空缺 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 vacancies WHERE vacancy_id = 94

0.0090 UPDATE tmptable SET vacancy_id = NULL

0.0000 UPDATE 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 INTO vacancies 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

当您可以简单地在一个中完成此操作时,涉及临时表和大量查询似乎有点牵强。另外:研究绑定(bind)变量到您的查询:它更安全,也是推荐的方法。

或者,您也可以通过事务来执行此操作:

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;

关于php - 使用临时表在字段 mysql 中插入新名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48965601/

相关文章:

javascript - 替换textarea换行符将文本保存到Mysql

php - 仅第二页的 Jeasyui Datagrid 分页问题

php - 需要从 $_SERVER ['HTTP_HOST' 中删除 www ] 如何?

javascript - CodeIgniter - AJAX 生成元素内的 AJAX 分页

javascript - 再次刷新发布值,导致再次进入数据库

php - "Unknown column in ' 字段列表 '"当准备语句的占位符在子查询中

php - 使用 MySQL 在 Android 登录页面上出现错误的用户名和密码

php - 操作预先编写的 MySQL 查询 - PHP

php - 在 codeigniter 中为 session 闪存数据提供 css

php - 删除index.php并在htaccess Codeigniter中添加www