Форум программистов, компьютерный форум, киберфорум
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. Показов 5252. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru