Форум программистов, компьютерный форум, киберфорум
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. Показов 4815. Ответов 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
0 / 0 / 0
Регистрация: 24.09.2016
Сообщений: 91
05.07.2020, 22:39  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от vinikon Посмотреть сообщение
в дампе таблицы лишние слеши,
Эти слеши - \n? Их все удалять из дампа?

Цитата Сообщение от vinikon Посмотреть сообщение
3) советую отказаться от addslashses, просто перед записью в таблицу бд надо пропарсенные $name и $text биндить. надо переписать вот эти строчки
То есть, addslashes все убрать? Что такое "биндить"
? На языке игроков компьютерных игр я знаю, что значит "биндить", а на языке программистов не знаю?

Цитата Сообщение от vinikon Посмотреть сообщение
если честно, запарился я с процедурным bindParam mysqli. чего вы ооп mysqli не используете- там все короче и удобней. придется вам подождать, пока я его не добью.
Я сейчас, только изучаю всё это. Есть учебный материал - изучаю, особо не думая, ООП это или процедурный стиль.

Если честно, я думал, что этот вопрос решится за пару секунд, а растянулось уже на несколько дней.
0
 Аватар для vinikon
340 / 160 / 89
Регистрация: 16.01.2020
Сообщений: 771
05.07.2020, 23:03
в-общем, во первых, там где у вас подключение к бд надо после добавить вот эту строчку
PHP
1
mysqli_query($link, 'SET NAMES utf8');
дальше замените те строчки кода в моем предыдущем посте вот этими
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$text = preg_replace('#\[\]#su', '', $text);
$text = preg_replace('#\##su', '', $text);
$stmt = mysqli_prepare($link, "SELECT name FROM content5 WHERE name=?");
mysqli_stmt_bind_param($stmt, "s", $name);
mysqli_stmt_execute($stmt);
mysqli_stmt_bind_result($stmt, $result);
mysqli_stmt_fetch($stmt);
if (!$result) {
    $stmt = mysqli_prepare($link, "INSERT INTO content5 SET name=?, content=?");
    mysqli_stmt_bind_param($stmt, "ss", $name, $content);
    mysqli_stmt_execute($stmt);
    if (!mysqli_stmt_affected_rows($stmt)) {
        die(mysqli_error($link));
    }
}
в третих, старые ошибки надо как-то убрать - проще переименовать в phpmyadmin эту таблицу content5 во что-то другое, например c5copy, и создайте новую таблицу content5 в phpmyadmin таким запросом
SQL
1
2
3
4
CREATE TABLE `content5` (
`name` text,
`content` text CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
и после этого попробуйте еще парсить сайт

Добавлено через 13 минут
да и не надо парсить весь сайт - пока одну страницу достаточно - закомментируйте у себя
PHP
1
parser($nextpage, $link);
1
0 / 0 / 0
Регистрация: 24.09.2016
Сообщений: 91
06.07.2020, 03:25  [ТС]
vinikon,
Если вставить предложенный код именно в том виде, в котором Вы написали, то в БД ничего не записывается, хотя и ошибки в браузере не выводится.
Если попробовать заменить в коде знаки ?, то в БД, также ничего не записывается, но в браузере появляется:

<br />
<b>Warning</b>: mysqli_stmt_bind_param() expects parameter 1 to be mysqli_stmt, boolean given in <b>C:\OSPanel\domains\test\www\rusakov\p arsing20.php</b> on line <b>77</b><br />
<br />
<b>Warning</b>: mysqli_stmt_execute() expects parameter 1 to be mysqli_stmt, boolean given in <b>C:\OSPanel\domains\test\www\rusakov\p arsing20.php</b> on line <b>78</b><br />
<br />
<b>Warning</b>: mysqli_stmt_bind_result() expects parameter 1 to be mysqli_stmt, boolean given in <b>C:\OSPanel\domains\test\www\rusakov\p arsing20.php</b> on line <b>79</b><br />
<br />
<b>Warning</b>: mysqli_stmt_fetch() expects parameter 1 to be mysqli_stmt, boolean given in <b>C:\OSPanel\domains\test\www\rusakov\p arsing20.php</b> on line <b>80</b><br />
<br />
<b>Warning</b>: mysqli_stmt_bind_param() expects parameter 1 to be mysqli_stmt, boolean given in <b>C:\OSPanel\domains\test\www\rusakov\p arsing20.php</b> on line <b>83</b><br />
<br />
<b>Warning</b>: mysqli_stmt_execute() expects parameter 1 to be mysqli_stmt, boolean given in <b>C:\OSPanel\domains\test\www\rusakov\p arsing20.php</b> on line <b>84</b><br />
<br />
<b>Warning</b>: mysqli_stmt_affected_rows() expects parameter 1 to be mysqli_stmt, boolean given in <b>C:\OSPanel\domains\test\www\rusakov\p arsing20.php</b> on line <b>85</b><br />
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 '<p>В новой версии kubuntu 18.04 используется libcurl4, �' at line 4


То есть, такие строки появляются, если в коде заменить name=? на name=$name, а content=? на content=$text.
0
 Аватар для vinikon
340 / 160 / 89
Регистрация: 16.01.2020
Сообщений: 771
06.07.2020, 10:51
Лучший ответ Сообщение было отмечено Pavll как решение

Решение

да, я ошибся. вместо $text использовал несуществующую переменную $content. Заглючило к концу дня )).
но я тут с утра у вас увидел еще одну лажу, которую вчера просмотрел: вы подключаетесь к бд объектно-ориентированным стилем, а в запросах используете процедурный.
в-общем вот этот код должен быть рабочим
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
<?php
header('Content-Type: text/html; charset=utf-8');
error_reporting(-1);
ini_set('display_errors', 1);
require 'C:\OSPanel\vendor\autoload.php'; 
$db_host    = "localhost";
$db_user    = "root";
$db_pass    = "";
$db_base    = "mysite";
$link = mysqli_connect($db_host, $db_user, $db_pass, $db_base);
 
