2016-05-04 13 views
6

Kod dla zapytania próbuję uruchomić toUzyskiwanie dodatkowych spacji w CodeIgniter zapytania MySQL

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

$items = $query->num_rows(); 

Mysql ciąg kwerendy jest

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

Co robi kod dodaje spację przed i po "=" przy kompilacji zapytania skutkującego "=", który nie zwraca wyników, ponieważ w ich nazwach nie ma elementów z "=", tylko "=".

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

Wersja CodeIgniter że używam jest: 3.0.6

+0

Nie wiesz, dlaczego chcesz to zrobić w mysql? To nie jest świetne podejście. Być może chciałbyś zastąpić str na ciągu przed/po wykonaniu zapytania do bazy danych. – Philip

+0

@Philip Powodem, dla którego to robię, jest to, że to co chcę zastąpić nie zawsze jest tym samym, działa idealnie z ".", "-" lub "+" razem, ale z "=" problem się dzieje . – Joscplan

+0

daj mi przykład, abym mógł zaoferować rozwiązanie. – Philip

Odpowiedz

6

ja testowałem to na moim kopią CodeIgniter i kiedy sformatowane tak to działa dobrze:

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

kilka uwag:

  1. Nie potrzebujesz z(), możesz po prostu wsunąć tabelę do metody get().
  2. Możesz połączyć swoje metody, więc potrzebujesz tylko jednej zmiennej.
  3. Pominięcie metody select() oznacza wybór ("*").
2

składni

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

jak pokazano here w rzeczywistości produkuje tego zapytania

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

Jeśli jest przypadkiem jedna przestrzeń między foo i bar to się nie powiedzie.

Spróbuj alternatywnego zapytania

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

CodeIgniter

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

lub niniejszego zapytania nawet lepiej

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

Nie używaj tego

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

Wyniki tych zapytań przedstawiono here

Albo można mieć kwerendę, która usuwa wiodącą/tylną przestrzeń (Example)

2

nie mogę znaleźć wywołanie metody replace() w związane z CodeIgniter lub PHP.

Spróbuj str_replace(find,replace,string)

Przykład

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

phpfiddle Preview

I nie byłaby kodu wewnątrz zapytania. Uczyń go czystym i przekaż do zapytania. Łatwo jest również śledzić błędy.

+1

Metoda 'replace' jest dostępna w MySQL –

0

użyłem

$this->db->query()

zamiast

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

i pracował dla mnie.

Moje zapytanie brzmiało:

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

Issue było, było dodanie dodatkowej przestrzeni na string_to_array(mycol,', ') który dawał błąd.

Powiązane problemy