2017-12-25 7 views
2

Ich benutze Codeigniter und versuche, eine kommagetrennte Liste von meinem Controller an das Modell zu übergeben, um es in einer where_not_in Abfrage zu verwenden. Ich habe den folgenden Code, um die durch Kommas getrennte Liste zu erstellen.Durch Komma getrennte Liste vom Controller zum Modell

die produziert die folgenden: Alcatel, Apple, Huawei, LG, Microsoft, Motorola, Nokia, Samsung, Sony. Meine Frage ist diese:

$this->db->select('name'); 
$this->db->from('wl_manufacturers'); 
$this->db->where('active', 1); 
$this->db->where('supplier_type', 'product'); 
$this->db->where_not_in('name', $str); 

$ str wobei die durch Kommata getrennte Liste

die Ausgabe von Profiler ist:

SELECT `name` 
FROM `wl_manufacturers` 
WHERE `active` = 1 
AND `supplier_type` = 'product' 
AND `name` NOT IN('Alcatel,Apple,Huawei,LG,Microsoft,Motorola,Nokia,Samsung,Sony') 

Dies scheint nicht zu arbeiten, weil es keine einfachen Anführungszeichen ist um jedes Element in der Liste. Aber wenn ich die Liste manuell wie folgt erstellen: $ array = array ('Alcatel', 'Apple', 'Huawei', 'LG', 'Microsoft', 'Motorola', 'Nokia', 'Samsung', 'Sony'). Es funktioniert und die Ausgabe von dem Profiler ist:

SELECT `name` 
FROM `wl_manufacturers` 
WHERE `active` = 1 
AND `supplier_type` = 'product' 
AND `name` NOT IN('Alcatel', 'Apple', 'Huawei', 'LG', 'Microsoft', 'Motorola', 
'Nokia', 'Samsung', 'Sony') 

Ich habe versucht, das Hinzufügen einfache Anführungszeichen in die durch Kommata getrennte Liste Elemente, bevor es auf das Modell übergeben:

$str = "'" . implode ("', '", $mnames) . "'"; 

aber die der Profiler-Ausgang ist dies :

SELECT `name` 
FROM `wl_manufacturers` 
WHERE `active` = 1 
AND `supplier_type` = 'product' 
AND `name` NOT IN('\'Alcatel\', \'Apple\', \'Huawei\', \'LG\', \'Microsoft\', 
\'Motorola\', \'Nokia\', \'Samsung\', \'Sony\'') 

Wieder funktioniert nicht, da Backslashes hinzugefügt worden sind. Die Frage ist also, wie kann ich eine durch Kommas getrennte Liste erstellen, sie an mein Modell übergeben und die Abfrage korrekt ausführen lassen?

Antwort

1

benötigen Sie eine durch Kommata getrennte string ($ str) zur Explosion ein Array

$arr=explode (',',$str) 

dann erstellen Sie es in Ihrer Abfrage wie

$this->db->where_not_in('name', $arr); 

sehen explode verwenden können: und CI where_not_in()

+0

Vielen Dank, nach Ihrer Antwort, bemerkte ich übergeben Komma getrennte Zeichenfolge in die Abfrage und nicht ein Array – David

+0

groß in der Lage zu helfen, schöne Ferien ... – Vickel

0

Scheint, dass $this->db->where_not_in erwartet ein Array von Werten ... oder, wenn eine Zeichenfolge übergeben wird, ist es die gleiche a Übergibt ein Array von einem Element, die Zeichenfolge. Wenn Sie mit einem Array beginnen, übergeben Sie das einfach an where_not_in. Aber wenn Sie mit einer Reihe von CSV beginnen, dann str_getcsv(my_string_of_csv), um ein Array zu erhalten, können Sie in where_not_in gehen.

HINWEIS: Sie möchten und nicht nur explode verwenden, wenn Ihre CSV-Zeichenfolge Whitespace, Escapezeichen und/oder Anführungszeichen enthält. Siehe: http://php.net/manual/en/function.str-getcsv.php

Verwandte Themen