Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.76/21: Рейтинг темы: голосов - 21, средняя оценка - 4.76
0 / 0 / 0
Регистрация: 24.09.2016
Сообщений: 91

При парсинге сайта в браузере выводится ошибка: Incorrect string value: '\xE2\x80\xB3. \xD0.' for column 'content' at

02.07.2020, 19:58. Показов 4806. Ответов 28
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть вероятность, что проблема с кодировкой, но, как это исправить я не знаю.
В скрипте при подключении к базе данных пишу - mysqli_set_charset($link, "cp1251_general_ci");
В phpMyadmin в настройках базы данных - cp1251_general_ci
В конкретной таблице - cp1251_general_ci
В свойствах полей - cp1251_general_ci
В файле .htaccess - cp1251_general_ci

То есть, везде делаю одинаковую кодировку, но ошибка не исчезает и не меняется.

В phpMyadmin есть ещё такие параметры (в прикреплённом файле).

Ещё в них хотел сделать одинаковую кодировку, но как - не знаю.
Если дело в этих параметрах, то как их изменить?
Если не в них - тогда в чём?
Спасибо.
Миниатюры
При парсинге сайта в браузере выводится ошибка: Incorrect string value: '\xE2\x80\xB3. \xD0.' for column 'content' at  
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
02.07.2020, 19:58
Ответы с готовыми решениями:

Incorrect string value: '\xD0\x94\xD0\xB8\xD0\xBC.' for column 'name' at row 1
Помогите пожалуйста с данной проблемой , уже день бьюсь с ней. При попытке вставить русский текст в таблицу, выдаёт данную ошибку. ...

При парсинге сайта содержание в строке выводится не на языке сайта
Здравствуйте. Помогите решить проблему. Сайт в браузере на русском. Когда я его парсю все содержание в строке выводится на украинском?

