Кодировка русских букв

volnistii11

Новичок
Использую datatable+ajax+php. И у меня не работает встроенный поиск, с английскими буквами все норм, а вот вместо русских кракозябры и соответственно поиск с ними не работает.

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,
      '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
mb_internal_encoding('UTF-8');
mb_http_output('UTF-8');
mb_http_input('UTF-8');
mb_regex_encoding('UTF-8');

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

volnistii11

Новичок
Вообщем вот на этом месте, в самом начале практически
Код:
<?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();


echo $searchValue;
 

WMix

герр M:)ller
Партнер клуба
блок = блок
ты ожидаешь вроде utf "SET NAMES 'utf8'", "content="text/html; charset=utf-8">" и тебе приходит utf но смотришь ты в "windows-1251"
это не отвечает на вопрос почему не работает поиск, но с этого нужно думаю начинать

покажи http заголовки (https://stackoverflow.com/questions/4423061/view-http-headers-in-google-chrome)
 
Последнее редактирование:

volnistii11

Новичок
ты ожидаешь вроде utf "SET NAMES 'utf8'", "content="text/html; charset=utf-8">" и тебе приходит utf но смотришь ты в "windows-1251"
это не отвечает на вопрос почему не работает поиск, но с этого нужно думаю начинать

покажи http заголовки (https://stackoverflow.com/questions/4423061/view-http-headers-in-google-chrome)
Но на английском и цифрах поиск же работает, поэтому я и решил, что дело в кодировке
1467
 

WMix

герр M:)ller
Партнер клуба
кодировка какая? ты всегда в пошаговом режиме работаешь? может хочь немного голову включать будешь?
 

volnistii11

Новичок
кодировка какая? ты всегда в пошаговом режиме работаешь? может хочь немного голову включать будешь?
Я несколько раз перечитал тему со стековерфлоу, которую вы скинули, но так и не понял, как мне по другому показать вам заголовки.
А кодировку в index.php я задаю utf-8.
Чего-то я видимо не понимаю.
HTML:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
        <meta http-equiv="Content-Language" content="ru">
Если смотреть в заголовках данные, которые пришли, то все приходит корректно
1469

В самой бд mysql кодировка utf8_general_ci
 
Последнее редактирование:

volnistii11

Новичок
кодировка какая? ты всегда в пошаговом режиме работаешь? может хочь немного голову включать будешь?
Я поставил еще в .htaccess тоже кодировку utf8.
И если сейчас делаю print_r($searchArray), это где хранятся данные для поиска. Выводит все корректно:
Код:
Array ( [DocumentName] => %блок% [DocumentNumber] => %блок% [DocumnetFormat] => %блок% [OriginalInventoryNumber] => %блок% [OriginalDataSupplay] => %блок% [DuplicationInventoryNumber] => %блок% [DuplicationDataSupplay] => %блок% [ForMarks] => %блок% [Letter] => %блок% [DesignationApplicability] => %блок% [CypherApplicability] => %блок% ) {"draw":5,"iTotalRecords":"21435","iTotalDisplayRecords":null,"aaData":[]}
Но поиск все равно не работает
А в логах 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
 
Последнее редактирование:

WMix

герр M:)ller
Партнер клуба
Код:
SELECT @@character_set_database, @@collation_database;
SHOW CREATE DATABASE dbName
 
Последнее редактирование:

volnistii11

Новичок
таблицы посмотри.

это может быть вполне правильная запись, просто смотришь не правильно.

ну и убедись, что в phpMyAdmin для like '%блок%' находишь запись
о, вот здесь как раз и проблема видимо, с русскими буквами здесь выдает ошибку Illegal mix of collations for operation 'like'
 

volnistii11

Новичок
таблицы посмотри.

это может быть вполне правильная запись, просто смотришь не правильно.

ну и убедись, что в phpMyAdmin для like '%блок%' находишь запись
Кажется, я понял, дело в том, что кириллица попадает в поле с типом "дата". Если я убираю эти поля из поиска, тогда все работает корректно
 

volnistii11

Новичок
таблицы посмотри.

это может быть вполне правильная запись, просто смотришь не правильно.

ну и убедись, что в phpMyAdmin для like '%блок%' находишь запись
А вы не подскажите, как корректно и максимально правильно сделать такой поиск, но для каждого столбца свой? Я понимаю, что нужно сделать инпуты для каждого столбца, также я примерно понимаю, как в самом скрипте обработать данные, а вот как связать это не очень понимаю.
 
Сверху