MYSQL PHP:将多对多关系插入数据库
我有两个问题: 我有3个表格:EMT、levels和EMTS\u has\u levels。EMT和水平之间存在多对多关系 我的第一个问题: 在MYSQL PHP:将多对多关系插入数据库,php,mysql,database,mysqli,Php,Mysql,Database,Mysqli,我有两个问题: 我有3个表格:EMT、levels和EMTS\u has\u levels。EMT和水平之间存在多对多关系 我的第一个问题: 在levels表中,我有两列,idlevels(主键),还有一列名为levelname: 我想在levelname中插入多个值。EMT可能有多个级别。因此,我所做的是将其添加到html表单中: Level1 Level2 在register.php中,我有: if(isset($_POST['level'])) { $name=$_POST['l
levels
表中,我有两列,idlevels(主键),还有一列名为levelname
:
我想在levelname中插入多个值。EMT可能有多个级别。因此,我所做的是将其添加到html表单中:
Level1
Level2
在register.php中,我有:
if(isset($_POST['level']))
{
$name=$_POST['level'];
}
$stmt4=$mysqli->prepare("INSERT INTO levels(levelsname) VALUES(?)");
$stmt4->bind_param("s",$name);
$stmt4->execute();
当我尝试上面的php代码时,我得到一个错误。Idlevels不是自动递增的原因,但是为什么插入levelsname不起作用呢
我的第二个问题:
这是EMTS表:
CREATE TABLE IF NOT EXISTS `mydb`.`EMTS` (
`idEMTS` INT NOT NULL AUTO_INCREMENT,
`name` VARCHAR(45) NOT NULL,
`nickname` VARCHAR(45) NOT NULL,
`age` VARCHAR(45) NOT NULL,
`nuber` VARCHAR(45) NOT NULL,
`email` VARCHAR(45) NULL,
`city` VARCHAR(255) NOT NULL,
`password` VARCHAR(45) NOT NULL,
`shifts_idshifts` INT NULL,
`bloodtype_id` INT NULL,
`street` VARCHAR(45) NOT NULL,
`building` VARCHAR(45) NOT NULL,
PRIMARY KEY (`idEMTS`),
INDEX `fk_EMTS_shifts1_idx` (`shifts_idshifts` ASC),
INDEX `fk_EMTS_bloodtype1_idx` (`bloodtype_id` ASC),
UNIQUE INDEX `nickname_UNIQUE` (`nickname` ASC),
CONSTRAINT `fk_EMTS_shifts1`
FOREIGN KEY (`shifts_idshifts`)
REFERENCES `mydb`.`shifts` (`idshifts`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_EMTS_bloodtype1`
FOREIGN KEY (`bloodtype_id`)
REFERENCES `mydb`.`bloodtype` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
这是我的EMTS\U has\U级别表:
CREATE TABLE IF NOT EXISTS `mydb`.`EMTS_has_levels` (
`levels_idlevels` INT NULL,
`EMTS_idEMTS` INT NULL,
PRIMARY KEY (`levels_idlevels`, `EMTS_idEMTS`),
INDEX `fk_levels_has_EMTS_EMTS1_idx` (`EMTS_idEMTS` ASC),
INDEX `fk_levels_has_EMTS_levels1_idx` (`levels_idlevels` ASC),
CONSTRAINT `fk_levels_has_EMTS_levels1`
FOREIGN KEY (`levels_idlevels`)
REFERENCES `mydb`.`levels` (`idlevels`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_levels_has_EMTS_EMTS1`
FOREIGN KEY (`EMTS_idEMTS`)
REFERENCES `mydb`.`EMTS` (`idEMTS`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
EMTS\u有两个级别
只有两列是外键。第一个是levels\u idlevels
referencement levels表,第二个是EMTS\u idEMTS
referencementidEMTS
fromEMTS
表
我的问题是,假设我填写了EMTS
和levels
如何填写EMTS\u has\u levels
中的两个外键
我尝试了这个,但它给了我一个错误:
$stmt10=$mysqli->prepare("INSERT INTO belongs(levels_idlevels) SELECT idlevels FROM levels WHERE levelname=$_POST['levelname'] " );
$stmt10->execute();
$stmt11=$mysqli->prepare("INSERT INTO belongs(EMTS_idEMTS) SELECT idEMTS FROM EMTS WHERE nickname=$_POST['nickname'] " );
$stmt11->execute();
如何填充多对多关系产生的第三个表?如果要允许多个级别,则需要使用数组样式名称,以便获得所有级别
<input type="checkbox" name="level[]" value="level1">Level1</input>
<input type="checkbox" name="level[]" value="level2">Level2</input>
您有一个输入错误:列的名称是
levelname
,但您正在插入levelsname
。但是为什么要将此表单插入到级别表中?如果要将EMT链接到某个级别,则只应将其插入到所属的。这看起来也是错误的$stmt4->bind_param(“s”,$name)
因为您有一个问号作为占位符。password VARCHAR(45)
-立即,这表明使用了一种不安全的密码哈希方法。例如password\u hash()
,存储一个60长度的字符。如果您计划使用此复选框或已在使用此复选框,则它已以静默方式失败。您还需要将复选框输入视为数组,并指定相同的名称属性。如果您只需要检查一个,请不要使用这些设备,而是使用收音机。
<input type="checkbox" name="level[]" value="level1">Level1</input>
<input type="checkbox" name="level[]" value="level2">Level2</input>
$stmt4=$mysqli->prepare("INSERT INTO EMTS_has_levels (levels_idlevels, EMTS_idEMTS)
SELECT l.idlevel, e.idEMTS
FROM levels AS l
CROSS JOIN EMTS AS e
WHERE l.levelname = ?
AND e.nickname = ?");
$stmt4->bind_param("s",$name, $_POST['nickname']);
foreach ($_POST['level'] as $name) {
$stmt4->execute();
}