У меня есть то, что я считаю обычным запросом в CakePHP – он работает для всех результатов, но когда в поле есть специальный символ, поле возвращается пустым. Он не сломается – и он по-прежнему дает мне остальные поля – это просто одно поле, пустое.
Пример:
$this->paginate = array( 'conditions' => array( 'Item.name != ' => '', ), ); $data = $this->paginate('Item');
Это вернет все элементы в моей таблице (в том числе тот, который, как я думал, имеет пустое поле имени), но когда я пытаюсь повторить имя на странице, он работает для каждого элемента, кроме одного со специальным символом (é) , Я изменил его на нормальный «e», и он выглядит хорошо.
Как я могу вернуть результаты, даже если у них есть специальный символ в их имени? Заранее спасибо!
Убедитесь, что ваша база данных использует правильную кодировку (в идеале, UTF-8), и вы настроили Cake для использования этой же кодировки в config/database.php
:
class DATABASE_CONFIG { public $default = array( ... 'encoding' => 'utf8' ); }
Если у вас есть некорректное кодирование, ваше приложение, вероятно, уже хранило мусор в базе данных, поэтому убедитесь, что вы проверили правильные данные и / или новую базу данных.
Вероятно, это меньше проблем с Cake-спецификой и больше проблем с PHP / MySQL. (Другие уже создали кодировку, поэтому я пропущу это.)
Одиночные кавычки означают, что буквальная строка передается MySQL: 'Item.name != ' => ''
PHP (a la Cake), вероятно, разбирает эту строку буквально. На самом деле, возможно, он даже разгладит его так:
"Item.name != "
(обратите внимание, что после операнда ничего нет, и если он будет последним в SQL-запросе, запрос не будет ошибкой, он, вероятно, все равно будет работать!)
Когда вы предназначались для тестирования:
"Item.name != ''"
(обратите внимание на точные одинарные кавычки, которые теперь включены в строку)
Однако, поскольку вы не получаете ошибку – и остальная часть данных тянет! – вы, вероятно, хотите отредактировать этот оператор, потому что ваша проблема скорее синтаксис.
'Item.name IS NOT NULL' 'Item.name <> ' => '' 'Item.name IS NOT' => ''
Попробуй попробовать.
http://dev.mysql.com/doc/refman/5.6/en/comparison-operators.html, описывающий IS NOT NULL vs. IS NOT (bool) vs <> и! = (не равно).
HTH 🙂