Ошибка при парсинге страницы сайта
В методе онклик пишу: public void onClick(View v) { Document doc = null; try { doc =...

28
Невнимательный
 Аватар для ft4l
2837 / 1263 / 358
Регистрация: 08.02.2013
Сообщений: 7,353
Записей в блоге: 2
02.07.2020, 20:55
Цитата Сообщение от Pavll Посмотреть сообщение
пишу - mysqli_set_charset($link, "cp1251_general_ci");
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
<div id="main">
 
<?php
    $db_host    = "localhost";
    $db_user    = "xxx";
    $db_pass    = "xxx";
    $db_base    = "yyy";
    $ERRs = array();
 
do {
    $mysqli = new mysqli($db_host, $db_user, $db_pass, $db_base);
    if ($mysqli->connect_errno) { /* проверка соединения */
        $ERRs[] = 'Не удалось подключиться: '. $mysqli->connect_error ;
        break;
    }
    echo "Изначальная кодировка соединения: \n", $mysqli->character_set_name(), "<br/>\n";
 
    $result = $mysqli->query('SHOW VARIABLES LIKE "%char%"'); 
    if (!$result) {/* изменение набора символов на utf8 */
        $ERRs[] = 'Ошибка SHOW VARIABLES LIKE "%char%" '. $mysqli->error;
        break;
    }
    echo '<xmp>';
    while ($row = $result->fetch_row()) {
        echo $row[0], '     ', $row[1], "\n";
    }
    echo '</xmp>',
                "Установка кодировки.<br/>\n";
 
 
    if (!$mysqli->set_charset("cp1251_general_ci")) {/* изменение набора символов на cp1251_general_ci */
        $ERRs[] = 'Ошибка при загрузке набора символов cp1251_general_ci: '. $mysqli->error;
        break;
    }
    echo "Текущая кодировка соединения: \n", $mysqli->character_set_name(), "<br/>\n";
 
    //.........
 
} while (0);
 
if ($ERRs) {
    echo '<ul class="err"><li>', implode("</li>\n<li>", $ERRs), '</li></ul>';       
}
выхлоп:
Изначальная кодировка соединения: utf8
Code
1
2
3
4
5
6
7
8
character_set_client        utf8
character_set_connection        utf8
character_set_database      utf8
character_set_filesystem        binary
character_set_results       utf8
character_set_server        utf8
character_set_system        utf8
character_sets_dir      C:\X\mysql5\share\charsets\
Установка кодировки.
Ошибка при загрузке набора символов cp1251_general_ci: Invalid characterset or character set not supported

---------------------------------
Насколько понял надо вместо cp1251_general_ci просто cp1251
станет например
Code
1
2
3
4
5
6
7
8
character_set_client        cp1251
character_set_connection        cp1251
character_set_database      utf8
character_set_filesystem        binary
character_set_results       cp1251
character_set_server        utf8
character_set_system        utf8
character_sets_dir      C:\X\mysql5\share\charsets\
0
0 / 0 / 0
Регистрация: 24.09.2016
Сообщений: 91
02.07.2020, 21:45  [ТС]
В своём коде заменил, только $mysqli на $link.
На данный момент в браузере выводится следующее:

Изначальная кодировка соединения: utf8
character_set_client utf8
character_set_connection utf8
character_set_database cp1251
character_set_filesystem binary
character_set_results utf8
character_set_server utf8
character_set_system utf8
character_sets_dir c:\ospanel\modules\database\MySQL-8.0-x64\share\charsets\
Установка кодировки.
Ошибка при загрузке набора символов cp1251_general_ci: Invalid characterset or character set not supported
Incorrect string value: '\xE2\x80\xB3. \xD0...' for column 'content' at row 1

В базе данных пока ничего не трогал (чтобы не запутаться во всём этом).

Вот весь код скрипта:

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
<?php
 
require 'C:\OSPanel\vendor\autoload.php';
//header('Content-type: text/html; charset=windows-1251');
 
$db_host    = "localhost";
$db_user    = "root";
$db_pass    = "";
$db_base    = "mysite";
$ERRs = array();
 
do {
    $link = new mysqli($db_host, $db_user, $db_pass, $db_base);
    if ($link->connect_errno) { /* проверка соединения */
        $ERRs[] = 'Не удалось подключиться: '. $link->connect_error ;
        break;
    }
    echo "Изначальная кодировка соединения: \n", $link->character_set_name(), "<br/>\n";
 
    $result = $link->query('SHOW VARIABLES LIKE "%char%"');
    if (!$result) {/* изменение набора символов на utf8 */
        $ERRs[] = 'Ошибка SHOW VARIABLES LIKE "%char%" '. $link->error;
        break;
    }
    echo '<xmp>';
    while ($row = $result->fetch_row()) {
        echo $row[0], '     ', $row[1], "\n";
    }
    echo '</xmp>',
    "Установка кодировки.<br/>\n";
 
 
    if (!$link->set_charset("cp1251_general_ci")) {/* изменение набора символов на cp1251_general_ci */
        $ERRs[] = 'Ошибка при загрузке набора символов cp1251_general_ci: '. $link->error;
        break;
    }
    echo "Текущая кодировка соединения: \n", $link->character_set_name(), "<br/>\n";
 
    //.........
 
} while (0);
 
if ($ERRs) {
    echo '<ul class="err"><li>', implode("</li>\n<li>", $ERRs), '</li></ul>';
}
 
/*
$host = 'localhost'; // адрес сервера
$database = 'mysite'; // имя базы данных
$user = 'root'; // имя пользователя
$password = ''; // пароль
 
// подключаемся к серверу
$link = mysqli_connect($host, $user, $password, $database)
or die("Ошибка " . mysqli_error($link)); mysqli_set_charset($link, "cp1251_general_ci");
*/
$url = 'http://amdy.su/';
 
function parser($url,$link){
    $page = file_get_contents($url);
    $pq = phpQuery::newDocument($page);
    $urls = $pq->find('span.read-more a');
 
    foreach($urls as $url) {
        $url = pq($url)->attr('href');
        $newsPage = file_get_contents($url);
        $pq2 = phpQuery::newDocument($newsPage);
        $name = $pq2->find('h1.entry-title')->text();
        $text = $pq2->find('div.entry-content')->html();
        $text = preg_replace('#\[\]#su', '', addslashes($text));
        $text = preg_replace('#\##su', '', addslashes($text));
        $query = "SELECT name FROM content5 WHERE name='" .addslashes( $name) . "'";
        $result = mysqli_query($link, $query);
        $data = mysqli_fetch_assoc($result);
        if (empty($data)) {
            $query="INSERT INTO content5 SET name='".addslashes($name)."', content='".addslashes($text)."' ";
            //$query = sprintf("INSERT INTO content5 SET name='%s', content='%s'",
                //mysqli_real_escape_string($name),
                //mysqli_real_escape_string($text));
            mysqli_query($link, $query) or die(mysqli_error($link));
        }
    }
    $nextpage = $pq->find('span.current')->next('a')->attr('href');
            if (!empty($nextpage)) {
                parser($nextpage, $link);
            }
        }
        parser($url, $link);
В базе данных или в коде нужно ещё, что-то менять?
0
Невнимательный
 Аватар для ft4l
2837 / 1263 / 358
Регистрация: 08.02.2013
Сообщений: 7,353
Записей в блоге: 2
02.07.2020, 22:59
Цитата Сообщение от Pavll Посмотреть сообщение
cp1251_general_ci: Invalid characterset or character set not supported
Цитата Сообщение от x_lab Посмотреть сообщение
вместо cp1251_general_ci просто cp1251
Снова не переключилась кодировка соединения

Нет возможности проверить на mysql-8.0
В том моём куске кода переделывал заменив 5 строчек на поболее
PHP
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
    if (!$mysqli->set_charset("cp1251")) {/* изменение набора символов на cp1251 */
        $ERRs[] = 'Ошибка при загрузке набора символов cp1251: '. $mysqli->error;
        break;
    }
    echo "Текущая кодировка соединения: \n", $mysqli->character_set_name(), "<br/>\n";
    
    $result = $mysqli->query('SHOW VARIABLES LIKE "%char%"'); 
    if (!$result) {/* изменение набора символов на utf8 */
        $ERRs[] = 'Ошибка SHOW VARIABLES LIKE "%char%" '. $mysqli->error;
        break;
    }
    echo '<xmp>';
    while ($row = $result->fetch_row()) {
        echo $row[0], '     ', $row[1], "\n";
    }
    echo '</xmp>';
и код просто как учебный ,) для примера
В вашем случае похоже в редакторе этот код надо переделать в cp1251, как-будто в utf-8 сохранили.

Цитата Сообщение от Pavll Посмотреть сообщение
preg_replace('#\[\]#su'
текст содержащий невалидные utf-8 символы не совпадает даже с '##u'
Возможно придётся убирать эти u,
хотя я не понял для чего затираются эти символы,
и почему дважды (возможно трижды) $text обрабатывается функцией addslashes()
0
0 / 0 / 0
Регистрация: 24.09.2016
Сообщений: 91
03.07.2020, 16:02  [ТС]
Есть определённый прогресс.
В браузере на данный момент выводится следующее:

Изначальная кодировка соединения: utf8
character_set_client utf8
character_set_connection utf8
character_set_database cp1251
character_set_filesystem binary
character_set_results utf8
character_set_server utf8
character_set_system utf8
character_sets_dir c:\ospanel\modules\database\MySQL-8.0-x64\share\charsets\
Установка кодировки.
Текущая кодировка соединения: cp1251

То есть, никаких ошибок в браузере уже не выводится.
Проблема остаётся с данными в базе данных. Там 2 поля: name и content. В эти 2 поля записываются данные в виде английских букв и кракозябров, но никак не на кириллице. Нужно, чтобы было на кириллице.
Почему так происходит, ведь я изменял кодировку на cp1251_general_ci?
0
Невнимательный
 Аватар для ft4l
2837 / 1263 / 358
Регистрация: 08.02.2013
Сообщений: 7,353
Записей в блоге: 2
03.07.2020, 20:13
Крякозябры бывают разные ,) возможно поможет такая тема
Базы Данных. Кодировка ввода/вывода.

Если в этих $name, $text точно cp1251,
и записи были добавлены после того как кодировка соединения выставлялась в cp1251.
Возможно, если крякозябры такие-же Ошибка,
кодировка страницы cp1251 а содировка соединения utf8, ... или данные были добавлены до того

Добавлено через 5 минут
Цитата Сообщение от Pavll Посмотреть сообщение
В эти 2 поля записываются данные в виде английских букв и кракозябров
Возможно просто выводятся так, менять кодировку соединения надо
так-же как при добавлении, так и при получении данных, если страницы все в cp1251
0
0 / 0 / 0
Регистрация: 24.09.2016
Сообщений: 91
04.07.2020, 21:35  [ТС]
Цитата Сообщение от x_lab Посмотреть сообщение
Крякозябры бывают разные ,) возможно поможет такая тема
Базы Данных. Кодировка ввода/вывода.
Эта тема помогла вернуть проблему в её первоначальное состояние. То есть, никаких кракозябров: ни в базе данных, ни в браузере. Но, ошибка: 'Incorrect string value: '\xE2\x80\xB3. \xD0.' for column 'content' at', к сожалению не пропала.

