MYSQL PHP:将多对多关系插入数据库

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

我有两个问题:

我有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['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
referencement
idEMTS
from
EMTS

我的问题是,假设我填写了
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();
}