2016-03-22 6 views
0

ウェブサイトのデータベースアクセスのセキュリティを向上させたいと考えており、一般的なコンセンサスは準備済みのステートメントを使用するようです。私はどのように動作するのか考えていますが、私は彼らの使い方を一般化したいので、私が提供する必要があるのはクエリ、パラメータタイプ、値だけです。しかし、私はこれに関して特に優れたリソースは見つけられていません。その結果、私はこれにどのようにアプローチすべきかについて一種の迷いがあります。複数の値を使用したプリペアドステートメント

基本的には、私が欲しいのは以下の通りです。

$query = "SELECT * FROM Table WHERE Column1 = ? AND Column2 = ?"; 

$array[0] = "string"; 
$array[1] = 5; 
$parameters = "si"; 

$dbHandler = new mysqli("server", "user", "password", "database"); 

$stmt = $dbHandler->prepare($query); 
$stmt->bind_param($parameters, $array); 
$stmt->execute(); 

//Process results 

私はこれが適切な手順ではないことを認識していますが、それが問題です。この仕事をするために私は何ができますか?その考え方は、$array内の変数の数が変わる可能性があり、パラメータリストも変わる可能性があります。

+0

あなたが達成しようとしていることは私には分かりません。あなたが提供したいのは、「クエリ、パラメータの型、値」だけです。つまり、準備された文がどこでもすべてのケースで既に動作しています。 – VoteyDisciple

+0

アレイの部分は私が知らないものです。プリペアドステートメントの標準的な使い方は 'bind_param(" sss "、$ s1、$ s2、$ s3);'のような値をリストすることですが、3つの文字列変数の代わりに配列を使いたいと思います。 – user3521737

+0

申し訳ありませんが、私はmysqliでこれをやっていることを忘れていました。私はPDOだと思っていました。 (ちょうど切り替えるだけで構文が重要な場合は、ここで実行可能なオプションが「PDOを使用する」かもしれません。) – VoteyDisciple

答えて

0

私は、クエリ、パラメータ型、および値が必要です。ここで

あなたが行く:

あなたが説明した正確な方法で使用することができます
function mysqli_query_params($mysqli, $query, $params, $types = NULL) 
{ 
    $statement = $mysqli->prepare($query); 
    $types = $types ?: str_repeat('s', count($params)); 
    $statement->bind_param($types, ...$params); 
    $statement->execute(); 
    return $statement; 
} 

:時間のほとんどは、あなたが明示的にタイプを設定しないようにし、それらがマウンドも聞かせできることを

$query = "SELECT * FROM Table WHERE Column1 = ? AND Column2 = ?"; 
$params = ["string", 5]; 
$types = "si"; 
$mysqli = new mysqli("server", "user", "password", "database"); 

$data = mysqli_query_params($mysqli, $query, $params, $types)->get_result()->fetch_all(); 

注意をデフォルトでは文字列として扱われます。

しかし、実際のところ、PDOはraw mysqliよりも使い易いので、使い方が分かります。 this tutorial

P.S.から学ぶことができます。このコードを実行するには、PHP> = 5.6およびmysqlndがインストールされている必要があります。さもなければ、コードの量は10倍に増えます。それがPDOを使うもう一つの理由です。

+0

あなたはPHP 5.6+ – Nergal