Posted 29 мая, 20222 yr comment_181917 Столкнулся с неистово неизвестной проблемой Вывожу из базы данных 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 comment_181921 А этот код где выполняется? В блоке каком-то или просто новый файл .php где-то отдельно?
29 мая, 20222 yr Author comment_181923 Где бы не выполнял, результат один) Выполнял в своём приложение через class do И отдельным файлом чистым Так же и на локалке(Компе) Ост выполняется на VPS сервере
29 мая, 20222 yr comment_181926 Касаемо обновления результата через какое-то время, кмк, это вероятно какие-то кешированные значения. Либо блока IPS, либо кеша PHP, opcache например. Т.е. если код будет отредактирован сейчас, то его изменения произойдут через какое-то время (зависит от настроек). Можно попробовать добавить вывод значения не на экран, а в логи (файл, или еще куда-то), чтобы отсечь возможные варианты с какими-то внешними прослойками. Или отдебажить локально, посмотреть на значения переменных. Непохоже на проблемы с кодировкой, т.к. текст получился транслитирированным, если бы у него слетела кодировка, там были бы кракозябрики или вопросики
29 мая, 20222 yr comment_181928 $sql_fetch->execute(); foreach ($top_lvl->fetchAll() as $row) { Это точно рабочий код? Откуда $top_lvl взялся? Почему в результате <hr> перед строкой, а в коде после?
29 мая, 20222 yr Author comment_181929 Переменные отредактировал пере отправкой, забыл $top_lvl заменить на sql_fetch
29 мая, 20222 yr comment_181930 Я в transact-sql не очень разбираюсь, но вопрос, нафига двойное преобразование? Почему не SELECT CAST([Name] AS VARCHAR(18)) AS Name FROM tbl_base WHERE Serial = 5
29 мая, 20222 yr comment_181934 Так попробуй не кастить вообще для начала. В каком типе данные в базе? Тот же варчар небось, нафига эти преобразования?
29 мая, 20222 yr Author comment_181935 2 минуты назад, Desti сказал: Так попробуй не кастить вообще для начала. В каком типе данные в базе? Тот же варчар небось, нафига эти преобразования? Повторю, разницы нету, меняю не меняю, вывожу на прямую или хоть как, результат один обсалютно Тип данных nvarchar и varchar, так же разницы нет, результат один Вижу ток 1 выход, это получать данные в двоичном коде и преобразовывать их в строку уже, но это очень жестко как по мне, поэтому решил поделиться с вами в надежде услышать годную подсказку
29 мая, 20222 yr comment_181936 Сделай var_dump($sql_fetch->fetchAll()); die; вместо цикла, посмотри на сырые данные. 4 минуты назад, SoulRainr сказал: услышать годную подсказку сначала код в порядок приведи, потом ошибки ищи. Edited 29 мая, 20222 yr by Desti
29 мая, 20222 yr Author comment_181939 3 минуты назад, Desti сказал: Сделай var_dump($sql_fetch->fetchAll()); die; вместо цикла, посмотри на сырые данные. сначала код в порядок приведи, потом ошибки ищи. Ласт раз повторяю, какой бы код не был, выводит одно и тоже Выше код приведен как пример, т.е просто суть передать Дамп ничего не дает, как и xdebug
29 мая, 20222 yr comment_181941 3 минуты назад, SoulRainr сказал: Дамп ничего не дает Если в базу заглянуть, то там по русски, а в объекте pdo уже транслитерация? И это с учетом того, что mssql никакой транслитерации нет в принципе (из коробки)? Чудес не бывает.
29 мая, 20222 yr Author comment_181942 Как я понял еще как бывают PDO ODBC не даёт выводить nvarchar по их мануалам официальным, но при этом я вывожу В базе все хорошо, при хдебаге видно что текст передается нормально, но почему то в браузере он уже сам по себе скачет (хдебаг этого не видит) Было склонение из за того что много подключений по PDO ODBC идёт, т.е много файлов залиты и все открыты, но это отбросилось так как PDO не нуждается в закрытии и обрабатывается корректно Поэтому мыслей и идей нет вообще
29 мая, 20222 yr comment_181943 Транслитерация это обычно удел браузеров. Рекомендую попробовать мозиллу без расширений. Она наверно единственная не обладает подобными свистоперделками из коробки. Все остальные браузеры часто делают перевод текста не запрашивая разрешения пользователя, и если текста нет в словаре они вполне могут выдать транслитерацию.
29 мая, 20222 yr comment_181944 2 минуты назад, SoulRainr сказал: но почему то в браузере он уже сам по себе скачет (хдебаг этого не видит) Давайте мух от котлет отделим? Тупо в консоли ($ php test.php) что выдает этот код? Всегда правильно или меняется?
29 мая, 20222 yr Author comment_181947 30 минут назад, Desti сказал: Давайте мух от котлет отделим? Тупо в консоли ($ php test.php) что выдает этот код? Всегда правильно или меняется? Не совсем понял, в консоль браузера вывести переменнуЮ?
29 мая, 20222 yr comment_181948 php код может исполняться двумя способами: через браузер и через командную строку. Через браузер у вас проблемы, надо проверить через запуск интерпретатора php.
29 мая, 20222 yr comment_181951 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.