亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

什么時候在 PHP Mysqli 中使用準備好的語句?- 用戶表單搜索輸入與選擇查詢

什么時候在 PHP Mysqli 中使用準備好的語句?- 用戶表單搜索輸入與選擇查詢

PHP
Qyouu 2021-09-18 10:38:21
我試圖了解何時應該在 php/mysqli 中使用準備好的語句。每個 php/mysqli 查詢都應該使用準備好的語句還是只使用涉及用戶輸入的查詢和實例……例如要求用戶輸入數據以在數據庫中搜索的 html 表單?我正在將舊的 php5/mysql 代碼遷移到 php7/mysqli。我有許多查詢 mysql 數據庫的 php 文件。如果我需要為連接到 mysql db 的每個 php 文件使用準備好的語句,我想澄清一下……例如,通過“php require”引用的 php 文件并包含簡單的 sql select 語句來呈現圖像和指向 html 的鏈接頁?<?php//establish connection$con = new mysqli('localhost','uid','pw','db');//check connectionif ($con->connect_error) {die("Connection failed: " . $con->connect_error);  }//search variable that stores user input$search = "%{$_POST['search']}%";//prepare, bind and fetch$stmt = $con->prepare("SELECT image, caption FROM `tblimages`WHERE catid = 3 AND caption LIKE ? order by caption ASC");$stmt->bind_param("s", $search);$stmt->execute();$stmt->bind_result($image,$caption);while ($stmt->fetch()) {echo "{$image} <br> {$caption} <br>";    }$stmt->close();//close database connectionmysqli_close($con);?>上面的代碼有效并且是我第一次使用準備好的語句。它從表單(空白框輸入搜索詞 - POST)獲取用戶輸入并搜索 db ... 然后將結果呈現到 html 頁面。這似乎是準備好的語句的合乎邏輯的用法。但是...我有其他 php 文件,其中用戶從表單中的下拉框中選擇數據以呈現結果(用戶不會像上面那樣將數據輸入到搜索框中)。我是否也為該實例使用準備好的語句?另外,我是否對通過“php require”引用的 php 文件使用準備好的語句,并包含簡單的 sql select 語句來呈現圖像和指向 html 頁面的鏈接?我還沒有找到使用準備好的語句來防止 sql 注入的特定實例的說明。歡迎任何澄清或參考。
查看完整描述

2 回答

?
揚帆大魚

TA貢獻1799條經驗 獲得超9個贊

這是 MySQLi 準備好的語句在 PHP 中的工作方式:

準備一個以空值作為占位符的 SQL 查詢(每個值都有一個問號)。通過說明每個變量及其類型,將變量綁定到占位符。執行查詢。允許的四種變量類型:

i - 整數

d - 雙

s - 字符串

b - 斑點

準備好的語句,顧名思義,是一種準備 MySQL 調用的方法,而不存儲變量。你告訴它變量最終會去那里——只是還沒有。演示它的最佳方法是通過示例。

$stmt = $mysqli->prepare("SELECT * FROM myTable WHERE name = ? AND age = ?");

$stmt->bind_param("si", $_POST['name'], $_POST['age']);

$stmt->execute();

//fetching result would go here, but will be covered later

$stmt->close();

如果您以前從未見過準備好的語句,這可能看起來有點奇怪?;旧习l生的事情是您正在為 SQL 語句的內容創建模板。在本例中,我們從 myTable 中選擇所有內容,其中 name 和 age 等于 ?。問號只是值的位置的占位符。


bind_param() 方法是您將變量附加到準備好的模板中的虛擬值的地方。注意變量前的引號中有兩個字母。這告訴數據庫變量類型。s 指定 name 將是一個字符串值,而 i 強制 age 是一個整數。這正是我沒有在名稱的問號周圍添加引號的原因,就像我通常為 SQL 調用中的字符串所做的那樣。您可能認為我只是忘記了,但事實是根本沒有必要(事實上,如果您在 ? 周圍加上引號,它實際上將不起作用,因為它將被視為字符串文字,而不是一個虛擬占位符。)。


當您調用 bind_param() 時,您已經告訴它它將是一個字符串文字,因此即使惡意用戶嘗試將 SQL 插入到您的用戶輸入中,它仍將被視為字符串。$stmt->execute() 然后實際運行代碼;最后一行只是關閉準備好的語句。我們將在 Select 部分介紹獲取結果。


查看完整回答
反對 回復 2021-09-18
  • 2 回答
  • 0 關注
  • 172 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號