ホームページ >データベース >mysql チュートリアル >準備されたステートメントで動的テーブル名とフィールド名を安全に使用するにはどうすればよいですか?
準備されたステートメントを使用して識別子とキーワードをバインドする
問題:
動的クエリの作成プリペアドステートメントを使用していますが、テーブル名、フィールド名、または構文キーワードの結果は空の配列になります。
コード:
function search_db($db, $searchTerm, $searchBy, $searchTable){ try{ $stmt = $db->prepare(' SELECT * FROM ? WHERE ? LIKE ? '); $stmt->bindParam(1, $searchTable); $stmt->bindParam(2, $searchBy); $stmt->bindValue(3, '%'. $searchTerm.'%'); $stmt->execute(); } catch(Exception $e) { return array(); } return $stmt->fetchAll(PDO::FETCH_ASSOC); }
期待される結果:
データベースからの結果の配列.
実際結果:
空の配列
原因:
準備されたステートメントはデータ リテラルのみをバインドでき、識別子 (テーブル名やフィールド名など) や構文はバインドできません。キーワード。
解決策:
動的識別子またはキーワードを使用するには、次の手順に従います。
識別子の形式:
ホワイトリスト動的値:
変更済みコード:
$field = "`" . str_replace("`", "``", $field) . "`"; $table = "`" . str_replace("`", "``", $table) . "`"; $sql = "SELECT * FROM $table WHERE $field = ?";
キーワード:
必要に応じて、動的キーワードもホワイトリストに登録して検証します。これらのガイドラインに従うことで、準備されたステートメントに動的識別子とキーワードを安全に含めることができます。
以上が準備されたステートメントで動的テーブル名とフィールド名を安全に使用するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。