2010-10-04 3 views
0
$test=$_POST['Cities']; 
foreach ($test as $t){ 
$query .= " AND u.bostadsort = \'".$t."\'"; 
} 

J'ai pour monPHP: la construction de requête de tableau foreach

<select size="6" name="Cities[]" multiple="multiple"> 
    <option value="">All</option> 
    <option value="1">C1</option> 
    <option value="2">C2</option> 
    <option value="3">S3</option> 
    <option value="4">S4</option> 
    <option value="5">S5</option> 
</select> 

Mais sa ne va pas du tout. Ce que j'essaye de faire est quand vous choisissez les villes (dans le formulaire de recherche), il place toutes les valeurs dans un tableau.

Maintenant, je voudrais avoir écrire comme ça, si vous prise, par exemple 2, 4, 5

AND u.bostadsort = '2' OR u.bostadsort = '4' OR u.bostadsort = '5' 

(peut-être que vous pourriez faire cela plus facile, mais c'est la seule façon que je connaisse, en utilisant "OU")

Donc, si vous avez choisi plus de 1 alors il devrait être OU, au lieu de l'ET j'ai.

Peut-être que je l'ai fait dans une mauvaise façon, et il y a une meilleure méthode faisant que foreach ..

Comment puis-je faire cela?

Répondre

4

Vous pouvez utiliser à la place IN, ce qui vous permet de fournir plusieurs valeurs:

if (is_array($_POST['Cities'])) 
{ 
    // If multiple values were selected, handle them 
    $cities = array(); 
    foreach ($_POST['Cities'] as $city) 
    { 
    if (!empty($city)) 
    { 
     $cities[] = mysql_real_escape_string($city); 
    } 
    } 
} 
elseif (!empty($_POST['Cities'])) 
{ 
    // ... or was a single, non-empty value passed in? 
    $cities = array(mysql_real_escape_string($_POST['Cities'])); 
} 

if (count($cities)) 
{ 
    $query .= " AND u.bostadsort IN ('" . join("', '", $cities) . "')"; 
} 

Notez que je passe chaque valeur par mysql_real_escape_string avant de l'utiliser dans la requête; ceci est fait pour empêcher SQL injection. Si vous n'utilisez pas MySQL, les autres SGBDR ont des fonctions similaires.

Voir http://www.ideone.com/UVXuu un exemple (ideone ne semble pas avoir MySQL activé, de sorte que les appels à mysql_real_escape_string sont supprimés).

Alternativement, vous pouvez utiliser prepare et execute méthodes de PDO:

$cities = $_POST['Cities']; 
if (count($cities)) 
{ 
    $query .= " AND u.bostadsort IN (?" . str_repeat(', ?', count($cities) - 1) . ")"; 
} 

// $db is a PDO object 
$stmt = $db->prepare($query); 
$stmt->execute($cities); 

(Bien sûr, cette solution ne tient pas la façon dont vous construisez le reste de votre requête parce que vous ne donnez pas à votre question, donc vous voudriez paramétrer les autres parties aussi.)

+0

La première solution, fonctionne très bien! Comment puis-je vérifier si c'est vide? if (empty (join ($ cities))? – Johnson

+0

Vous pouvez cocher 'empty ($ cities)' (pas besoin de 'join') ou' count ($ cities) == 0' –

+0

Im getting Attention: array_map() [function.array-map]: Argument # 2 devrait être un tableau – Johnson