2016-05-04 14 views
6

Der Code für die Abfrage zu erhalten ist ich versuche zu laufenzusätzliche Leerzeichen in CodeIgniter MySQL Query

$query = $this->db->select("*")->from('items')->like("replace(name, '=', ' ')", "foo bar", 'both')->get(); 

$items = $query->num_rows(); 

Mysql Query-String ist

SELECT replace(name, ' = ', ' ') FROM `items` 

Was der Code tut, ist ein Leerzeichen hinzugefügt vor und nach "=" beim Kompilieren der Abfrage, resultierend in "=", die keine Ergebnisse zurückgibt, da es keine Elemente mit "=" in ihren Namen gibt, nur "=".

foo=bar, replace(name, '=', ' ') returns 1 result. 
foo = bar, replace(name, ' = ', ' ') returns 0 results. 

Die Version von CodeIgniter, die ich verwende ist: 3.0.6

+0

Nicht sicher, warum Sie dies in mysql tun möchten? Es ist kein großartiger Ansatz. Sie möchten vielleicht eine Str ersetzen für die Zeichenfolge vor/nachdem Sie eine Abfrage an die db. – Philip

+0

@Philip Der Grund, warum ich das tue, ist, dass das, was ich ersetzen möchte, nicht immer das Gleiche ist, es funktioniert perfekt mit ".", "-" oder "+" zusammen, aber mit "=" passiert das Problem . – Joscplan

+0

geben Sie mir ein Beispiel, damit ich eine Lösung anbieten kann. – Philip

Antwort

6

ich das auf meine Kopie von CodeIgniter getestet haben und wenn wie diese formatiert funktioniert es ganz gut:

$items = $this->db->like("replace(name, '=', ' ')", "foo bar", 'both')->get('items')->num_rows(); 

Ein paar Anmerkungen:

  1. Sie brauchen nicht von(), Sie können die Tabelle einfach in die Methode get() einfügen.
  2. Sie können Ihre Methoden verketten, sodass Sie nur eine Variable zuweisen müssen.
  3. Wenn Sie die select() - Methode auslassen, müssen Sie auswählen ('*'). Diese Abfrage
2

Ihre Syntax

$query = $this->db->select("*")->from('items')->like("replace(name, '=', ' ')", "foo bar", 'both')->get(); 

als here in der Tat gezeigt

SELECT * FROM `items` WHERE replace(name, '=', ' ') LIKE '%foo bar%'; 

produziert Wenn es zufällig einen weiteren Raum zwischen foo und bar es funktioniert nicht.

Versuchen Sie, diese alternative Abfrage

SELECT * FROM `items` WHERE replace(name, '=', ' ') LIKE '%foo% bar%'; 

CodeIgniter

$query = $this->db->select('*')->from('items')->like("replace(name, '=', ' ')", "foo% bar", 'both')->get(); 

ODER diese Abfrage noch besser

SELECT * FROM `items` WHERE CONCAT(TRIM(SUBSTRING_INDEX(name, '=', 1)),' ',TRIM(SUBSTRING_INDEX(name, '=', -1))) LIKE '%foo bar%'; 

nicht diese

SELECT * FROM `items` WHERE replace(name, '=', ' ') LIKE '%foo%bar%'; 
012 Verwenden Sie

Die Ergebnisse dieser Abfragen angezeigt here

Entweder könnten Sie eine Frage haben, die entfernt die Vorder-/Hinterraum (Example)

2

Ich kann einen Methodenaufruf replace() in Zusammenhang mit codeigniter oder PHP finden.

Versuchen str_replace(find,replace,string)

Beispiel

$one = 'as = bb = cc=dd '; 
$var = str_replace('=', ' ', $one); 
echo $var; 

phpfiddle Preview

Und Refactoring nicht, Ihren Code in Ihrer Abfrage. Mach es sauber und gib es zur Abfrage weiter. Es ist leicht, Fehler zu verfolgen.

+1

'Ersetzen' Methode ist in MySQL verfügbar –

0

I verwendet

$this->db->query()

statt

$this->db->select(); 
$this->db->order_by(); 
$this->db->get(); 

und es für mich gearbeitet.

Meine Frage war:

$records = $this->db->select(
"id,(select count(*) from 
(select 
     unnest(string_to_array(mycol,',')) v 
     from mytable) t where v::int > 0) as total", 
FALSE)->order_by("col1")->get("mytable1")->result_array(); 

Ausgabe wurde, wurde es bei string_to_array(mycol,', ') einen zusätzlichen Raum Zugabe, die Fehler gab.