2012-04-08 8 views
1

Ich versuche, eine MySql-Abfrage aus den $ _POST-Werten erstellen Problem ist, ich möchte nicht alle $ _POST-Werte verwenden, da einige für andere Dinge verwendet werden, so versuche ich zu vergleichen Wertnamen gegen eine Anordnung, um zu sehen, ob sie in der DB dann eingereicht tatsächlich sind, wenn sie eine Abfragezeichenfolge aus den Namen einen Wert

dies schaffen, was ich habe bis jetzt

$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++; 
    } 
} 

} 

ich habe Jetzt bin ich nicht mehr sicher, wie man alle Werte aus dem $ QUERY-Array in eine einzige Zeichenfolge umwandelt, dh $search = "country='United Kingdom' AND county ='example'"

Jede Hilfe wäre sehr willkommen.

+1

Tun Sie es nicht so. Verwenden Sie [vorbereitete Anweisungen] (http://php.net/manual/en/pdo.prepared-statements.php). –

Antwort

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); 
+1

'addslashes' ist nicht der richtige Weg, um MySQL-Daten zu entziehen. Verwenden Sie mysql_real_escape_string, z. Das richtige Trennzeichen in MySQL ist das einfache Anführungszeichen. – Ryan

0

Schauen Sie sich implode Funktion an. Sie sollten ' AND ' als $ glue-Parameter verwenden.

1

Sie sind vorbei Dinge für sich selbst zu erschweren. Wenn Sie wissen, welche Variablen Sie verwenden möchten, einfach für sie überprüfen und bauen Sie Ihre Abfrage:

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

Sie auch etc überprüfen gegen mysql Angriffe müssten, aber das ist die reine Grundlagen.

1

Was ist vorschlagen, ist die Verwendung:

A. Case Insensitive mit strtolower

B. Sanitation mit mysql_real_escape_string

C. in_array zur Validierung Mit

D. implode alles zusammen zu bringen

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

Ausgabe

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

Optional

// 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); 
} 
+0

Warum möchten Sie die Groß-/Kleinschreibung beachten? Du könntest es ohne das auch viel weniger kompliziert machen. – Ryan

+0

Schau dir sein Array an. Es enthält sowohl 'Country' als auch' ect'. Ich denke, es ist inkonsistent und das könnte ihm Probleme bereiten. – Baba

+0

Und was ist mit $ array ['A'] 'vs' $ array [' ein '] '? PHP ist case-sensitive, vergiss das nicht! – Botanick

0

PDO wird Ihnen mehrere Vorteile zur Verfügung zu stellen; Ganz zu schweigen von parametrisierten Abfragen. Ich habe created a gist, die Ihnen eine Möglichkeit bietet, nur die gewünschten Parameter auf die weiße Liste zu setzen, eine SQL-Abfrage zu erstellen und eine parametrierte PDO-Abfrage auszuführen.

  1. Die Zeilen 08 - 18 bieten Ihnen SQL zum Erstellen einer Scratch Datenbank/Tabelle, um dies zu testen.
  2. Die Zeilen 23 - 27 behandeln die Whitelist und WHERE Klausel Gebäude (ersetzen Sie einfach 'UND' durch 'ODER', um einen "ANY" Typ Filter anstelle eines "ALL" zu erstellen)
  3. Zeile 41 erstellt die vollständige SQL-Abfrage
  4. Zeile 50 führt die parametrisierte Abfrage aus.Hier

ist, was die $parameters Array enthalten auf unserem Beispiel würde auf Basis:

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

Die $whereClause:

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

Die $sql:

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

Der weiße Liste Teil von der Quelle (vollständige Quelle ist bei 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) 

Der PDO-Code, der die Abfrage behandelt Parametrisierung:

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

schließlich hier eine Zusammenfassung der Links für Ihre Referenz: