MySQL在if语句之后停止运行查询

时间:2014-01-15 23:24:32

标签: php mysql pdo

我已经被困在这几个小时了......

这是我的代码:

$SQLQuery1 = $db_info->prepare("SELECT COUNT(ID) FROM menusize WHERE typesize=:typesize");
        $SQLQuery1->bindValue(':typesize',$_POST['typesize'],PDO::PARAM_STR);
        $SQLQuery1->execute();
        if($SQLQuery1->fetchColumn() > 0) {
            $SQLQuery2 = $db_info->prepare("INSERT INTO menucatagorysize (menucatagory_ID,menusize_ID) VALUES (:catagoryid,(SELECT ID FROM menusize WHERE typesize=:typesize))");
            $SQLQuery2->bindValue(':typesize',$_POST['typesize'],PDO::PARAM_STR);
            $SQLQuery2->bindValue(':catagoryid',$_POST['catagoryid'],PDO::PARAM_STR);
            $SQLQuery2->execute();
        } else {
            $SQLQuery2 = $db_info->prepare("INSERT INTO menusize (typesize) VALUES (:typesize);
                                            SET @menusizeid=LAST_INSERT_ID();
                                            INSERT INTO menucatagorysize (menusize_ID,menucatagory_ID) VALUES (@menusizeid,:catagoryid)");
            $SQLQuery2->bindValue(':typesize',$_POST['typesize'],PDO::PARAM_STR);
            $SQLQuery2->bindValue(':catagoryid',$_POST['catagoryid'],PDO::PARAM_STR);
            $SQLQuery2->execute();
        }
        $SQLQuery3 = $db_info->prepare("SELECT DISTINCT(menuitem_ID) FROM menuprice WHERE menucatagory_ID=:catagoryid");
        $SQLQuery3->bindValue(':catagoryid',$_POST['catagoryid'],PDO::PARAM_STR);
        $SQLQuery3->execute();
        $rows = $SQLQuery3->fetchAll(PDO::FETCH_ASSOC);

因此,它将运行if语句,运行$SQLQuery1$SQLQuery2(只需要一个),没有任何问题,错误或警告。但是,如果它运行代码的else {部分,它将不会运行$ SQLQuery3。有什么想法吗?

谢谢:D

编辑:通过在$SQLQuery2=NULL语句中执行else来使其工作......糟透了我仍然无法弄清楚为什么它不会以原始方式工作。

1 个答案:

答案 0 :(得分:0)

您似乎正在尝试在应用程序代码中对typesize表的menusize列强制执行唯一性约束。但是,数据库可以为您执行此操作 - 这将使您的后续操作更加简单:

ALTER TABLE menusize ADD UNIQUE (typesize)

现在,可以简单地尝试将已发布的值插入表中,数据库将防止出现重复。此外,正如INSERT ... ON DUPLICATE KEY UPDATE Syntax所述:

  

如果表包含AUTO_INCREMENT列并且INSERT ... ON DUPLICATE KEY UPDATE插入或更新行,则LAST_INSERT_ID()函数将返回AUTO_INCREMENT值。例外:对于更新,LAST_INSERT_ID()在MySQL 5.1.12之前没有意义。但是,您可以使用LAST_INSERT_ID(expr)解决此问题。假设idAUTO_INCREMENT列。要使LAST_INSERT_ID()对更新有意义,请按如下方式插入行:

     
INSERT INTO table (a,b,c) VALUES (1,2,3)
  ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id), c=3;

因此,您可以这样做:

$db_info->prepare('
  INSERT INTO menusize (typesize) VALUES (:typesize)
    ON DUPLICATE KEY UPDATE typesize=LAST_INSERT_ID(typesize)
')->execute(array(
  ':typesize' => $_POST['typesize']
));

$db_info->prepare('
  INSERT INTO menucatagorysize
    (menusize_ID, menucatagory_ID)
  VALUES
    (LAST_INSERT_ID(), :catagoryid)
')->execute(array(
  ':catagoryid' => $_POST['catagoryid']
));

$stmt = $db_info->prepare('
  SELECT DISTINCT menuitem_ID
  FROM   menuprice
  WHERE  menucatagory_ID = :catagoryid
');
$stmt->execute(array(
  ':catagoryid' => $_POST['catagoryid']
));
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
  // etc.
}

(顺便说一下,英文单词拼写为cat * e * gory,而不是cat * a * gory。)