第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

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

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

PHP
Qyouu 2021-09-18 10:38:21
我試圖了解何時應(yīng)該在 php/mysqli 中使用準(zhǔn)備好的語句。每個 php/mysqli 查詢都應(yīng)該使用準(zhǔn)備好的語句還是只使用涉及用戶輸入的查詢和實例……例如要求用戶輸入數(shù)據(jù)以在數(shù)據(jù)庫中搜索的 html 表單?我正在將舊的 php5/mysql 代碼遷移到 php7/mysqli。我有許多查詢 mysql 數(shù)據(jù)庫的 php 文件。如果我需要為連接到 mysql db 的每個 php 文件使用準(zhǔn)備好的語句,我想澄清一下……例如,通過“php require”引用的 php 文件并包含簡單的 sql select 語句來呈現(xiàn)圖像和指向 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);?>上面的代碼有效并且是我第一次使用準(zhǔn)備好的語句。它從表單(空白框輸入搜索詞 - POST)獲取用戶輸入并搜索 db ... 然后將結(jié)果呈現(xiàn)到 html 頁面。這似乎是準(zhǔn)備好的語句的合乎邏輯的用法。但是...我有其他 php 文件,其中用戶從表單中的下拉框中選擇數(shù)據(jù)以呈現(xiàn)結(jié)果(用戶不會像上面那樣將數(shù)據(jù)輸入到搜索框中)。我是否也為該實例使用準(zhǔn)備好的語句?另外,我是否對通過“php require”引用的 php 文件使用準(zhǔn)備好的語句,并包含簡單的 sql select 語句來呈現(xiàn)圖像和指向 html 頁面的鏈接?我還沒有找到使用準(zhǔn)備好的語句來防止 sql 注入的特定實例的說明。歡迎任何澄清或參考。
查看完整描述

2 回答

?
揚帆大魚

TA貢獻1799條經(jīng)驗 獲得超9個贊

這是 MySQLi 準(zhǔn)備好的語句在 PHP 中的工作方式:

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

i - 整數(shù)

d - 雙

s - 字符串

b - 斑點

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

$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();

如果您以前從未見過準(zhǔn)備好的語句,這可能看起來有點奇怪。基本上發(fā)生的事情是您正在為 SQL 語句的內(nèi)容創(chuàng)建模板。在本例中,我們從 myTable 中選擇所有內(nèi)容,其中 name 和 age 等于 ?。問號只是值的位置的占位符。


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


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


查看完整回答
反對 回復(fù) 2021-09-18
  • 2 回答
  • 0 關(guān)注
  • 162 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號