mysqli_query($link, "SET NAMES utf8mb4");
 
$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', '', $text);
        $text = preg_replace('#\##su', '', $text);
        $stmt = mysqli_prepare($link, "SELECT name FROM content5 WHERE name=?");
        mysqli_stmt_bind_param($stmt, 's', $name);
        if (!mysqli_stmt_execute($stmt)) {
            echo "Не удалось выполнить запрос: (" . $stmt->errno . ") " . $stmt->error;
        }
        mysqli_stmt_bind_result($stmt, $result);
        mysqli_stmt_fetch($stmt);
        if (!$result) {
            $stmt = mysqli_prepare($link, "INSERT INTO content5 SET name=?, content=?");
            mysqli_stmt_bind_param($stmt, 'ss', $name, $text);
            if (!mysqli_stmt_execute($stmt)) {
                echo "Не удалось выполнить запрос: (" . $stmt->errno . ") " . $stmt->error;
            }
        }
    }
    $nextpage = $pq->find('span.current')->next('a')->attr('href');
    if (!empty($nextpage)) {
        parser($nextpage, $link);
    }
}
parser($url, $link);
и структура таблицы content5 какая-то странная. сделайте ее такой (в phpmyadmin):
SQL
1
CREATE TABLE content5 (id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, name text, content longtext) engine=myisam CHARACTER SET=utf8mb4 COLLATE utf8mb4_unicode_ci;
Добавлено через 1 час 35 минут
попробовал немного оптимизировать код: убрал рекурсию, убрал лишний запрос к бд и переписал с использованием класса mysqli:
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
<?php
header('Content-Type: text/html; charset=utf-8');
error_reporting(-1);
ini_set('display_errors', 1);
require 'C:\OSPanel\vendor\autoload.php'; 
$db_host    = "localhost";
$db_user    = "root";
$db_pass    = "";
$db_base    = "mysite";
$domain        = 'http://amdy.su/';
 
