我有一个包含两列的表,它们一起形成一个复合键。这是表格:
CREATE TABLE `teachers_subjects` (
`subject_id` int(11) NOT NULL,
`users_user_id` int(11) NOT NULL,
UNIQUE KEY `subject_user_id` (`subject_id`,`users_user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
我曾经有一个第三列是另一个主键,而在重复的行上,事情运行正常。但是第三栏并没有真正起到任何作用(除了让我免于这个问题),所以我抛弃了它。这是我的PHP函数/ SQL查询:
public function update_or_insert_rows($table, $data) {
# Build the fields string. Ex: (person_id,first_name,email)
# And the duplicate key update string. Ex: first_name=VALUES(first_name),email=VALUES(email)
# We do this by using the indexes on the first row of data
# NOTE: The index of the data array has to start at 0 in order for this to work
$fields = "";
$dup = "";
foreach($data[0] as $index => $value) {
$fields .= $index.",";
$dup .= $index."=VALUES(".$index."),";
}
# Remove last comma
$fields = substr($fields, 0, -1);
$dup = substr($dup, 0, -1);
# Build the data string. Ex: (1,'Ethel','ethel@aol.com'),(3,'Leroy','leroy@hotmail.com'),(3,'Francis','francis@gmail.com')
$values = "";
foreach($data as $row) {
$values .= "(";
foreach($row as $value) {
$values .= "'".$this->connection->real_escape_string($value)."',";
}
$values = substr($values, 0, -1);
$values .= "),";
}
# Remove last comma
$values = substr($values, 0, -1);
# Put it all together
$sql = "INSERT INTO ".$table." (".$fields.")
VALUES ".$values."
ON DUPLICATE KEY UPDATE ".$dup;
# Run it
$run = $this->query($sql);
return $this->connection->affected_rows;
}
现在,当我向表中添加数据时,它会删除除了我添加行的当前用户的用户标识以外的所有用户标识的行。这是有道理的,因为为了使我的函数能够工作,我需要有一个唯一的第三列,我将其包含在传递给表的数据中。
我可以重新添加该索引,但我想知道是否有更好的解决方案。
更新:转储的SQL查询:
INSERT INTO teachers_subjects (users_user_id,subject_id) VALUES ('98','12') ON DUPLICATE KEY UPDATE users_user_id=VALUES(users_user_id),subject_id=VALUES(subject_id)
更新2:问题不在于此SQL查询,而是在查询的SQL删除中删除以前检查过的框现在未选中的行。仍然不知道它为什么删除其他用户行,但它在这段代码的某处:
// delete those subjects that have not been checked
foreach($_POST['subject_on_page_id'] as $subject_on_page_id) {
if(!in_array($subject_on_page_id, $_POST['subject_id'])){
DB::instance(DB_NAME)->delete('teachers_subjects', "WHERE subject_id = ".$subject_on_page_id);
}
}
此代码的工作原理是检查由隐藏字段构成的数组的复选框。
答案 0 :(得分:0)
实际上,这非常简单,与我的INSERT SQL查询无关。这是我的SQL DELETE查询,它只是缺少指定当前登录用户的WHERE子句的第二部分:
&& users_user_id = ".$this->user->user_id
直到我对网站的其他看似相关的部分进行了重大更改之后才发现问题,我错误地将错误归因于此。我在单独测试各个SQL语句之后解决了这个问题,以前它们都是由一个提交按钮执行的。学过的知识!转储您的SQL语句并单独运行它们以查看事情是如何工作的!