gpt4 book ai didi

php - MYSQL 多条件条件插入

转载 作者:行者123 更新时间:2023-11-29 12:40:28 25 4
gpt4 key购买 nike

我正在尝试创建一个具有多个条件的 INSERT 语句作为 PHP 函数的一部分 - 这是迄今为止我的代码:

public function insertData($data)
{
try
{
$stmt = $this->con->prepare('
INSERT IGNORE INTO tblProductData(
strProductCode,
strProductName,
strProductDesc,
smintStockLevel,
dblPrice,
dtmDiscontinued,
dtmAdded)
SELECT :strProductCode,
:strProductName,
:strProductDesc,
:smintStockLevel,
:dblPrice,
(CASE WHEN :dtmDiscontinued = "yes" then NOW();
ELSE SET dtmlDiscontinued = "NULL";
END CASE),
NOW()
FROM dual
WHERE not (:dblPrice < 5.0 and :smintStockLevel < 10)
and not (:dblPrice > 1000.0) ');

$length = count($data);
for ($x=0; $x < $length; $x++) {
$params = array(':strProductCode' => $data[$x][0],
':strProductName' => $data[$x][1],
':strProductDesc' => $data[$x][2],
':smintStockLevel' => $data[$x][3],
':dblPrice' => $data[$x][4] );

$stmt->execute($params);
}

return $stmt;
} catch(PDOException $e) {
echo 'ERROR: ' . $e->getMessage();
}
}
}

条件如下

  • 如果 dblPrice 的值小于 5 并且 smintStockLevel 的值小于 10,则不会插入该行。
  • 如果 dblPrice 的值大于 1000 - 请勿插入该行
  • 当 dtmDiscontinued = 'yes' 时,将调用 NOW() 函数,并在该单元格中插入当前日期/时间。否则输入NULL

此查询作为 PHP 准备语句的一部分执行,迭代包含所有值的多维数组。

我需要创建多个CASE吗?有人可以提供有关解决此问题的最佳方法的建议吗?

需要任何进一步的信息,请告诉我。

更新

输入上面的代码是为了显示完整的上下文,并包含戈登的建议。但是,我当前在执行时收到错误错误:SQLSTATE[HY093]:无效的参数号:绑定(bind)变量的数量与标记数量不匹配

有人能看出原因吗?谢谢

解决方案

需要将

:dtmlDiscontinued 添加到 $params 来解决错误:

示例

 $params = array(':strProductCode' => $data[$x][0], ':strProductName' => $data[$x][1], ':strProductDesc' => $data[$x][2],
':smintStockLevel' => $data[$x][3], ':dblPrice' => $data[$x][4], ':dtmDiscontinued' => $data[$x][5] );

最佳答案

您不能将 where 子句与 values 一起使用。您可以使用 SQL 实现逻辑,如下所示:

INSERT INTO tblProductData(strProductCode, strProductName, strProductDesc,  smintStockLevel,
dblPrice, dtmDiscontinued, dtmAdded
)
SELECT :strProductCode, :strProductName, :strProductDesc, :smintStockLevel,
:dblPrice,
(case when :dtmDiscontinued = 'Yes' then NOW() end),
NOW()
FROM dual
WHERE not (:dblPrice < 5.0 and :smintStockLevel < 10) and
not (:dblPrice > 1000.0);

(请注意,from Dual 实际上不会执行任何操作,但某些数据库在使用 where 时需要 from 子句。)

我不知道dtmDiscontinued = 'yes'是什么意思。但像上面这样的东西应该可以工作。

也就是说,您可能会发现将逻辑放在应用程序层而不是数据库中更容易。如果您总是想检查这些条件,请考虑触发器。

关于php - MYSQL 多条件条件插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26195969/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com