0

我必须更新FileTABLE 上的列TEST。此列包含与该行相关的文件。每个文件由|.

一个例子可能是

ID    NAME    FILE
 1    apple   fruit.png | lemon.png

现在,当我向列中添加新文件时,FILE我使用此查询:

$link->query("UPDATE TEST SET File = CONCAT(File, '$dbfilename') WHERE id = '$p_id'")

$dbfilename例如在哪里pineapple.jpg |

问题是,如果$dbfilename已经在File值上,它将再次添加,导致双倍。

如何检查Filecontains 是否已经包含$dbfilename,如果是,则不添加 id,甚至不执行查询?

4

3 回答 3

2

这不是在数据库中存储信息的好方法。但我马上就会谈到这一点。要直接回答您的问题,您可以将其用作 SQL 查询:

UPDATE TEST SET File = CONCAT(File, '$dbfilename')
WHERE id='$p_id'
    AND File NOT LIKE '%$dbfilename%'
    AND Lingua='$linguadilavoro'

pineapple.jpg但是,当您尝试添加一个文件时,这可能会导致一些问题another-pineapple.jpg

真的,我认为您应该考虑一下这是一种非常糟糕的数据库方法。考虑将文件分成第二个表。例如:

# a table for the fruit names
CREATE TABLE fruits (
    id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(250) NOT NULL,
    UNIQUE INDEX(name)
);

# a table for file names
CREATE TABLE files (
    fileid INT UNSIGNED NOT NULL DEFAULT PRIMARY KEY AUTO_INCREMENT,
    fruitid INT UNSIGNED,
    filename VARCHAR(250),
    UNIQUE INDEX(fruitid, filename)
);

# find all of the fruits with their associated files
SELECT fruits.id, fruits.name, files.filename
FROM fruits LEFT JOIN files ON fruits.id=files.fruitid

# add a file to a fruit
INSERT INTO files (fruitid, filename)
VALUES ('$fruitID', '$filename')
ON DUPLICATE KEY UPDATE fruitid=LAST_INSERT_ID(id)
于 2013-05-22T22:47:12.107 回答
1

您将不得不FILE为 id 选择 。

然后使用explode将其分解为一个数组

然后检查使用 in_array 以确定是否应该添加它

这是一些(未经测试的)指导代码

$stmt = $link->query("SELECT File File from TEST WHERE id = '$p_id'");
$rec = $stmt->fetchAssoc();
$files = explode(" | ",$rec["FILE"]);
if (!in_array($dbfilename, $files)){
    // add to FILE
} else {
    // it's already there
}
于 2013-05-22T22:50:52.453 回答
0

我会重新设计您的表结构并添加一个包含以下列的新表文件,而不是对多个值使用 varchar 字段:

Table Test
TableId, Name

Table File
FileId, TestId, FileName
于 2013-05-22T22:48:33.173 回答