Динамическое объединение SQL с подготовленными операторами PHP MySQLi

#php #mysql #mysqli #prepared-statement

#php #mysql #mysqli #подготовленный оператор

Вопрос:

Я пишу подготовленный оператор PHP с использованием подготовленных операторов MySQLi, где первым связанным параметром является идентификатор пользователя, а вторым параметром может быть один из 5 различных фрагментов кода SQL (переменная $ redeemLimitCheckRange) на основе других условий, представленных в виде строки. У меня возникли проблемы с привязкой второго параметра.

Я пробовал связывать код SQL в виде строки, пробовал использовать функцию SQL CONCAT(), но, похоже, ни то, ни другое не работает.

 <?php
    if($dbRedeemStart != '' amp;amp; $dbRedeemEnd != ''){
        $redeemLimitCheckRange = "AND DATE(chg_date) >='$dbRedeemStart' AND DATE(chg_date) <= '$dbRedeemEnd'";
    else if($dbRedeemStart != '' amp;amp; $dbRedeemEnd == ''){                                                                                                                      
        $redeemLimitCheckRange = "AND DATE(chg_date) >= '$dbRedeemStart'";
    else if($dbRedeemStart == '' amp;amp; $dbRedeemEnd != ''){
        $redeemLimitCheckRange = "AND DATE(chg_date) <= '$dbRedeemEnd'";
    }else{
        $redeemLimitCheckRange = "";
    }

    $sql = "SELECT COUNT(recId) totalRedeem FROM transactions WHERE userId = ? AND `type` = 'Redeemed' ?";
    $stmt = mysqli_stmt_init($connection);

    if(!mysqli_stmt_prepare($stmt, $sql)){
        error_log("mysqli_stmt_prepare failure", 0);
    }else{
        mysqli_stmt_bind_param($stmt, "is", $usrId, $redeemLimitCheckRange);
        mysqli_stmt_execute($stmt);
        $rslt = mysqli_stmt_get_result($stmt);
        mysqli_stmt_close($stmt);
    }
?>
 

В настоящее время php выдает ошибку в строке mysqli_stmt_prepare($stmt, $sql) и выдает ошибку.

Комментарии:

1. нет, вы не можете этого сделать, объедините $redeemLimitCheckRange строку с $sql укусом

2. Не переносите chg_date в DATE() функцию. Предполагая, что это тип SQL даты, просто оставьте его как таковой.

3. @tim спасибо. Почему это не разрешено с подготовленными операторами?

4. параметры привязаны, а не большие фрагменты запроса $sql = "SELECT COUNT(recId) totalRedeem FROM transactions WHERE userId = ? AND типа` = ‘Redeemed’ «.$redeemLimitCheckRange;` затем исправьте параметр bind_param, поскольку у вас есть только один