Как и где меняются эти параметры? Тут какая-то каша:

character_set_client
utf8mb4
character_set_connection
utf8mb4
character_set_database
utf8
character_set_filesystem
binary
character_set_results
utf8mb4
character_set_server
utf8
character_set_system
utf8
character_sets_dir
c:\ospanel\modules\database\MySQL-8.0-x64\share\ch...

Может быть в них проблема?
0
Невнимательный
 Аватар для ft4l
2837 / 1263 / 358
Регистрация: 08.02.2013
Сообщений: 7,353
Записей в блоге: 2
05.07.2020, 03:40
Не подумал, что возможно у Вас текст в однобайтной кодировке, но не CP1251...
например в koi8-r выглядит более менее, но с Ё .)
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
cat <<\x | /c/x/php/php
 
<?php
$str = "'\xE2\x80\xB3. \xD0.'";
 
echo iconv('CP1251', 'UTF-8', $str) ."\n";
echo iconv('KOI8-R', 'UTF-8', $str) ."\n";
echo iconv('ISO-8859-5', 'UTF-8', $str) ."\n";
echo iconv('CP866', 'UTF-8', $str) ."\n";
x
 
'″. Р.'
'Б─Ё. п.'
'т€Г. а.'
'тА│. ╨.'
М.б. пытается записать 'Б─Ё. п.' ?
...можно было-бы сказать попробуйте при сожранении выполнить $mysqli->set_charset('koi8r');
но логичнее просто сначала выяснить, в какой-же кодировке текст, который пытаетесь сохранить.

