Длинный текст pdo/json иногда возвращает значение null

У меня есть таблица с содержимым, извлеченным из страницы pdf-файла (отдельная строка для каждой страницы). Он отлично работает, но некоторые из моих результатов возвращаются как нулевые, даже если содержимое существует в строке таблицы? Почему некоторые возвращаются как null?

$q = isset($_REQUEST['q']) && $_REQUEST['q'] != "" ? $_REQUEST['q'] : null;

$statement = $this->connection->prepare("SELECT number, content FROM page WHERE folio_id = :folio_id AND content LIKE :q");
$statement->setFetchMode(\PDO::FETCH_CLASS, get_class(new PageVO()));

if($statement->execute(array("folio_id" => $folio_id, "q" => "%" . $q . "%"))) {
    return $statement->fetchAll();
}

в моем выходном файле

header('Content-type: application/json');
echo json_encode(array("search" => $searchVO));

Скриншот прилагается. json

база данных mysql

После добавления атрибута длины length


person user2727195    schedule 05.05.2014    source источник
comment
get_class(new PageVO()) ‹--- что это? о_О   -  person zerkms    schedule 05.05.2014
comment
get_class(new PageVO()) возвращает строковую версию пути к классу с именем пакета, личное предпочтение, так как я не хочу писать строки в коде (полезно при рефакторинге)   -  person user2727195    schedule 05.05.2014
comment
Почему некоторые возвращаются как null? --- это просто. Потому что нет данных, удовлетворяющих пункту WHERE.   -  person zerkms    schedule 05.05.2014
comment
мой вопрос заключается в том, почему некоторые записи (поле содержимого) возвращаются как нулевые, в то время как в бэкэнд-таблице есть записи. content представляет собой длинное текстовое поле.   -  person user2727195    schedule 05.05.2014
comment
@zerkms, как мне избежать нулевого значения в моих строках? Я не хочу отображать записи с пустым содержимым.   -  person user2727195    schedule 05.05.2014
comment
вы используете if для реализации условной логики в php. Или может быть IS NOT NULL сравнение прямо в запросе.   -  person zerkms    schedule 05.05.2014
comment
@zerkms ГДЕ контент LIKE '%the%' не должен изначально включать пустые строки.   -  person user2727195    schedule 05.05.2014
comment
в моей базе данных нет нулей, прикрепил второй скриншот   -  person user2727195    schedule 05.05.2014
comment
используйте var_dump, чтобы увидеть фактические значения для объектов, которые вы сериализуете с помощью json_encode (на самом деле странно, что вы используете какой-то промежуточный тип вместо простых массивов для такого рода задач)   -  person zerkms    schedule 05.05.2014
comment
ничего не видно на var_dump, возможно ли, что в содержимом есть некоторые символы, из-за которых json_encode возвращает значение null, если это так, как это исправить   -  person user2727195    schedule 05.05.2014
comment
ничего не видно --- что ты имеешь в виду? Пустой экран? Знаете ли вы, что json_encode работает с только utf-8 закодированными данными?   -  person zerkms    schedule 05.05.2014
comment
Можете ли вы привести пример текста, который не отображается? Возможно, создайте pastebin.   -  person Phil    schedule 05.05.2014
comment
@Phil, 3-я, 7-я и 9-я строки (pastebin.com/hCJ5Gq8p, pastebin.com/VuDEkZvE, pastebin.com /mri2p6sX)   -  person user2727195    schedule 05.05.2014
comment
@user2727195: ЭТО НЕ оригинал (см. проблемные данные), поскольку он без проблем кодируется json_encodable: ideone. com/6H2Eya Возможно, вы не скопировали некоторые невидимые (или поврежденные) символы utf-8.   -  person zerkms    schedule 05.05.2014
comment
@zerkms это вполне возможно, но таблица была заполнена с помощью утилиты pdftotext, страница за страницей, а затем вставлена ​​в базу данных. моя база данных имеет сортировку по умолчанию utf-8   -  person user2727195    schedule 05.05.2014
comment
Кстати, вот короткая демонстрация того, как данные могут быть нарушены: ideone.com/ShmTQa   -  person zerkms    schedule 05.05.2014
comment
@ user2727195: в моей базе данных используется сопоставление по умолчанию utf-8 --- кодировки не имеют ничего общего с сопоставлением. Это просто то, как сравниваются символы (да, все кодировки/кодировки сложны)   -  person zerkms    schedule 05.05.2014
comment
@zerkms Фил, это проблема с utf-8, эта строка решила проблему. $this-›connection-›exec(SET CHARACTER SET utf8);   -  person user2727195    schedule 05.05.2014


Ответы (1)


Это происходит из-за того, что некоторые из ваших строк неправильно utf-8 закодированы.

В этом случае json_encode возвращает null.

person zerkms    schedule 05.05.2014
comment
как я могу их закодировать, содержимое фактически извлекается из файлов PDF через pdftotext, сохраняется в файле .txt и затем отправляется в базу данных. - person user2727195; 05.05.2014
comment
@ user2727195: это зависит. Сначала - найти то, что сломано, тогда можно будет придумать решение. - person zerkms; 05.05.2014
comment
@user2727195 user2727195 Я бы для начала хотя бы убедился, что вы используете кодировку UTF-8 в соединении с базой данных. Ваш конструктор PDO dsn должен иметь ;charset=utf8 - person Phil; 05.05.2014
comment
Хорошо, я действительно добавил сейчас, пожалуйста, просмотрите, $this-›connection = new \PDO('mysql:host=' . $this-›hostname . ';dbname=' . $this-›database . ';charset=utf- 8', $this-›имя пользователя, $this-›пароль); пишет неизвестная кодировка - person user2727195; 05.05.2014
comment
@ user2727195: что это? Вы заметили, что Фил не использовал тире в названии кодировки? - person zerkms; 05.05.2014
comment
сработало, добавил этот $this-›connection-›exec(SET CHARACTER SET utf8); - person user2727195; 05.05.2014
comment
убрал тире, dsn тоже работает. $this-›connection = new \PDO('mysql:host=' . $this-›hostname . ';dbname=' . $this-›database . ;charset=utf8, $this-›username, $this-› пароль); - person user2727195; 05.05.2014
comment
@user2727195: user2727195: решение DSN предпочтительнее - person zerkms; 05.05.2014