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

标签 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

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

最佳答案

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

ALTER TABLE menusize ADD UNIQUE (typesize)

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

If a table contains an AUTO_INCREMENT column and INSERT ... ON DUPLICATE KEY UPDATE inserts or updates a row, the LAST_INSERT_ID() function returns the AUTO_INCREMENT value. Exception: For updates, LAST_INSERT_ID() is not meaningful prior to MySQL 5.1.12. However, you can work around this by using LAST_INSERT_ID(<em>expr</em>). Suppose that id is the AUTO_INCREMENT column. To make LAST_INSERT_ID() meaningful for updates, insert rows as follows:

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。)

关于php - MySQL 在 if 语句后停止运行查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21150416/

相关文章:

php - 分解字符串以获取关键字(Youtube channel 关键字)

php - 通过 Ajax 在 Javascript 到 PHP 之间保留真正的 ARRAY OBJECT?

php - 以字符串作为参数的 IN() 不适用于 PDO

mysql - PDO->exec 返回 int(0) 或 Null

PHP MySQL 通过 PDO : mysql_result() substitute not working when called more than once

php - 安全页面上的 Symfony 链接

php - Laravel 5.4 - 从数据透视表中删除特定记录

mysql - 如何在mysql中加入来自同一个表的两个选择

php - 查询多个 SQL 表并在单个 HTML 页面中返回一个或多个表的结果

MySQL : splitting the processing of a particular table between different nodes