如何为动态sql语句编写mysqli语句

时间:2018-06-05 16:42:46

标签: php mysqli prepared-statement

我想为动态SQL语句做一个准备好的语句,这个语句取决于用户的决定。所以我事先并不知道它会是什么样子。我不能事先为它制作一个“模板”。例如:

 $('#txtDate').datepicker({
        format : 'mm/dd/yyyy',
        beforeShowDay: function(date) {
            alert("firing beforeShowDay");
            var Highlight = SelectedDates[date];
            if (Highlight) {
                return [true, "Highlighted", Highlight];
            }
            else {
                return [true, '', ''];
            }
        }
    });

我有一些想法为每个$ build字符串制作prepare语句,但我不确定这是否正常,以及如果,例如,我有几十个可能的用户输入。这将是太多的代码。有更优雅的方式吗?谢谢!

2 个答案:

答案 0 :(得分:1)

根据上述想法构建预准备语句时,您需要考虑如何构建SQL和绑定变量。

$build = "";
$bindType = "";   // String for bind types
$data = [];   // Array for the bound fields

if(!empty($_POST['city'])){
    $bindType .= "s";             // This is a string bind
    $data[] = $_POST['city'];     // Add the field into the list of bound fields
    $build .= "AND city= ? ";     // ? for the bound field
}

因此,对要使用的每个字段重复此模式(除了不重新初始化各种事物,包括$data数组)。将每个项目添加到$bindType会在http://php.net/manual/en/mysqli-stmt.bind-param.php上构建各种类型的字符串。

然后执行查询,使用splat运算符(...)绑定数组值...

$sql = "SELECT * FROM proizvodi WHERE $build";

$search=$conn->prepare($sql);
$search->bind_param($bindType, ...$data);
$search->execute();

答案 1 :(得分:0)

这可能会帮助你@Bunny Davis,

$data  = $_POST[];
$query = "SELECT * FROM proizvodi WHERE 1";
foreach ($data as $key => $value) {
    $query .= " AND $key ='$value'";
}
//now $query is your final query