2016-12-29 8 views
1

私はユーザーがpgsqlクエリを生成するためにドロップダウンメニューを使用しています。しかし、これは完全に動作しますが、私は現在、複数の選択肢を使用するように変換しようとしています。私は2つの別々の問題に遭遇しました。私が複数を追加すると、それはもはやドロップダウンリストではなく、スクロールホイールのように振る舞います。注釈として、オプションは最初のdbクエリによって設定されます。私は複数のオプションを選択することができる午前-While私はpgsqlクエリでPHPの同じビット2つの問題を持っています

<select multiple name="userSite" class="form-dropdown validate[required]"> 

、クエリだけではなく、選択したオプションのすべての結果よりも、最初に選択を返しています。

ini_set('error_reporting', E_ALL); 
ini_set("display_errors", 1); 

$site= $_POST["userSite"]; 
$datea= $_POST["userDatea"]; 
$table= $_POST["userTable"]; 
$datez= $_POST["userDatez"]; 

// You need to do all of this if and only if this is a post request 
// Also this method of detecting a post request is more consistent 
if(!empty($_SERVER['REQUEST_METHOD']) && (strcasecmp($_SERVER['REQUEST_METHOD'], 'post')===0) ) { 
    // Create connection 
    $conn = pg_connect("host=xxxxxxxxxx port=xxxx dbname=db user=xxx password=mypassword"); 

    // Check connection 
    if (!$conn) { 
     echo "Did not connect.\n"; 
     exit; 
    } 

    $result = pg_query($conn, 
     "SELECT * 
     FROM 
     db.$table 
     WHERE 
     $table.site_id = '$site' AND 
     $table.created_on BETWEEN '$datea' AND '$datez' AND 
     $table.soft_delete_id = '0';"); 

if (!$result) { 
echo "Query failed.\n"; 
exit; 
} 
$num_fields = pg_num_fields($result); 
$headers = array(); 

for ($i = 0; $i < $num_fields; $i++) 
{ 
    $headers[] = pg_field_name($result , $i); 
} 

$fp = fopen('php://output', 'w'); 
if ($fp && $result) 
{ 
     header('Content-Type: text/csv'); 
     header('Content-Disposition: attachment; filename="customreport.csv"'); 
     header('Pragma: no-cache'); 
     header('Expires: 0'); 
     fputcsv($fp, $headers); 

     while ($row = pg_fetch_row($result)) 
     { 
      fputcsv($fp, array_values($row)); 
     } 
     die; 

} 
    exit('It works'); 
} 

答えて

1

name="userSite[]"に名前属性を設定する必要があります。humbolightが推奨されています。しかし、それは問題の半分にすぎません。もう1つの問題は、データベースクエリです。 できません複数のサイトを検索し、SQLインジェクションまでコードを開きます。

代わりにこれを試してみてください:

$site= $_POST["userSite"]; // this will be an array. 
$datea= $_POST["userDatea"]; 
$datez= $_POST["userDatez"]; 
$table= $_POST["userTable"]; 

// verify that $table is a valid name since it can't be parameterized in the query. 

if($table !== 'my_table' 
    || $table !== 'my_other_table'){ 
    // exit due to possible sql injection. 
    exit(); 
} 

$params = array(); 
$params[] = $datea; // $1 
$params[] = $datez; // $2 

// generate the site query params 
// we need a string like this: $3, $4, $5, etc. (one for each site selected) 
$site_param_ids = array(); 
foreach($site as $s){ 
    $params[] = $s; 
    $site_param_ids[] = '$' . count($params); 
} 
$site_param_ids = implode(', ', $site_param_ids); 

$sql = "SELECT 
      * 
     FROM db.$table t 
     WHERE t.soft_delete_id = '0' 
      AND t.created_on BETWEEN $1 AND $2 
      AND t.site_id in ($site_param_ids);"; 
// 

$result = pg_query_params($conn, $sql, $params); 
+0

は、ご返信いただきありがとうございます。私はあなたがやっていることを理解していますが、 "implode"との切断があるようです...私は[]で名前属性を設定しましたが、投稿を送信するときに次のエラーが発生します... – KevMoe

+0

implode()[ function.implode]:引数は、行24の/home2/rightme1/public_html/networks/gsreports/custom.phpの配列である必要があります – KevMoe

+0

不足しているパラメータを修正しました。 –

2

私はあなたの例では、それはname="UserSite[]"だろう、あなたのselect要素のname属性に[]を追加する必要が信じています。これにより、単一の値ではなく、値の配列になる$_POST['UserSite']としてアクセスされる1つの$ _POST変数に複数の値をカプセル化することができます。

関連する問題