Как сделать подготовленные операторы MySQL для динамического оператора SQL - PullRequest
0 голосов
/ 05 июня 2018

Я хотел бы сделать подготовленный оператор для динамического SQL-оператора, который зависит от решения пользователя.Поэтому я не знаю заранее, как это будет выглядеть.Я не могу сделать «шаблон» для него заранее.Например:

<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$conn = new mysqli('localhost','root','','test');

if (isset($_POST['submit'])){

$build = "";

 if(!empty($_POST['city'])){
 $city=$_POST['city'];
 $build.= "AND city= $city ";

   }

 if(!empty($_POST['type'])){
 $type=$_POST['type'];
 $build.= "AND type = $type ";

   }

  $build= substr_replace($build,'',0,3);

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

  $search=$conn->query($sql);

  $num = $search->num_rows;

        if($num>0){

            echo "<table>";

            while($row = $search->fetch_object()){
            echo "<tr>";

            echo "<td>".$row->name."</td>";
            echo "<td>".$row->surname."</td>";
            echo "<td>".$row->price."</td>";

            echo "</tr>";
    }       
            echo "</table>";
    }

}else{
     echo "Put some value";
}

?>
<form action="" method="post">
<input type="text" name="house" id="city"/>City
<input type="text" name="flat" id="type"/>Type
<input type="submit" name="submit" id="submit" value="Submit"/>
</form>

У меня есть несколько идей сделать оператор подготовки для каждой строки $ build, но я не уверен, что это нормально, и что если, например, у меня есть десятки возможных пользовательских вводов,Это было бы слишком много кода.Есть ли более элегантный способ сделать это?Спасибо!

Ответы [ 2 ]

0 голосов
/ 05 июня 2018

При построении подготовленного оператора из вышеприведенной идеи вам нужно подумать о том, как создать 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();
0 голосов
/ 05 июня 2018

Это может помочь вам @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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...