久久久久久久av_日韩在线中文_看一级毛片视频_日本精品二区_成人深夜福利视频_武道仙尊动漫在线观看

  • <legend id='yLh4N'><style id='yLh4N'><dir id='yLh4N'><q id='yLh4N'></q></dir></style></legend>

    <small id='yLh4N'></small><noframes id='yLh4N'>

    <i id='yLh4N'><tr id='yLh4N'><dt id='yLh4N'><q id='yLh4N'><span id='yLh4N'><b id='yLh4N'><form id='yLh4N'><ins id='yLh4N'></ins><ul id='yLh4N'></ul><sub id='yLh4N'></sub></form><legend id='yLh4N'></legend><bdo id='yLh4N'><pre id='yLh4N'><center id='yLh4N'></center></pre></bdo></b><th id='yLh4N'></th></span></q></dt></tr></i><div class="qwawimqqmiuu" id='yLh4N'><tfoot id='yLh4N'></tfoot><dl id='yLh4N'><fieldset id='yLh4N'></fieldset></dl></div>

    1. <tfoot id='yLh4N'></tfoot>
          <bdo id='yLh4N'></bdo><ul id='yLh4N'></ul>

      1. 如何使用 mysqli API 制作一個完全動態的準備語句

        How to make a fully dynamic prepared statement using mysqli API?(如何使用 mysqli API 制作一個完全動態的準備語句?)
      2. <legend id='r5YSr'><style id='r5YSr'><dir id='r5YSr'><q id='r5YSr'></q></dir></style></legend>
        <i id='r5YSr'><tr id='r5YSr'><dt id='r5YSr'><q id='r5YSr'><span id='r5YSr'><b id='r5YSr'><form id='r5YSr'><ins id='r5YSr'></ins><ul id='r5YSr'></ul><sub id='r5YSr'></sub></form><legend id='r5YSr'></legend><bdo id='r5YSr'><pre id='r5YSr'><center id='r5YSr'></center></pre></bdo></b><th id='r5YSr'></th></span></q></dt></tr></i><div class="qwawimqqmiuu" id='r5YSr'><tfoot id='r5YSr'></tfoot><dl id='r5YSr'><fieldset id='r5YSr'></fieldset></dl></div>

        <small id='r5YSr'></small><noframes id='r5YSr'>

        1. <tfoot id='r5YSr'></tfoot>

                <tbody id='r5YSr'></tbody>
                • <bdo id='r5YSr'></bdo><ul id='r5YSr'></ul>

                • 本文介紹了如何使用 mysqli API 制作一個完全動態的準備語句?的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!

                  問題描述

                  我需要更改此查詢以使用準備好的語句.可能嗎?

                  I need to change this query to use a prepared statement. Is it possible?

                  查詢:

                  $sql = "SELECT id, title, content, priority, date, delivery FROM tasks " . $op . " " . $title . " " . $content . " " . $priority . " " . $date . " " . $delivery . " ORDER BY " . $orderField . " " . $order . " " . $pagination . "";
                  

                  在查詢之前,有代碼來檢查 POST 變量并更改查詢中變量的內容.

                  Before the query, there's code to check the POST variables and change the content of variables in the query.

                  //For $op makes an INNER JOIN with or without IN clause depending on the content of a $_POST variable
                  $op = "INNER JOIN ... WHERE opID  IN ('"$.opID."')";
                  //Or
                  $op = "INNER JOIN ... ";
                  
                  //For $title (depends of $op):
                  $title = "WHERE title LIKE'%".$_POST["title"]."%'";
                  //Or
                  $title = "AND title LIKE'%".$_POST["title"]."%'";
                  
                  //For $content:
                  $content = "AND content LIKE '%".$_POST["content"]."%'";
                  
                  //For $priority just a switch:
                  $priority = "AND priority = DEPENDING_CASE";
                  
                  //For $date and $delivery another switch 
                  $d = date("Y-m-d", strtotime($_POST["date"]));
                  $date = "AND date >= '$d' 00:00:00 AND date <= '$d' 23:59:59";
                  //Or $date = "AND date >= '$d' 00:00:00";
                  //Or $date = "AND date <= '$d' 23:59:59";
                  
                  //For $orderField
                  $orderField = $_POST["column"];
                  
                  //For $order
                  $order= $_POST["order"];
                  
                  //For $pagination 
                  $pagination = "LIMIT ".$offset.",". $recordsPerPage;
                  

                  如何使用準備好的語句執行此查詢?

                  How I could do this query using prepared statement?

                  • 查詢可能更加靜態,但這意味著生成不同的準備好的語句并根據 $_POST 檢查執行它.
                  • 這取決于許多變量,因為此查詢在包含搜索字段和要排序的列的表中顯示結果.

                  一個完整的查詢示例如下(取決于 $_POST 檢查):

                  A full example of query would be like this (depending of $_POST checks):

                  SELECT id, title, content, priority, date, delivery FROM tasks INNER JOIN op ON task.op = op.opId WHERE op IN (4851,8965,78562) AND title LIKE '%PHT%' AND content LIKE '%%' AND priority = '2' ORDER BY date DESC LIMIT 0, 10 
                  

                  推薦答案

                  一個很好的問題.感謝您轉向準備好的聲明.似乎經過這么多年的斗爭,這個想法終于開始接管了.

                  An excellent question. And thank you for moving to prepared statements. It seems that after all those years of struggle, the idea finally is starting to take over.

                  免責聲明:會有指向我自己網站的鏈接,因為我已經幫助人們使用 PHP 20 多年,并且癡迷于撰寫有關最常見問題的文章.

                  是的,這完全有可能.查看我的文章,如何為 mysqli 創建搜索過濾器以獲得完整功能的示例.

                  Yes, it's perfectly possible. Check out my article, How to create a search filter for mysqli for the fully functional example.

                  對于 WHERE 部分,您只需要創建兩個單獨的數組 - 一個包含帶有占位符的查詢條件,另一個包含這些占位符的實際值,即:

                  For the WHERE part, all you need is to create two separate arrays - one containing query conditions with placeholders and one containing actual values for these placeholders, i.e:

                  $conditions = [];
                  $parameters = [];
                  
                  if (!empty($_POST["content"])) {
                      $conditions[] = 'content LIKE ?';
                      $parameters[] = '%'.$_POST['content ']."%";
                  }
                  

                  等,適用于所有搜索條件.

                  and so on, for all search conditions.

                  然后你可以implode使用AND字符串作為膠水的所有條件,并得到一個一流的WHERE子句:

                  Then you could implode all the conditions using AND string as a glue, and get a first-class WHERE clause:

                  if ($conditions)
                  {
                      $where .= " WHERE ".implode(" AND ", $conditions);
                  }
                  

                  所有搜索條件的例程都相同,但對于 IN() 子句會有所不同.

                  The routine is the same for all search conditions, but it will be a bit different for the IN() clause.

                  有點不同,因為您需要添加更多占位符和更多值:

                  is a bit different as you will need more placeholders and more values to be added:

                  if (!empty($_POST["opID"])) {
                      $in  = str_repeat('?,', count($array) - 1) . '?';
                      $conditions[] = "opID IN ($in)";
                      $parameters = array_merge($parameters, $_POST["opID"]);
                  }
                  

                  此代碼將向 IN() 子句添加與 $_POST["opID"] 中的元素一樣多的 ? 占位符并將所有這些值添加到 $parameters 數組中.解釋可以在我網站上同一部分的相鄰文章中找到.

                  this code will add as many ? placeholders to the IN() clause as many elements in the $_POST["opID"] and will add all those values to the $parameters array. The explanation can be found in the adjacent article in the same section on my site.

                  完成WHERE 子句后,您可以轉到查詢的其余部分

                  After you are done with WHERE clause, you can move to the rest of your query

                  您不能參數化 order by 子句,因為字段名稱和 SQL 關鍵字不能由占位符表示.為了解決這個問題,我懇求您使用我為此專門編寫的白名單功能.有了它,您可以使您的 ORDER BY 子句 100% 安全但非常靈活.您只需要預先定義一個數組,其中的字段名稱允許在 order by 子句中:

                  You cannot parameterize the order by clause, because field names and SQL keywords cannot be represented by a placeholder. And to tackle with this problem I beg you to use a whitelisting function I wrote for this exact purpose. With it you can make your ORDER BY clause 100% safe but perfectly flexible. All you need is to predefine an array with field names allowed in the order by clause:

                  $sortColumns = ["title","content","priority"]; // add your own
                  

                  然后使用這個方便的函數獲取安全值:

                  and then get safe values using this handy function:

                  $orderField = white_list($_POST["column"], $sortColumns, "Invalid column name");
                  $order = white_list($_POST["order"], ["ASC","DESC"], "Invalid ORDER BY direction");
                  

                  這是一個智能功能,涵蓋三種不同的場景

                  this is a smart function, that covers three different scenarios

                  • 如果沒有提供任何值(即 $_POST["column"] 為空),將使用白名單中的第一個值,因此它用作默認值
                  • 如果提供了正確的值,它將在查詢中使用
                  • 如果提供的值不正確,則會引發錯誤.

                  LIMIT 值是完全參數化的,因此您可以將它們添加到 $parameters 數組中:

                  LIMIT values are perfectly parameterized so you can just add them to the $parameters array:

                  $limit = "LIMIT ?, ?";
                  $parameters[] = $offset;
                  $parameters[] = $recordsPerPage;
                  

                  總裝

                  最后,您的查詢將是這樣的

                  The final assembly

                  In the end, your query will be something like this

                  $sql = "SELECT id, title, content, priority, date, delivery 
                          FROM tasks INNER JOIN ... $where ORDER BY `$orderField` $order $limit"; 
                  

                  并且可以使用以下代碼執行

                  And it can be executed using the following code

                  $stmt = $mysqli->prepare($sql);
                  $stmt->bind_param(str_repeat("s", count($parameters)), ...$parameters);
                  $stmt->execute();
                  $data = $stmt->get_result()->fetch_all(MYSQLI_ASSOC);
                  

                  其中 $data 是一個包含查詢返回的所有行的常規數組.

                  where $data is a conventional array contains all the rows returned by the query.

                  這篇關于如何使用 mysqli API 制作一個完全動態的準備語句?的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!

                  【網站聲明】本站部分內容來源于互聯網,旨在幫助大家更快的解決問題,如果有圖片或者內容侵犯了您的權益,請聯系我們刪除處理,感謝您的支持!

                  相關文檔推薦

                  store_result() and get_result() in mysql returns false(mysql 中的 store_result() 和 get_result() 返回 false)
                  Call to undefined function mysqli_result::num_rows()(調用未定義的函數 mysqli_result::num_rows())
                  PHP Prepared Statement Problems(PHP 準備好的語句問題)
                  mysqli_fetch_array returning only one result(mysqli_fetch_array 只返回一個結果)
                  PHP MySQLi Multiple Inserts(PHP MySQLi 多次插入)
                  How do I make sure that values from MySQL keep their type in PHP?(如何確保 MySQL 中的值在 PHP 中保持其類型?)

                    <bdo id='Ti3iU'></bdo><ul id='Ti3iU'></ul>

                    <small id='Ti3iU'></small><noframes id='Ti3iU'>

                    <i id='Ti3iU'><tr id='Ti3iU'><dt id='Ti3iU'><q id='Ti3iU'><span id='Ti3iU'><b id='Ti3iU'><form id='Ti3iU'><ins id='Ti3iU'></ins><ul id='Ti3iU'></ul><sub id='Ti3iU'></sub></form><legend id='Ti3iU'></legend><bdo id='Ti3iU'><pre id='Ti3iU'><center id='Ti3iU'></center></pre></bdo></b><th id='Ti3iU'></th></span></q></dt></tr></i><div class="qwawimqqmiuu" id='Ti3iU'><tfoot id='Ti3iU'></tfoot><dl id='Ti3iU'><fieldset id='Ti3iU'></fieldset></dl></div>
                    <legend id='Ti3iU'><style id='Ti3iU'><dir id='Ti3iU'><q id='Ti3iU'></q></dir></style></legend>

                          <tfoot id='Ti3iU'></tfoot>
                              <tbody id='Ti3iU'></tbody>
                          • 主站蜘蛛池模板: 国产精品成人免费视频 | 日韩黄色免费视频 | 午夜激情影院 | 成人三级晚上看 | 日韩精品在线一区 | 超碰av在线播放 | 福利在线播放 | 国产日本在线 | 久久久综合视频 | 自拍视频一区 | 日韩美女一区二区三区 | 亚洲精品久久 | 福利在线看 | 天海翼一区二区 | 日本一本视频 | 中文字幕不卡在线观看 | 超碰成人网| 91久久国产综合久久91精品网站 | 国产视频一二三 | 免费黄色一级 | 亚洲黄色影院 | 精品福利在线观看 | 久久少妇| 91福利网站| 国产精品久久一区二区三区 | 一级看片免费视频 | 97精品视频 | 午夜性福利 | 99午夜| 亚洲激情欧美激情 | 国产乱码一区二区三区 | 91福利在线观看 | 夜夜嗨av一区二区三区网页 | 日韩视频二区 | 日本a在线观看 | 国产成人在线免费观看 | 免费看黄色av| 亚洲最大黄色网址 | 国产成人一区二区 | 国产伦精品一区二区三区视频网站 | 激情小说五月天 |