在SQL查询中使用PHP确定查询的下一部分应该如何处理

在SQL查询中使用PHP确定查询的下一部分应该如何处理,php,mysql,Php,Mysql,StackOverflow的第一个帖子。我希望我的问题足够好,而且措辞很好 我有一个在我的项目与3个下拉菜单的订单列表,下拉菜单为年,月和付款类型 我只需要其中一个,因为解决方案对所有人都是通用的 对于“月份”下拉列表,我有一个值为01-12的所有月份(一月至十二月)的列表。我还有一个值为00的选项,这个选项表示所有月份,因此如果用户选择这个选项,SQL查询应该忽略和MONTH()=值 我使用的SQL查询如下所示。如果所有的字符串都设置为一个值,那么这个字符串将正常工作 $sql = "SELE

StackOverflow的第一个帖子。我希望我的问题足够好,而且措辞很好

我有一个在我的项目与3个下拉菜单的订单列表,下拉菜单为年,月和付款类型

我只需要其中一个,因为解决方案对所有人都是通用的

对于“月份”下拉列表,我有一个值为01-12的所有月份(一月至十二月)的列表。我还有一个值为00的选项,这个选项表示所有月份,因此如果用户选择这个选项,SQL查询应该忽略和MONTH()=值

我使用的SQL查询如下所示。如果所有的字符串都设置为一个值,那么这个字符串将正常工作

$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。谢谢..没有看到此答案,但我现在已将其修复..如果其他人需要,我将使用修复程序更新原始代码很高兴见到你,再次感谢你!