При выводе нужно переключаться на ту кодировку, в которой нужно отобразить страницу.

Не по теме:

Цитата Сообщение от Pavll Посмотреть сообщение
Как и где меняются эти параметры?
с помощью $mysqli->set_charset() или mysqli_set_charset()
меняется три переменные, как видно если распечатывать
character_set_client
character_set_connection
character_set_results

Точно такой-же эффект можно получить выполнив запрос
SET CHARACTER SET {charset_name | DEFAULT}
или
SET NAMES {'charset_name' [COLLATE 'collation_name'] | DEFAULT}
но с переклюение с помощью mysqli-функций как-бы считается более предпочтительным

Все три системные переменные mysql устанавливаются как глобально (для всего сервера),
так и для сессии (для текущего подключения)
Этот второй случай и используется.

0
0 / 0 / 0
Регистрация: 24.09.2016
Сообщений: 91
05.07.2020, 15:23  [ТС]
Написал строку в виде:
PHP
1
if (!$link->set_charset("koi8r"))
Ошибка 'Incorrect string value: '\xE2\x80\xB3. \xD0.' for column 'content' at' из браузера исчезла.
Захожу в базу данных - там кракозябры. Меняю различные кодировки в таблице, в полях. Результат всегда - кракозябры. Только, кракозябры разные в зависимости от кодировки. Нормального текста на кириллице не появляется. Сейчас в таблице и полях кодировка koi8r_general_ci, но всё равно в таблице кракозябры.
0
Невнимательный
 Аватар для ft4l
2837 / 1263 / 358
Регистрация: 08.02.2013
Сообщений: 7,353
Записей в блоге: 2
05.07.2020, 18:33
Цитата Сообщение от Pavll Посмотреть сообщение
кракозябры
Странно .) никак не могу повторить со своей mysql-5.7
Пробовал распихать текст в 3-х кодировках по 2-м таблицам в разной кодировке
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
<?php
error_reporting(-1);
ini_set('display_errors', 1);
 
$uris = array(
    'http://www.ipmnet.ru/~sadilina/Fedora/37.html', # koi8-r
    'https://parallel.uran.ru/book/export/html/368', # utf-8
    'http://lib.ru/BULGAKOW/r_gollandec.txt' # cp1251
);
#==============  Получение трёх строк  koi8-r utf-8 cp1251
$strs = array();
$i = 0;
do {
    $strs[] = strip_tags(file_get_contents($uris[$i]));
} while (++$i < 3);
 
#=============== Вывод на страницу в utf-8
 
