2017-09-26 14 views
0

Je sais comment effectuer une SQL LIKE% requête pour une seule valeur comme ceci:instruction Select avec clause where Comme dans le tableau

$sql = "SELECT * FROM Farmers WHERE Available_products LIKE ('%Bananas%')";

mais comment puis-je faire si les termes de recherche pour mon COMME vient d'un tableau? Par exemple, disons que nous avons un tableau comme celui-ci:

$_POST['Products']="Cacaos,Bananas"; 
$array=implode(',', $_POST['Products']); 
$sql = "SELECT * FROM Farmers WHERE Available_products LIKE ('%$array%')"; 

Je veux obtenir tous les enregistrements dans la base de données que la colonne Available_Products contient Cacaos ou les bananes ou les deux

+1

Essayez d'utiliser sql où dans – Akintunde007

+0

'LIKE « % Bananas% 'OU LIKE'% Cacaos% 'OU LIKE'% AnythingElse% '' –

+2

@Akintunde' IN' fait une correspondance exacte, pas de motifs. – Barmar

Répondre

1

Convertir le tableau à une expression régulière et utiliser REGEX au lieu de LIKE

$_POST['Products'] = array('Cacaos', 'Bananas'); 
$regex = implode('|', $_POST['Products']); 
$sql = "SELECT * FROM Farmers WHERE Available_products REGEX :regex"; 
$stmt = $pdo->prepare($sql); 
$stmt->bindParam(':regex', $regex); 
$stmt->execute(); 
+0

@Barmar Par curiosité, est-ce que ce REGEX fonctionnerait généralement mieux qu'un nombre raisonnable d'instructions OR (disons 10 éléments dans le tableau)? Par exemple '$ where =" WHERE Available_products like '% ". implode ("% 'ou Available_Products comme'%", $ _POST ['Products']). "% '"; 'Puisque cela ne sert à rien d'utiliser l'index? – RToyo

+0

Il faudrait que vous le référenciez pour être sûr, mais je m'attendrais à ce qu'il soit à peu près identique ou meilleur. Aucun d'entre eux ne peut utiliser des index. – Barmar

0

Vous pouvez essayer avec l'aide de REGEXP.

$_POST['Products']="Cacaos,Bananas"; 
$array=implode('|', $_POST['Products']); 
$sql = "SELECT * FROM Farmers WHERE 
       Available_products REGEXP". $array;  
+0

J'ai eu cette erreur 'Erreur fatale: PDOException Uncaught: SQLSTATE [42000]: Erreur de syntaxe ou violation d'accès: 1064 Vous avez une erreur dans votre syntaxe SQL; consultez le manuel qui correspond à votre version du serveur MariaDB pour la bonne syntaxe à utiliser près de 'Bananas' à la ligne 2' – NewDeveloper

+0

Si vous n'utilisez pas une instruction préparée, vous avez besoin de guillemets autour de l'expression rationnelle. – Barmar

0

Vous pouvez aussi faire quelque chose comme:

// Populating join table.  
CREATE TABLE temp_table_myArray (myArray nvarchar(255)); 
    INSERT INTO temp_table_myArray (myArray) VALUES ('Cacaos'); 
    INSERT INTO temp_table_myArray (myArray) VALUES ('Bananas'); 

// Query using the join table. 
    SELECT F.* 
    FROM Farmers AS F 
     INNER JOIN temp_table_myArray AS T ON (F.Available_products LIKE(CONCAT('%',T.myArray,'%'))); 

Mais je pense qu'il ya une meilleure façon de PHP pour résoudre votre problème ...