1

$ _POST値からMySqlクエリを作成しようとすると、すべての$ _POST値を使用したくないので、値の名前を配列と比較して、それらが実際にDBにファイルされ、名前からクエリ文字列を作成する場合は値

これは私が今まで持っているものです

$i = 1;
$b = 1;

$cnt = count($_POST);

foreach ($_POST as $key => $entry)
{

$array = array('Country', 'County', 'Age', 'ect', 'ect');

foreach ($array as $arrayValue) {
    if ($arrayValue == $key) {
$b++;
        if($i == 1) {$query[] = "$key='$entry'";} 
         elseif($cnt == $b) {$query[] = "$key='$entry'";} 
           else {$query[] = "$key='$entry' AND ";}
$i++;
    }
}

}

$QUERY配列からすべての値を単一の文字列に変換する方法がわかりません。$search = "country='United Kingdom' AND county ='example'"

どんな助けでも大歓迎です。

4

5 に答える 5

1
$query = array();
$vars = array('Country', 'County', 'Age', 'etc1', 'etc2');
foreach ($vars as $v)
{
    if (isset($_POST[$v]))
    {
        $query[] = $v.' = "'.addslashes($_POST[$v]).'"';
    }
}
$query = implode(' AND ', $query);
于 2012-04-08T19:46:17.693 に答える
1

あなたは自分のために物事を複雑にしすぎています。使用する変数がわかっている場合は、それらを確認してクエリを作成します。

$sql = "SELECT * FROM mytable WHERE ";

$sql_array = array();

if(isset($_POST['A'])) { $sql_array[] = 'some_col_a = '.$_POST['A']; }
if(isset($_POST['B'])) { $sql_array[] = 'some_col_b = '.$_POST['B']; }
if(isset($_POST['C'])) { $sql_array[] = 'some_col_c = '.$_POST['C']; }

$sql .= implode(' AND ', $sql_array);

また、mysql 攻撃などをチェックする必要がありますが、これは純粋な基本です。

于 2012-04-08T19:48:09.143 に答える
1

提案するのは使用です:

A.大文字と小文字を区別しない使用strtolower

B. 使用する衛生 mysql_real_escape_string

C.in_array検証に使用する

D.implodeすべてをまとめる

$_POST['Country']  = "United Kingdom" ;
$_POST['County']  = "example" ;
$array = array('Country', 'County', 'Age', 'ect', 'ect');
$query = array();

foreach ($_POST as $key => $entry)
{
    if(in_array(strtolower($key), $array) || in_array($key, $array))  
    {
        $query[] = $key . " = '" . mysql_real_escape_string($_POST[$key]) . "'";

    }
}

$search = implode(" AND ", $query);
var_dump($search);

出力

string 'Country= 'United Kingdom' AND County= 'example'' (length=47)

オプション

// Optional 
// You array is inconsistent  and contains case sensitive values .. use can use this to convert them to small letters 
array_walk($array, "toLower");
function toLower(&$item, $key)
{
    $item = strtolower($item);
}
于 2012-04-08T19:58:50.460 に答える
0

機能を見てくださいimplode' AND '$glue パラメータとして使用する必要があります。

于 2012-04-08T19:46:33.803 に答える
0

PDO はいくつかの利点を提供します。パラメータ化されたクエリは言うまでもありません。必要なパラメーターのみをホワイトリストに登録し、SQL クエリを作成し、パラメーター化された PDO クエリを実行する方法を提供する要点を作成しました

  1. 行 08 ~ 18 は、これをテストするためのスクラッチ データベース/テーブルを構築するための SQL を提供します。
  2. 行 23 ~ 27 は、ホワイトリストと where 句の構築を処理します (「AND」を「OR」に置き換えるだけで、「ALL」ではなく「ANY」タイプのフィルターを構築できます)。
  3. 行 41 は、完全な SQL クエリを構築します。
  4. 行 50 は、パラメーター化されたクエリを実行します。

$parametersこの例に基づいて配列に含まれるものは次のとおりです。

array(3) {
  'Country' => string(3) "USA"
  'County'  => string(6) "Nassau"
  'Age'     => string(2) "21"
}

$whereClause:_

string(38) "Country = ? AND County = ? AND Age = ?"

$sql:_

string(72) "SELECT * FROM pdo_whitelist WHERE Country = ? AND County = ? AND Age = ?"

ソースのホワイトリスト部分 (完全なソースはhttps://gist.github.com/2340119にあります):

<?php

// whitelist parameters
$post_input = ['Country' => 'USA', 'County' => 'Nassau', 'Age' => 21, 'EscalatePriviledge' => true, 'MakeMeSuperUser' => 1];
$whitelist  = ['Country', 'County', 'Age'];
$parameters = array_map('trim', array_intersect_key($post_input, array_flip($whitelist)));
$wheres     = array_map(function($fieldName){ return "${fieldName} = ?"; }, array_keys($parameters));
$whereClause= join(' AND ', $wheres);
// you should validate and normalize here as well (see: php.net/filter_var)

クエリのパラメーター化を処理する PDO コード:

$statement = $pdo->prepare($sql);
$statement->execute(array_values($parameters));

最後に、参照用のリンクの概要を次に示します。

于 2012-04-08T22:53:12.527 に答える