Не работает поиск с русскими буквами
Я делаю таблицу с помощью DataTable, но все обрабатываю на стороне сервера. Все данные выводит корректно (русские тоже), но вот поиск с русскими буквами не работает.
index.php
<!DOCTYPE html>
<html >
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Language" content="ru">
<link rel="stylesheet" type="text/css" href="DataTables/datatables.min.css">
<script type="text/javascript" charset="utf8" src="DataTables/datatables.min.js"></script>
</head>
<body>
<table id='empTable' class='display dataTable'>
<thead>
<tr>
<th><b>Наименование</b></th>
<th><b>Номер документа</b></th>
<th><b>Формат</b></th>
<th><b>Подлинник<br>Инвентарный номер</b></th>
<th><b>Подлинник<br>Дата поступления</b></th>
<th><b>Дубликат<br>Инвентарный номер</b></th>
<th><b>Дубликат<br>Дата поступления</b></th>
<th><b>Применяемость<br>Обозначение</b></th>
<th><b>Применяемость<br>Шифр индекса изделия</b></th>
<th><b>Для отметок</b></th>
<th><b>Литера</b></th>
</tr>
</thead>
</table>
</body>
</html>
<script>
$(document).ready(function(){
$('#empTable').DataTable({
'processing': true,
'serverSide': true,
"lengthMenu": [[10, 25, 50, 1000000000], [10, 25, 50, "All"]],
"pageLength": 25,
dom: 'lfBrtip',
buttons: [
'excelHtml5'
],
language: {
"processing": "Подождите...",
"search": "Поиск:",
"lengthMenu": "Показать _MENU_ записей",
"info": "Записи с _START_ до _END_ из _TOTAL_ записей",
"infoEmpty": "Записи с 0 до 0 из 0 записей",
"infoFiltered": "(отфильтровано из _MAX_ записей)",
"infoPostFix": "",
"loadingRecords": "Загрузка записей...",
"zeroRecords": "Записи отсутствуют.",
"emptyTable": "В таблице отсутствуют данные",
"paginate": {
"first": "Первая",
"previous": "Предыдущая",
"next": "Следующая",
"last": "Последняя"
},
"aria": {
"sortAscending": ": активировать для сортировки столбца по возрастанию",
"sortDescending": ": активировать для сортировки столбца по убыванию"
},
"select": {
"rows": {
"_": "Выбрано записей: %d",
"0": "Кликните по записи для выбора",
"1": "Выбрана одна запись"
}
}
},
'serverMethod': 'post',
'ajax': {
'url':'back_2.php'
},
'columns': [
{ data: 'DocumentName' },
{ data: 'DocumentNumber' },
{ data: 'DocumnetFormat' },
{ data: 'OriginalInventoryNumber' },
{ data: 'OriginalDataSupplay' },
{ data: 'DuplicationInventoryNumber' },
{ data: 'DuplicationDataSupplay' },
{ data: 'DesignationApplicability' },
{ data: 'CypherApplicability' },
{ data: 'ForMarks' },
{ data: 'Letter' },
],
});
});
</script>
back_2.php
<?php
try {
$conn = new PDO('mysql:dbname=my_in;host=localhost',
'Admin',
'8Admin702',
array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'"));
} catch (PDOException $e) {
die($e->getMessage());
}
## Read value
$draw = $_POST['draw'];
$row = $_POST['start'];
$rowperpage = $_POST['length']; // Rows display per page
$columnIndex = $_POST['order'][0]['column']; // Column index
$columnName = $_POST['columns'][$columnIndex]['data']; // Column name
$columnSortOrder = $_POST['order'][0]['dir']; // asc or desc
$searchValue = $_POST['search']['value']; // Search value
$searchArray = array();
if ($columnName == 'DocumentNumber')
{
$columnName = 'main.DocumentNumber';
}
## Search
$searchQuery = " ";
if($searchValue != ''){
$searchQuery = " AND (main.DocumentName LIKE :DocumentName or
main.DocumentNumber LIKE :DocumentNumber OR
main.DocumnetFormat LIKE :DocumnetFormat OR
main.OriginalInventoryNumber LIKE :OriginalInventoryNumber OR
main.OriginalDataSupplay LIKE :OriginalDataSupplay OR
main.DuplicationInventoryNumber LIKE :DuplicationInventoryNumber OR
main.DuplicationDataSupplay LIKE :DuplicationDataSupplay OR
addit.ForMarks LIKE :ForMarks OR
addit.Letter LIKE :Letter OR
app.DesignationApplicability LIKE :DesignationApplicability OR
app.CypherApplicability LIKE :CypherApplicability) ";
$searchArray = array(
'DocumentName'=>"%$searchValue%",
'DocumentNumber'=>"%$searchValue%",
'DocumnetFormat'=>"%$searchValue%",
'OriginalInventoryNumber'=>"%$searchValue%",
'OriginalDataSupplay'=>"%$searchValue%",
'DuplicationInventoryNumber'=>"%$searchValue%",
'DuplicationDataSupplay'=>"%$searchValue%",
'ForMarks'=>"%$searchValue%",
'Letter'=>"%$searchValue%",
'DesignationApplicability'=>"%$searchValue%",
'CypherApplicability'=>"%$searchValue%"
);
}
$gen_query = "SELECT COUNT(*) AS allcount FROM in_archive_fileindex_main main
LEFT JOIN in_archive_fileindex_additionaly addit ON (main.DocumentNumber =
addit.DocumentNumber)
LEFT JOIN in_archive_fileindex_applicability app ON (main.DocumentNumber =
app.DocumentNumber)";
## Total number of records without filtering
$stmt = $conn->prepare($gen_query);
$stmt->execute();
$records = $stmt->fetch();
$totalRecords = $records['allcount'];
## Total number of records with filtering
print_r($searchArray);
$stmt = $conn->prepare($gen_query ." WHERE 1 ". $searchQuery);
$stmt->execute($searchArray);
$records = $stmt->fetch();
$totalRecordwithFilter = $records['allcount'];
## Fetch records
$stmt = $conn->prepare("SELECT * FROM in_archive_fileindex_main main
LEFT JOIN in_archive_fileindex_additionaly addit ON (main.DocumentNumber =
addit.DocumentNumber)
LEFT JOIN in_archive_fileindex_applicability app ON (main.DocumentNumber =
app.DocumentNumber)
WHERE 1 ".$searchQuery." ORDER BY ".$columnName." ".$columnSortOrder." LIMIT
:limit,:offset");
// Bind values
foreach($searchArray as $key=>$search){
$stmt->bindValue(':'.$key, $search,PDO::PARAM_STR);
}
$stmt->bindValue(':limit', (int)$row, PDO::PARAM_INT);
$stmt->bindValue(':offset', (int)$rowperpage, PDO::PARAM_INT);
$stmt->execute();
$empRecords = $stmt->fetchAll();
$data = array();
foreach($empRecords as $row){
$data[] = array(
"DocumentName"=>$row['DocumentName'],
"DocumentNumber"=>$row['DocumentNumber'],
"DocumnetFormat"=>$row['DocumnetFormat'],
"OriginalInventoryNumber"=>$row['OriginalInventoryNumber'],
"OriginalDataSupplay"=>$row['OriginalDataSupplay'],
"DuplicationInventoryNumber"=>$row['DuplicationInventoryNumber'],
"DuplicationDataSupplay"=>$row['DuplicationDataSupplay'],
"ForMarks"=>$row['ForMarks'],
"Letter"=>$row['Letter'],
"DesignationApplicability"=>$row['DesignationApplicability'],
"CypherApplicability"=>$row['CypherApplicability']
);
}
## Response
$response = array(
"draw" => intval($draw),
"iTotalRecords" => $totalRecords,
"iTotalDisplayRecords" => $totalRecordwithFilter,
"aaData" => $data
);
echo json_encode($response);
Если я вывожу $searchArray, это массив, с помощью которого я делаю подготовленный запрос, в нем содержаться данные для фильтрации. В нем данные содержатся корректно. Вот в этом отрывке:
## Total number of records with filtering
print_r($searchArray);
$stmt = $conn->prepare($gen_query ." WHERE 1 ". $searchQuery);
$stmt->execute($searchArray);
$records = $stmt->fetch();
$totalRecordwithFilter = $records['allcount'];
Но если я смотрю логи mysql запросов, то уже в них кракозябры:
Логи MySQL:
SELECT * FROM in_archive_fileindex_main main
LEFT JOIN in_archive_fileindex_additionaly addit ON (main.DocumentNumber =
addit.DocumentNumber)
LEFT JOIN in_archive_fileindex_applicability app ON (main.DocumentNumber =
app.DocumentNumber)
WHERE 1 AND (main.DocumentName LIKE '%блок%' or
main.DocumentNumber LIKE '%блок%' OR
main.DocumnetFormat LIKE '%блок%' OR
main.OriginalInventoryNumber LIKE '%блок%' OR
main.OriginalDataSupplay LIKE '%блок%' OR
main.DuplicationInventoryNumber LIKE '%блок%' OR
main.DuplicationDataSupplay LIKE '%блок%' OR
addit.ForMarks LIKE '%блок%' OR
addit.Letter LIKE '%блок%' OR
app.DesignationApplicability LIKE '%блок%' OR
app.CypherApplicability LIKE '%блок%') ORDER BY DocumentName asc LIMIT 0,25