$link = new mysqli($db_host, $db_user, $db_pass, $db_base);
$link->query("SET NAMES utf8mb4");
$nextpage = $domain;
/* 
в $headers хранить заголовки закаченных статей, 
чтобы не делать запросы к бд на поиск совпадения
*/
$headers = []; 
do { 
    $page = file_get_contents($nextpage);
    $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', '', $text);
        $text = preg_replace('#\##su', '', $text);
        if (!in_array($name, $headers)) {
            if (!isset($stmt)) {
                $stmt = $link->prepare("INSERT INTO content5 SET `name`=?, `content`=?");
                $stmt->bind_param('ss', $name, $text);
            }
            if (!$stmt->execute()) {
                echo "Не удалось выполнить запрос: (". $stmt->errno . ") " . $stmt->error;
            } else {
                $headers[] = $name;
            }
        }
    }
    $nextpage = $pq->find('span.current')->next('a')->attr('href');
} while ($nextpage);
1
0 / 0 / 0
Регистрация: 24.09.2016
Сообщений: 91
06.07.2020, 15:01  [ТС]
Да, случилось чудо и код заработал!
Спасибо, всем!
0
 Аватар для vinikon
340 / 160 / 89
Регистрация: 16.01.2020
Сообщений: 771
06.07.2020, 17:33
вот и славненько. желаю успехов.
хочу вам посоветовать все-таки разобраться с базами данных. если бы вы имели навыки работы с бд, то скорей всего, эта проблема и не возникла.
если интересно, то вот здесь коротко основы sql: типы данных, особенности запросов и типы таблиц.
вводная статья в pdo, старая но, в-общем, не устаревшая
еще немного примеров с pdo
PDO быстрый старт
1
0 / 0 / 0
Регистрация: 24.09.2016
Сообщений: 91
06.07.2020, 17:42  [ТС]
vinikon,
Спасибо за всё. Обязательно, прочту и постараюсь понять этот материал.
Вы писали, что у меня в одной части кода процедурный стиль, а в другой ООП. Это из-за того, что я решил совместить два кода взятых из разных материалов. Думал - авось сработает. И ведь, почти сработало
Кстати, из-за чего прежде всего возникла ошибка 'Incorrect string value: '\xE2\x80\xB3. \xD0.' for column 'content' at'?
Илу тут в комплексе всё сказалось?


То есть, если спросить немного по-другому - могло ли не возникнуть этой ошибки, используя в коде процедурный стиль и ООП? Или эти два метода никак не совместимы?
0
 Аватар для vinikon
340 / 160 / 89
Регистрация: 16.01.2020
Сообщений: 771
06.07.2020, 18:05
Цитата Сообщение от Pavll Посмотреть сообщение
решил совместить два кода взятых из разных материалов
нет, совмещать их нельзя. надо только один из вариантов. это приводило к ошибкам, но не к этой.
'Incorrect string value: '\xE2\x80\xB3. \xD0.' for column 'content' at' возникла из-за того, что кодировка считанных символов по размерности была больше той, которая установлена в бд. вы изначально задали для бд cp1251, которая является по сути однобайтной, в то время как сайте http://amdy.su/ установлена utf-8, способная выдавать символы и трехбайтные. но utf-8 оказалась все же не всеохватывающая, потому что не может отображать символы из 4 байт. (вот здесь про это подробно, правда на английском) .
короче размер полученных символов (в байтах) оказался больше размера символов, которые были установлены в бд.
поэтому в скриптах я и выбрал бд utf8mb4, чтобы и четырехбайтные символы охватить.
но, в-общем случае, парсинг сайтов не такое уж простое дело. не всякий сайт можно легко спарсить.
1
0 / 0 / 0
Регистрация: 24.09.2016
Сообщений: 91
06.07.2020, 19:30  [ТС]
vinikon,
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
06.07.2020, 19:30
Помогаю со студенческими работами здесь

Ошибка при записи в базу 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, начали сыпаться ошибки. Как...


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

Или воспользуйтесь поиском по форуму:
29
Ответ Создать тему
Новые блоги и статьи
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