Posted 29 мая, 20222 yr Столкнулся с неистово неизвестной проблемой Вывожу из базы данных mssql значения через PHP(IPS) и получаю нужное мне значение. Все конечно хорошо, но если бы не одно но - Выводится рандомной кодировкой каждый раз. То есть я захожу на страницу где должно выводиться значение, вижу что там все хорошо, пару раз обновил страницу, тоже все хорошо. Но стоит мне обновить страницу через минуту - две, получается интересный результат, значение поменялось, хотя код и база не редактировалась. Это до обновления страницы: Это после обновления страниче через пару минут: Если я обновлю страницу через опять же пару минут, получу обратный результат. Т.е получается оно меняется будто по таймеру определенному, хотя код до боли простой... Данная проблема только с Русскими символами происходит Код <?php try { $mssqlprovide = 'odbc'; $mssqldriver = '{ODBC Driver 17 for SQL Server}'; $hostname = 'IP'; $username = 'Name'; $password = 'Pass'; $dbWorld = 'Base'; $tblBase = 'Таблица'; $conn = new PDO("$mssqlprovide:Driver=$mssqldriver;Server=$hostname;Database=$dbWorld;", $username, $password); $sql_fetch = $conn->prepare("SELECT CAST(CAST([Name] AS VARCHAR(18)) AS TEXT) AS Name FROM tbl_base WHERE Serial = 5"); $sql_fetch->execute(); foreach ($top_lvl->fetchAll() as $row) { $t = $row['Name']; echo $t; echo "<br><hr>"; } } catch(Exception $e) { echo $e; }
29 мая, 20222 yr А этот код где выполняется? В блоке каком-то или просто новый файл .php где-то отдельно?
29 мая, 20222 yr Author Где бы не выполнял, результат один) Выполнял в своём приложение через class do И отдельным файлом чистым Так же и на локалке(Компе) Ост выполняется на VPS сервере
29 мая, 20222 yr Касаемо обновления результата через какое-то время, кмк, это вероятно какие-то кешированные значения. Либо блока IPS, либо кеша PHP, opcache например. Т.е. если код будет отредактирован сейчас, то его изменения произойдут через какое-то время (зависит от настроек). Можно попробовать добавить вывод значения не на экран, а в логи (файл, или еще куда-то), чтобы отсечь возможные варианты с какими-то внешними прослойками. Или отдебажить локально, посмотреть на значения переменных. Непохоже на проблемы с кодировкой, т.к. текст получился транслитирированным, если бы у него слетела кодировка, там были бы кракозябрики или вопросики
29 мая, 20222 yr $sql_fetch->execute(); foreach ($top_lvl->fetchAll() as $row) { Это точно рабочий код? Откуда $top_lvl взялся? Почему в результате <hr> перед строкой, а в коде после?
29 мая, 20222 yr Author Переменные отредактировал пере отправкой, забыл $top_lvl заменить на sql_fetch
29 мая, 20222 yr Я в transact-sql не очень разбираюсь, но вопрос, нафига двойное преобразование? Почему не SELECT CAST([Name] AS VARCHAR(18)) AS Name FROM tbl_base WHERE Serial = 5
29 мая, 20222 yr Так попробуй не кастить вообще для начала. В каком типе данные в базе? Тот же варчар небось, нафига эти преобразования?
29 мая, 20222 yr Author 2 минуты назад, Desti сказал: Так попробуй не кастить вообще для начала. В каком типе данные в базе? Тот же варчар небось, нафига эти преобразования? Повторю, разницы нету, меняю не меняю, вывожу на прямую или хоть как, результат один обсалютно Тип данных nvarchar и varchar, так же разницы нет, результат один Вижу ток 1 выход, это получать данные в двоичном коде и преобразовывать их в строку уже, но это очень жестко как по мне, поэтому решил поделиться с вами в надежде услышать годную подсказку
29 мая, 20222 yr Сделай var_dump($sql_fetch->fetchAll()); die; вместо цикла, посмотри на сырые данные. 4 минуты назад, SoulRainr сказал: услышать годную подсказку сначала код в порядок приведи, потом ошибки ищи. Edited 29 мая, 20222 yr by Desti
29 мая, 20222 yr Author 3 минуты назад, Desti сказал: Сделай var_dump($sql_fetch->fetchAll()); die; вместо цикла, посмотри на сырые данные. сначала код в порядок приведи, потом ошибки ищи. Ласт раз повторяю, какой бы код не был, выводит одно и тоже Выше код приведен как пример, т.е просто суть передать Дамп ничего не дает, как и xdebug
29 мая, 20222 yr 3 минуты назад, SoulRainr сказал: Дамп ничего не дает Если в базу заглянуть, то там по русски, а в объекте pdo уже транслитерация? И это с учетом того, что mssql никакой транслитерации нет в принципе (из коробки)? Чудес не бывает.
29 мая, 20222 yr Author Как я понял еще как бывают PDO ODBC не даёт выводить nvarchar по их мануалам официальным, но при этом я вывожу В базе все хорошо, при хдебаге видно что текст передается нормально, но почему то в браузере он уже сам по себе скачет (хдебаг этого не видит) Было склонение из за того что много подключений по PDO ODBC идёт, т.е много файлов залиты и все открыты, но это отбросилось так как PDO не нуждается в закрытии и обрабатывается корректно Поэтому мыслей и идей нет вообще
29 мая, 20222 yr Транслитерация это обычно удел браузеров. Рекомендую попробовать мозиллу без расширений. Она наверно единственная не обладает подобными свистоперделками из коробки. Все остальные браузеры часто делают перевод текста не запрашивая разрешения пользователя, и если текста нет в словаре они вполне могут выдать транслитерацию.
29 мая, 20222 yr 2 минуты назад, SoulRainr сказал: но почему то в браузере он уже сам по себе скачет (хдебаг этого не видит) Давайте мух от котлет отделим? Тупо в консоли ($ php test.php) что выдает этот код? Всегда правильно или меняется?
29 мая, 20222 yr Author 30 минут назад, Desti сказал: Давайте мух от котлет отделим? Тупо в консоли ($ php test.php) что выдает этот код? Всегда правильно или меняется? Не совсем понял, в консоль браузера вывести переменнуЮ?
29 мая, 20222 yr php код может исполняться двумя способами: через браузер и через командную строку. Через браузер у вас проблемы, надо проверить через запуск интерпретатора php.
29 мая, 20222 yr SoulRainr если у тебя MS система. Надо в cmd или в powershell выполнить команду. с:\php\php.exe c:\***test.php Поставь там свои пути в которые установлен php В консоли линукса команда приведена выше
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.