header('Content-type: text/html; charset=utf-8');
?><!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>XXXXX</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <style>
html {background:#999;}
body  { background:#EED; border:inset 3pt #080; border-radius:1em;
    width:94%; margin:1ch auto; padding:1ex;}
textarea { width:100%; height:4em; }
.err li {border:inset 2pt #700; color: #700; background: #FF3}
    </style>
</head>
<body>
<div id="main">
<?php
    $db_host    = "localhost";
    $db_user    = "xxx";
    $db_pass    = "xxx";
    $db_base    = "yyy";
    $ERRs = array();
 
 
do {
    $mysqli = new mysqli($db_host, $db_user, $db_pass, $db_base);
    if ($mysqli->connect_errno) { /* проверка соединения */
        $ERRs[] = 'Не удалось подключиться: '. $mysqli->connect_error ;
        break;
    }
    echo "Изначальная кодировка соединения: \n", $mysqli->character_set_name(), "<br/>\n";
 
#========= Подготовка строк
    array_walk($strs, function(&$s){global $mysqli; $s = $mysqli->escape_string($s);});
    
#========= Удаление + Создание таблиц , добавление текста
    foreach ( array(
        'DROP TABLE IF EXISTS  test_utf',
        'DROP TABLE IF EXISTS  test_koi',
        'CREATE TABLE `test_utf` (`txt` TEXT) ENGINE=MyISAM DEFAULT CHARSET=utf8',
        'CREATE TABLE `test_koi` (`txt` TEXT) ENGINE=MyISAM DEFAULT CHARSET=koi8r',
        // Добавление koi8-r  ## 4-6
        'SET NAMES "koi8r"',
        'INSERT INTO test_utf VALUES ("'. $strs[0]. '")',
        'INSERT INTO test_koi VALUES ("'. $strs[0]. '")',
        // Добавление windows-1251 ## 7-9
        'SET NAMES "cp1251"',
        'INSERT INTO test_utf VALUES ("'. $strs[2]. '")',
        'INSERT INTO test_koi VALUES ("'. $strs[2]. '")',
        // Добавление utf-8  ## 10-12
        'SET NAMES "utf8"',
        'INSERT INTO test_utf VALUES ("'. $strs[1]. '")',
        'INSERT INTO test_koi VALUES ("'. $strs[1]. '")',
 
    ) AS $k => $query) {
        $result = $mysqli->query($query);
        if (!$result) {
            $ERRs[] = 'Ошибка запроса '. $k .': '. $query ."<hr/>\n". $mysqli->error;
            break 2;
        }
    }
#========== Вывод
        $mysqli->set_charset("utf8");
        echo "Текущая кодировка соединения: \n", $mysqli->character_set_name(), "<br/>\n";
 
    $query = '
     SELECT * FROM test_utf
     UNION ALL
     SELECT * FROM test_koi 
    ';
    $result = $mysqli->query($query);
    if (!$result) {/* изменение набора символов на utf8 */
            $ERRs[] = 'Ошибка запроса  '. $query ."<hr/>\n". $mysqli->error;
        break;
    }
    while ($row = $result->fetch_row()) {
        echo '<textarea>', $row[0], "</textarea>\n";
    }
} while (000);
 
if ($ERRs) {
    echo '<ul class="err"><li>', implode("</li>\n<li>", $ERRs), '</li></ul>';
}
 
?>
</div>
</body>
</html>
Заваливается на 12-м запросе из цикла.
Т.е. на добавлении utf-8 текста в koi8-r таблицу...
с ошибкой Incorrect string value: '\xE2\x80\x93 \xD0\xBA...' for column 'txt' at row 1

Но выводит нормально, хоть и 5 записей вместо 6-и ,) если закоментировать получение и цикл с добавлением строк

Добавлено через 12 минут
Попробовал вместо koi8r сделать таблицу
'CREATE TABLE `test_koi` (`txt` TEXT) ENGINE=MyISAM DEFAULT CHARSET=cp1251',

Ошибка пропала... вообще отказываюсь понимать проще с таблицами utf8, и побольше разных символов можно использовать

Добавлено через 58 секунд
крякозябров нет ))

Добавлено через 9 минут
Цитата Сообщение от Pavll Посмотреть сообщение
Меняю различные кодировки в таблице, в полях.
Обычно если не указывать для полей и указать для таблицы, с полями всё нормально бывает.
и наверное я-бы остановился на utf8
0
0 / 0 / 0
Регистрация: 24.09.2016
Сообщений: 91
05.07.2020, 18:55  [ТС]
Удалил проблемную таблицу. Создал её заново по Вашему примеру:
PHP
1
'CREATE TABLE `test_koi` (`txt` TEXT) ENGINE=MyISAM DEFAULT CHARSET=cp1251',
Но, ничего не изменилось.
Если указываю в соединении utf-8, то кракозябров в таблице нет, но в браузере всё та же ошибка:
Incorrect string value: '\xE2\x80\xB3. \xD0.' for column 'content' at
Если же, например, в соединении cp1251, то ошибка в браузере исчезает, но в базе данных - кракозябры.
Получается, первую ошибку устраняешь - возникает вторая, вторую устраняешь - возникает первая. И так каждый раз.
Буду, конечно, решать эту проблему, но, что-то в это не очень верится.
0
 Аватар для vinikon
