Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.02.2020, 22:38   #1
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию Проблемы при записи в БД из PHP

Здравствуйте.

Суть вопроса: необходимо обновлять курс валют на сайте WordPress + WooCommerce.
Сам плагин обновляет курс, но последние события показывают, что делает он это слишком редко по отношению к частоте обновления цен и наличия (никаких настроек не обнаружено).
И часто получается так, что после обновления цен и наличия - курс валюты уже/ещё не актуален.
В гугле я ничего не нашёл по этому вопросу, на спец. форумах делают вид что моей проблемы не существует, но это не важно.
В общем, я тут много могу рассказывать о том что у меня было, что есть и к чему стремлюсь.

В базе данных я нашёл запись ответственную за курс валюты, и при ручном изменении значения - всё работает как надо.
Дальше кусок моего кода, цель которого - автоматизировать этот процесс.
Код:
$_data=LoadDataFromRequest($db_connector,'SELECT option_value FROM wp_options WHERE option_id=1851'); // запрос через функцию
// echo $_data[0][0].'<br><br>'; // визуальная отладка "что есть"
$_data=unserialize($_data[0][0]); // у меня всего одно значение, которое заведомо существует
$_data['UAH']['rate']=$input_value; // это ассоциативный массив, запись значения куда надо
$_data=mysqli_real_escape_string($db_connector,serialize($_data)); // сериализация и экранирование
// echo $_data; // визуальная отладка "что стало" (что отправляется в запрос)
mysqli_query($db_connector,'UPDATE wp_options SET option_value=\''.$_data.'\' WHERE option_id=1851'); // на этом этапе всё ломается
По тому что я вижу - всё должно работать, ручное редактирование записи через phpMyAdmin так же даёт положительный результат.
А вот выполнение запроса - всё ломает до такой степени, что следующий этап - восстановление бэкапа БД (благо хостер даёт такую возможность).

Из всего описанного выше, я делаю вывод, что мой код PHP шлёт битые данные.

Что тут не так ?
Подпись ? Не, не слышал ...
OmegaBerkut вне форума Ответить с цитированием
Старый 10.02.2020, 23:38   #2
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

Потестил собираемый запрос в phpMyAdmin, и последний ругается на синтаксис. В таком случае не понятно как вообще запрос выполняется из PHP, ломая всю базу.
Очевидно что проблема в моём "нативном" способе построения запроса.
Но я по другому и не умею.
Что подскажете - как правильно собрать запрос ?
При том условии, что у меня один параметр - сериализованный массив
Подпись ? Не, не слышал ...
OmegaBerkut вне форума Ответить с цитированием
Старый 11.02.2020, 04:52   #3
ADSoft
Старожил
 
Регистрация: 25.02.2007
Сообщений: 4,158
По умолчанию

Читать про строки, про экранирование, и ещё много чего
Код:
mysqli_query($db_connector,"UPDATE wp_options SET option_value='$_data' WHERE option_id=1851");
ADSoft вне форума Ответить с цитированием
Старый 11.02.2020, 13:03   #4
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

Цитата:
Сообщение от ADSoft Посмотреть сообщение
mysqli_query($db_connector,"UPDATE wp_options SET option_value='$_data' WHERE option_id=1851");
Вы хотите сказать, что такой запрос сработает как надо ?
Нужно ли $_data предварительно прогонять через mysqli_real_escape_string ?
Подпись ? Не, не слышал ...

Последний раз редактировалось OmegaBerkut; 11.02.2020 в 13:06.
OmegaBerkut вне форума Ответить с цитированием
Старый 11.02.2020, 14:12   #5
ADSoft
Старожил
 
Регистрация: 25.02.2007
Сообщений: 4,158
По умолчанию

У вас строкой ранее это происходит, если не заметили...
Должен сработать
ADSoft вне форума Ответить с цитированием
Старый 11.02.2020, 15:07   #6
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

Цитата:
Сообщение от ADSoft Посмотреть сообщение
Должен сработать
Не сработало.
Так же поломалось всё.

Вот сам запрос
Код:
UPDATE wp_options SET option_value='a:2:{s:3:\"USD\";a:9:{s:4:\"name\";s:3:\"USD\";s:4:\"rate\";d:1;s:6:\"symbol\";s:5:\"$\";s:8:\"position\";s:5:\"right\";s:9:\"is_etalon\";i:1;s:10:\"hide_cents\";i:1;s:8:\"decimals\";i:2;s:11:\"description\";s:10:\"USA dollar\";s:4:\"flag\";s:94:\"/wp-content/plugins/woocommerce-currency-switcher/img/no_flag.png\";}s:3:\"UAH\";a:9:{s:4:\"name\";s:3:\"UAH\";s:4:\"rate\";d:24.64999999999999857891452847979962825775146484375;s:6:\"symbol\";s:7:\"грн.\";s:8:\"position\";s:11:\"right_space\";s:9:\"is_etalon\";i:0;s:10:\"hide_cents\";i:1;s:8:\"decimals\";i:2;s:11:\"description\";s:18:\"Ukrainian hryvnias\";s:4:\"flag\";s:94:\"/wp-content/plugins/woocommerce-currency-switcher/img/no_flag.png\";}}' WHERE option_id=1851
Прогнал его в phpMyAdmin, приложил скриншот ошибки и структуры таблицы.

Покурил вот эту доку, ничего нового не увидел.

Помогите плз. Я думаю что это вопрос исключительно оптыа, хотя ранее я хранил сериализованные куки в БД, проблем не возникало. Тут не пойми что вообще
Изображения
Тип файла: png error_1064.png (22.5 Кб, 19 просмотров)
Подпись ? Не, не слышал ...

Последний раз редактировалось OmegaBerkut; 11.02.2020 в 15:18.
OmegaBerkut вне форума Ответить с цитированием
Старый 11.02.2020, 21:48   #7
ADSoft
Старожил
 
Регистрация: 25.02.2007
Сообщений: 4,158
По умолчанию

похоже лишка заескейпили )
попробуй без mysqli_real_escape_string($db_conne ctor,serialize($_data));
а вообще там наверняка в wp Есть кусок который измененные данные записывает - посмотри, может на примере его удастся
ADSoft вне форума Ответить с цитированием
Старый 11.02.2020, 22:14   #8
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

Цитата:
Сообщение от ADSoft Посмотреть сообщение
кусок который измененные данные записывает - посмотри, может на примере его удастся
Там поди разберись во всех абстракциях функционального программирования, у меня стек-трейс ломается (не видно полной последовательности вызовов). А так я смотрел, всё идёт в некую функцию update_option(), коих по всему API штук пять
Подпись ? Не, не слышал ...
OmegaBerkut вне форума Ответить с цитированием
Старый 12.02.2020, 02:58   #9
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

Покурил различные доки, поковырялся в носу в некоторых PHP файлах вордпресса, и пришёл к выводу, что выполнить экранирование опции не получится вне среды самого вордпрессса.
Есть некая функция esc_html, которая расположена в одном файле. У этой функции имеютcя зависимоcти на два других файла. Полез в один из этих файлов - там ещё четыре зависимости.
Чёрт ногу сломит, что называется.
Использовать функции среды в нативном режиме - слишком уж "пальцем в небо", и в лучшем случае ничего не сработает.
И пока остаётся только один вариант - имитировать действия как при ручном редактировании записи в БД.
Это означает, что никаких unserialize/serialize, только позиционное редактирование целой строки только хардкор.

Пщёл тестить.

UPD: имитация полученного запроса в phpMyAdmin всё равно падает, всё равно с кодом 1064, и всё равно на том же месте - чему я особо не удивлён.
И раз выполнение запроса из PHP происходит без ошибок - значится тестировать нужно запрос именно через PHP ...
Нужно только дождаться следующего авто-бэкапа БД на хостинге. Ручной бэкап позволяет только скачать, а это в моём случае не вариант.
Так что отпишу сюда через пару дней.

UPD: в общем, не сработало это (несколько вариантов экранирования в том числе html).
Вариант с базой и значением пока на карандаше.
В админке есть кнопка, нажатие на которую вручную пинает обновление курса валют. Пошёл копать в этом направлении.
Подпись ? Не, не слышал ...

Последний раз редактировалось OmegaBerkut; 12.02.2020 в 17:54.
OmegaBerkut вне форума Ответить с цитированием
Старый 12.02.2020, 20:04   #10
uberchel
Участник клуба
 
Аватар для uberchel
 
Регистрация: 19.01.2009
Сообщений: 1,453
По умолчанию

Цитата:
Сообщение от OmegaBerkut Посмотреть сообщение
Покурил различные доки, поковырялся в носу в некоторых PHP файлах вордпресса, и пришёл к выводу, что выполнить экранирование опции не получится вне среды самого вордпрессса.
Есть некая функция esc_html, которая расположена в одном файле. У этой функции имеютcя зависимоcти на два других файла. Полез в один из этих файлов - там ещё четыре зависимости.
Чёрт ногу сломит, что называется.
Использовать функции среды в нативном режиме - слишком уж "пальцем в небо", и в лучшем случае ничего не сработает.
И пока остаётся только один вариант - имитировать действия как при ручном редактировании записи в БД.
Это означает, что никаких unserialize/serialize, только позиционное редактирование целой строки только хардкор.

Пщёл тестить.

UPD: имитация полученного запроса в phpMyAdmin всё равно падает, всё равно с кодом 1064, и всё равно на том же месте - чему я особо не удивлён.
И раз выполнение запроса из PHP происходит без ошибок - значится тестировать нужно запрос именно через PHP ...
Нужно только дождаться следующего авто-бэкапа БД на хостинге. Ручной бэкап позволяет только скачать, а это в моём случае не вариант.
Так что отпишу сюда через пару дней.

UPD: в общем, не сработало это (несколько вариантов экранирования в том числе html).
Вариант с базой и значением пока на карандаше.
В админке есть кнопка, нажатие на которую вручную пинает обновление курса валют. Пошёл копать в этом направлении.
Для сериализоанного объекта используй urlencode, а это вообще некчему mysqli_real_escape_string в данном случае
uberchel вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблемы с WP сортировкой записи Дсмипмй WordPress и другие CMS 1 08.10.2017 18:37
Проблемы с созданием новой записи. Кодер2 C# (си шарп) 1 03.04.2017 15:04
Проблемы при бинарном чтении/записи fstream Max1548 Общие вопросы C/C++ 12 01.04.2017 11:18
Как обновить последние записи за определенный срок не обновляя не законченные записи? SotGEGDS SQL, базы данных 3 11.06.2013 14:39
Проблемы при записи и считыванияиз базы данных Aleksandr Общие вопросы Delphi 5 14.06.2011 23:52