在SQL查询中使用PHP确定查询的下一部分应该如何处理
StackOverflow的第一个帖子。我希望我的问题足够好,而且措辞很好 我有一个在我的项目与3个下拉菜单的订单列表,下拉菜单为年,月和付款类型 我只需要其中一个,因为解决方案对所有人都是通用的 对于“月份”下拉列表,我有一个值为01-12的所有月份(一月至十二月)的列表。我还有一个值为00的选项,这个选项表示所有月份,因此如果用户选择这个选项,SQL查询应该忽略和MONTH()=值 我使用的SQL查询如下所示。如果所有的字符串都设置为一个值,那么这个字符串将正常工作在SQL查询中使用PHP确定查询的下一部分应该如何处理,php,mysql,Php,Mysql,StackOverflow的第一个帖子。我希望我的问题足够好,而且措辞很好 我有一个在我的项目与3个下拉菜单的订单列表,下拉菜单为年,月和付款类型 我只需要其中一个,因为解决方案对所有人都是通用的 对于“月份”下拉列表,我有一个值为01-12的所有月份(一月至十二月)的列表。我还有一个值为00的选项,这个选项表示所有月份,因此如果用户选择这个选项,SQL查询应该忽略和MONTH()=值 我使用的SQL查询如下所示。如果所有的字符串都设置为一个值,那么这个字符串将正常工作 $sql = "SELE
$sql = "SELECT oc_order.order_id AS orderID,
oc_order.firstname AS firstname,
oc_order.lastname AS lastname,
oc_order.payment_code AS paycode,
oc_order.order_status_id AS statusID,
oc_order.total AS totalsumma,
oc_order.date_added AS date
FROM oc_order
WHERE (oc_order.order_status_id = 5 OR oc_order.order_status_id = 31)
AND MONTH(date_added) = '$chosenmonth'
AND YEAR(date_added) = '$chosenyear'
AND oc_order.payment_code = '$chosenpayway'
ORDER BY orderID ASC";
我要做的是将和MONTH()替换为以下内容:
". $chosenmonth != '00' ? 'AND MONTH(date_added) = \'$chosenmonth\'' : '' ."
提前谢谢
更新:
我现在已经解决了这个问题!谢谢巴尔马的帮助。我使用echo进行调试,最终找到了解决方案。。也许有更好的方法可以做到这一点,但这对我来说效果很好。
$chosenmonth = $_GET["month"];
$chosenyear = $_GET["year"];
$chosenpayment = $_GET["pay"];
$ifmonth = ($chosenmonth != NULL ? "AND MONTH(date_added) = '$chosenmonth' " : "");
$ifyear = ($chosenyear != NULL ? "AND YEAR(date_added) = '$chosenyear' " : "");
$ifpay = ($chosenpayment != NULL ? "AND oc_order.payment_code = '$chosenpayment' " : "");
$sql = "SELECT oc_order.order_id AS orderID,
oc_order.firstname AS firstname,
oc_order.lastname AS lastname,
oc_order.payment_code AS paycode,
oc_order.order_status_id AS statusID,
oc_order.total AS totalsumma,
oc_order.date_added AS date
FROM oc_order
WHERE (oc_order.order_status_id = 5 OR oc_order.order_status_id = 31)
". $ifmonth . $ifyear . $ifpay ."
ORDER BY orderID ASC";
三元表达式周围需要括号,因为默认优先级是以不同于您需要的方式组合内容
$sql = "SELECT oc_order.order_id AS orderID,
oc_order.firstname AS firstname,
oc_order.lastname AS lastname,
oc_order.payment_code AS paycode,
oc_order.order_status_id AS statusID,
oc_order.total AS totalsumma,
oc_order.date_added AS date
FROM oc_order
WHERE (oc_order.order_status_id = 5 OR oc_order.order_status_id = 31)
". ($chosenmonth != '00' ? "AND MONTH(date_added) = '$chosenmonth'" : "") ."
AND YEAR(date_added) = '$chosenyear'
AND oc_order.payment_code = '$chosenpayway'
ORDER BY orderID ASC";
如果在单独的语句中执行条件语句,则更容易理解,也更不容易出错
$monthcheck = $chosenmonth != '00' ? "AND MONTH(date_added) = '$chosenmonth'" : "";
$sql = "SELECT oc_order.order_id AS orderID,
oc_order.firstname AS firstname,
oc_order.lastname AS lastname,
oc_order.payment_code AS paycode,
oc_order.order_status_id AS statusID,
oc_order.total AS totalsumma,
oc_order.date_added AS date
FROM oc_order
WHERE (oc_order.order_status_id = 5 OR oc_order.order_status_id = 31)
$monthcheck
AND YEAR(date_added) = '$chosenyear'
AND oc_order.payment_code = '$chosenpayway'
ORDER BY orderID ASC";
如果你把
和月份放在(date_added='$chosenmonth'
双引号。变量不会在单引号内展开。您可能还想看看这个问题,了解动态构建WHERE子句的更通用技术。@Barmar感谢您的回答。我尝试将整行替换为第一行和以下行:“..$chosenmonth!='00'?”和月份(添加日期)=“$chosenmonth\”:“”。“但是当我这样做的时候,它根本不起作用。我是不是弄错了什么?PS:这怎么是另一个问题的完全重复?这是我第一次在StackOverflow上发布。这不是完全重复,但你的问题的解决办法就在那里,因为你唯一的问题是使用了错误类型的引号。如果这不能解决你的p问题,编辑问题,并在最后将新代码显示为更新,我将重新打开它。调试类似问题的方法是将echo$sql;
放入脚本中,然后尝试手动运行sql。谢谢..没有看到此答案,但我现在已将其修复..如果其他人需要,我将使用修复程序更新原始代码很高兴见到你,再次感谢你!