340 / 160 / 89
Регистрация: 16.01.2020
Сообщений: 771
05.07.2020, 19:41
1) непонятно вот такое
PHP
1
2
3
4
$text = preg_replace('#\[\]#su', '', addslashes($text));
$text = preg_replace('#\##su', '', addslashes($text));
//.....
$query="INSERT INTO content5 SET name='".addslashes($name)."', content='".addslashes($text)."' ";
вы не переэкранировали случайно? может использовать экран только на первом этапе?
и не лучше ли сохранять в бд с использованием bindparam mysqli.
2) изначально вы символы сохраняли в кодировке cp1251. после изменения кодировки таблицы кодировка записанных в ее ячейки символов не изменилась. имеет смысл попробовать изменить кодировку символов такой командой (после того, как таблицу преобразовали в utf8):
PHP
1
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
3) а не могли бы выгрузить дамп вашей таблицы сюда (хотя бы 10 строк). надежней с первоисточниками работать, чем угадывать, как на тотализаторе.
1
Невнимательный
 Аватар для ft4l
2837 / 1263 / 358
Регистрация: 08.02.2013
Сообщений: 7,353
Записей в блоге: 2
05.07.2020, 19:53
Цитата Сообщение от Pavll Посмотреть сообщение
DEFAULT CHARSET=cp1251',
попробуйте всё-таки utf8

Добавлено через 8 минут
Если окажется что всё-таки текст который вы хотите добавить в utf-8,
но с "левыми" байтами, можно попробовать почистить этот текст
например
PHP
1
2
$str = 'Текст'."\xFF\xE2\x80\xB3. \xD0.";
echo mb_convert_encoding($str, 'UTF-8');
заменяет некоторое на "знаки вопроса" Текст?″. ?.
... но не тестил , и вроде можно похожее делать другими способами
0
0 / 0 / 0
Регистрация: 24.09.2016
Сообщений: 91
05.07.2020, 19:58  [ТС]
Цитата Сообщение от x_lab Посмотреть сообщение
попробуйте всё-таки utf8
""
Пробовал. Это лучший из худших вариантов: в БД кракозябров нет, но всё та же ошибка в браузере.

Цитата Сообщение от x_lab Посмотреть сообщение
$str = 'Текст'."\xFF\xE2\x80\xB3. \xD0.";
echo mb_convert_encoding($str, 'UTF-8');
В браузере выводится вот, что:
Текст?″. ?.<br />
<b>Warning</b>: : failed to open stream: Permission denied in <b>C... on line <b>66</b><br />
Строка 66 выглядит так:
$page = file_get_contents($url);
0
 Аватар для vinikon
340 / 160 / 89
Регистрация: 16.01.2020
Сообщений: 771
05.07.2020, 20:10
x_lab, в этой таблице показаны количество байт для вывода нужного символа. \xFF не должно использоваться. в других случаях если начинается с f, то это 4 байтная и надо использовать не utf8, а utf8mb4 (вот тут я про это недавно узнал).
по этой же таблице символ '\xE2\x80\xB3. \xD0.' должен быть в трехбайтной кодировке. все-таки может utf8.
может и ошибаюсь, но там так много экранирования, и неизвестно что в итоге получается.
1
Невнимательный
 Аватар для ft4l
2837 / 1263 / 358
Регистрация: 08.02.2013
Сообщений: 7,353
Записей в блоге: 2
05.07.2020, 20:18
Цитата Сообщение от Pavll Посмотреть сообщение
$page = file_get_contents($url);
имел ввиду
Code
1
$page = mb_convert_encoding(file_get_contents($url) , 'UTF-8');
Но это как на "кофейной гуще",

просто сохраните текст в файл,
... или сохранить страницу как html,
откройте этот файл в редакторе, и посмотрите в какой кодировке он отображается.
Значит однозначно нужно соединение в такой кодировке.
Из всего топика это так и не прояснилось ...
то что в базе, было сохранено без ошибки Incorrect string value, или оно не было-бы сохранено
0
0 / 0 / 0
Регистрация: 24.09.2016
Сообщений: 91
05.07.2020, 20:28  [ТС]
vinikon,

1)Возможно, немного перестарался, но без addslashes в браузере выводится синтаксическая ошибка. Где именно лишние addslashes?
2)При попытке сделать запрос ALTER TABLE table_name CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci; в phpMyadmin появляется 'Missing comma before start of a new alter operation. (около CHARACTER SET)'.
3)Дамп без конкретных данных в таблице (поля пустые), но если необходимо, то заполненную БД покажу.

-- phpMyAdmin SQL Dump
-- version 4.8.5
-- https://www.phpmyadmin.net/
--
-- Хост: 127.0.0.1:3306
-- Время создания: Июл 05 2020 г., 20:22
-- Версия сервера: 8.0.15
-- Версия PHP: 7.2.10

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET AUTOCOMMIT = 0;
START TRANSACTION;
SET time_zone = "+00:00";


/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SE T_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_S ET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CO NNECTION */;
/*!40101 SET NAMES utf8mb4 */;

--
-- База данных: `mysite`
--

-- --------------------------------------------------------

--
-- Структура таблицы `content5`
--

CREATE TABLE `content5` (
`name` text,
`content` text CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
COMMIT;

/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_ CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET _RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONN ECTION */;
0
 Аватар для vinikon
340 / 160 / 89
Регистрация: 16.01.2020
Сообщений: 771
05.07.2020, 20:57
Цитата Сообщение от Pavll Посмотреть сообщение
заполненную БД покажу
конечно, заполненную. а в пустой как кодировку символов определять.
а у вас кодировка php скриптов меняется соответственно кодировке бд?
Цитата Сообщение от Pavll Посмотреть сообщение
без addslashes в браузере выводится синтаксическая ошибка
какая именно ошибка выводится без них
Цитата Сообщение от Pavll Посмотреть сообщение
Где именно лишние addslashes
вы три раза $text экранируете addslashes.
PHP
1
2
3
4
5
6
7
8
$text = "Text'/df#6\"23";
echo $text.'<br/>';
$text = addslashes($text);
echo $text.'<br/>';
$text = addslashes($text);
echo $text.'<br/>';
$text = addslashes($text);
echo $text.'<br/>';
на выходе
HTML5
1
2
3
4
Text'/df#6"23
Text\'/df#6\"23
Text\\\'/df#6\\\"23
Text\\\\\\\'/df#6\\\\\\\"23
1
0 / 0 / 0
Регистрация: 24.09.2016
Сообщений: 91
05.07.2020, 21:12  [ТС]
Дамп БД (в урезанном виде):

-- phpMyAdmin SQL Dump
-- version 4.8.5
-- https://www.phpmyadmin.net/
--
-- Хост: 127.0.0.1:3306
-- Время создания: Июл 05 2020 г., 21:02
-- Версия сервера: 8.0.15
-- Версия PHP: 7.2.10

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET AUTOCOMMIT = 0;
START TRANSACTION;
SET time_zone = "+00:00";


/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SE T_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_S ET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CO NNECTION */;
/*!40101 SET NAMES utf8mb4 */;

--
-- База данных: `mysite`
--

-- --------------------------------------------------------

--
-- Структура таблицы `content5`
--

CREATE TABLE `content5` (
`name` text,
`content` text CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

--
-- Дамп данных таблицы `content5`
--

INSERT INTO `content5` (`name`, `content`) VALUES
('Как исправить проблему с установкой viber в kubuntu 18.04', '\n \n \n <p>В новой версии kubuntu 18.04 используется libcurl4, а в зависимостях viber 3-я версия. Соответственно при установке viber просит установить старую версию и сносит новую libcurl4 и софт зависящий от неё. Лучший известный мне способ исправить данную проблему — пересобрать пакет.</p>\n<pre class=\\\"brush: bash\\\">sudo su переходим в режим root\ndpkg-deb -x viber.deb viber распаковываем пакет скачанный с сайта viber\ndpkg-deb --control viber.deb viber/DEBIAN \nnano /DEBIAN/control заменяем libcurl3 на libcurl4\ndpkg -b viber vibernew.deb перепаковываем и устанавливаем\ndpkg -i vibernew.deb\n</pre>\n<p>И всё работает. Печалит то, что современные приоритеты месенджеров кроются в продажах стикеров и информации, а вот потратить пару человекочасов на нормальный способ дистрибуции — жалко.</p>\n '),
('Рефакторинг блога.', '\n \n \n <p>Бложек немного приболел, дроплет на DO полетел, унеся с собой блог. Занимаюсь сейчас ремонтом и восстановлением из бэкапа. А заодно надо почистить лютый треш из стрых записей. А то многие статьи самому страшно перечитывать и хочется поломать руки тому говнокодеру…</p>\n '),
('Недостатки laravel', '\n \n \n <p>Я очень люблю фреймворк laravel, пользуюсь им начиная с 3-й версии, тогда он был как глоток свежего воздуха на фоне zend и symfony. Уважаю Тейлора за проделанную работу, за принесённую в php фреймворки идею удобного апи и умение копировать лучшее из других фреймворков вроде RoR. О плюсах сказано уже много, но у него есть свои недостатки.<br>\n<a href=\\\"http://amdy.su/wp-content/uploads/nobody-perfect.jpg\\\" rel=\\\"attachment wp-att-693\\\"><img class=\\\"aligncenter size-medium wp-image-693\\\" src=\\\"http://amdy.su/wp-content/uploads/nobody-perfect-300x180.jpg\\\" alt=\\\"Well, nobody perfect\\\" width=\\\"300\\\" height=\\\"180\\\"></a>Эти недостатки не фатальны, а некоторые и вовсе мои личные привычки, которые другим покажутся надуманными. Всё дерьмо вылитое ниже не сильно влияет на мою оценку laravel, который считаю лучшим фреймворком в мире PHP. И спасибо <a ,

/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_ CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET _RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONN ECTION */;

Добавлено через 5 минут
Цитата Сообщение от vinikon Посмотреть сообщение
а у вас кодировка php скриптов меняется соответственно кодировке бд?
Не знаю, вижу только, что кодировка совпадает.
Цитата Сообщение от vinikon Посмотреть сообщение
какая именно ошибка выводится без них
Без addslashes такая ошибка в браузере:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'myModule', )
.value('bar', 123).;
angular
.module('appModule', ['myModule' at line 6
0
 Аватар для vinikon
340 / 160 / 89
Регистрация: 16.01.2020
Сообщений: 771
05.07.2020, 22:09
1) кодировка сайта http://amdy.su utf-8
2) в дампе таблицы лишние слеши, что впрочем ожидаемо. после их удаления все выводится нормально. только надо установить кодировку php скриптов
PHP
1
header('Content-Type: text/html; charset=utf-8');
3) советую отказаться от addslashses, просто перед записью в таблицу бд надо пропарсенные $name и $text биндить. надо переписать вот эти строчки
PHP
1
2
3
4
5
6
7
8
9
10
11
12
$text = preg_replace('#\[\]#su', '', addslashes($text));
$text = preg_replace('#\##su', '', addslashes($text));
$query = "SELECT name FROM content5 WHERE name='" .addslashes( $name) . "'";
$result = mysqli_query($link, $query);
$data = mysqli_fetch_assoc($result);
if (empty($data)) {
    $query="INSERT INTO content5 SET name='".addslashes($name)."', content='".addslashes($text)."' ";
    //$query = sprintf("INSERT INTO content5 SET name='%s', content='%s'",
        //mysqli_real_escape_string($name),
        //mysqli_real_escape_string($text));
    mysqli_query($link, $query) or die(mysqli_error($link));
}
если честно, запарился я с процедурным bindParam mysqli. чего вы ооп mysqli не используете- там все короче и удобней. придется вам подождать, пока я его не добью.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
05.07.2020, 22:09
Помогаю со студенческими работами здесь

Ошибка при записи в базу MySQL: "Incorrect string value"
Incorrect string value: '\x98\x98\x98\x98' for column 'text' at row 1 Работаю через НетБинс, у MySQL базы кодировка cp1251. Как...

Ошибка при записи в Access - Cannot set column 'Описание'. The value violates the MaxLength limit of this column.
Привет. Такая проблема: при записи текста более 255 символов из richtextbox в Access возникает исключение: Cannot set column 'Описание'....

При парсинге html в string появились коды
Я спарсив сайт, я достал из тега текст. При его выводе некоторые символы отображаются в виде кодов(' = ). Как избавится от этих кодов из...

Выводится ошибка mysql_fetch_array() expects parameter 1 to be resource, либо Unknown column 'значение переменной $prname' in WHERE clause
Здравствуйте! Прошу помочь, перерыл много чего, решения нет. Имеется такой код: &lt;?php ...

Errormessage: Incorrect integer value: '' for column `base`.`news`.`id` at row 1
Здравствуйте! Когда стоял на сервере php 5.6 все работало отлично, но когда обновили до PHP 7.3.14, начали сыпаться ошибки. Как...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru