Перейти к содержанию

Чудеса PDO ODBC


Рекомендуемые сообщения

Столкнулся с неистово неизвестной проблемой
Вывожу из базы данных mssql значения через PHP(IPS) и получаю нужное мне значение.

Все конечно хорошо, но если бы не одно но - Выводится рандомной кодировкой каждый раз. То есть я захожу на страницу где должно выводиться значение, вижу что там все хорошо, пару раз обновил страницу, тоже все хорошо. Но стоит мне обновить страницу через минуту - две, получается интересный результат, значение поменялось, хотя код и база не редактировалась.

Это до обновления страницы:
image.png.07d3489c404f1abb3f753c8c9a1e6168.png

Это после обновления страниче через пару минут:
image.png.063d80e278fb18f2f2e77f11320b0260.png

 

Если я обновлю страницу через опять же пару минут, получу обратный результат. Т.е получается оно меняется будто по таймеру определенному, хотя код до боли простой...
Данная проблема только с Русскими символами происходит

Код

<?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;
}

 

Ссылка на комментарий
Поделиться на другие сайты

А этот код где выполняется? В блоке каком-то или просто новый файл .php где-то отдельно? 

Ссылка на комментарий
Поделиться на другие сайты

Где бы не выполнял, результат один)

Выполнял в своём приложение через class do
И отдельным файлом чистым

Так же и на локалке(Компе)

Ост выполняется на VPS сервере

Ссылка на комментарий
Поделиться на другие сайты

Касаемо обновления результата через какое-то время, кмк, это вероятно какие-то кешированные значения. Либо блока IPS, либо кеша PHP, opcache например. Т.е. если код будет отредактирован сейчас, то его изменения произойдут через какое-то время (зависит от настроек). 

Можно попробовать добавить вывод значения не на экран, а в логи (файл, или еще куда-то), чтобы отсечь возможные варианты с какими-то внешними прослойками. Или отдебажить локально, посмотреть на значения переменных. 

Непохоже на проблемы с кодировкой, т.к. текст получился транслитирированным, если бы у него слетела кодировка, там были бы кракозябрики или вопросики

Ссылка на комментарий
Поделиться на другие сайты

$sql_fetch->execute();

  foreach ($top_lvl->fetchAll() as $row) {

Это точно рабочий код? Откуда $top_lvl взялся? Почему в результате <hr> перед строкой, а в коде после?

Ссылка на комментарий
Поделиться на другие сайты

Переменные отредактировал пере отправкой, забыл $top_lvl заменить на 

sql_fetch 
Ссылка на комментарий
Поделиться на другие сайты

Я в transact-sql не очень разбираюсь, но вопрос, нафига двойное преобразование? Почему не 

SELECT CAST([Name] AS VARCHAR(18)) AS Name FROM tbl_base WHERE Serial = 5

 

Ссылка на комментарий
Поделиться на другие сайты

Там разницы нет, хоть как преобразуй эффект 1

Ссылка на комментарий
Поделиться на другие сайты

Так попробуй не кастить вообще для начала. В каком типе данные в базе? Тот же варчар небось, нафига эти преобразования?

Ссылка на комментарий
Поделиться на другие сайты

2 минуты назад, Desti сказал:

Так попробуй не кастить вообще для начала. В каком типе данные в базе? Тот же варчар небось, нафига эти преобразования?

Повторю, разницы нету, меняю не меняю, вывожу на прямую или хоть как, результат один обсалютно
Тип данных nvarchar и varchar, так же разницы нет, результат один

Вижу ток 1 выход, это получать данные в двоичном коде и преобразовывать их в строку уже, но это очень жестко как по мне, поэтому решил поделиться с вами в надежде услышать годную подсказку 

Ссылка на комментарий
Поделиться на другие сайты

Сделай

var_dump($sql_fetch->fetchAll()); die;

вместо цикла, посмотри на сырые данные. 

4 минуты назад, SoulRainr сказал:

услышать годную подсказку

сначала код в порядок приведи, потом ошибки ищи.

Изменено пользователем Desti
Ссылка на комментарий
Поделиться на другие сайты

3 минуты назад, Desti сказал:

Сделай

var_dump($sql_fetch->fetchAll()); die;

вместо цикла, посмотри на сырые данные. 

сначала код в порядок приведи, потом ошибки ищи.

Ласт раз повторяю, какой бы код не был, выводит одно и тоже
Выше код приведен как пример, т.е просто суть передать 

Дамп ничего не дает, как и xdebug 

Ссылка на комментарий
Поделиться на другие сайты

3 минуты назад, SoulRainr сказал:

Дамп ничего не дает

Если в базу заглянуть, то там по русски, а в объекте pdo уже транслитерация? И это с учетом того, что mssql никакой транслитерации нет в принципе (из коробки)? 

Чудес не бывает.

Ссылка на комментарий
Поделиться на другие сайты

Как я понял еще как бывают

PDO ODBC не даёт выводить nvarchar по их мануалам официальным, но при этом я вывожу
В базе все хорошо, при хдебаге видно что текст передается нормально, но почему то в браузере он уже сам по себе скачет (хдебаг этого не видит)

Было склонение из за того что много подключений по PDO ODBC идёт, т.е много файлов залиты и все открыты, но это отбросилось так как PDO не нуждается в закрытии и обрабатывается корректно

Поэтому мыслей и идей нет вообще 

Ссылка на комментарий
Поделиться на другие сайты

Транслитерация это обычно удел браузеров.

Рекомендую попробовать мозиллу без расширений. Она наверно единственная не обладает подобными свистоперделками из коробки. Все остальные браузеры часто делают перевод текста не запрашивая разрешения пользователя, и если текста нет в словаре они вполне могут выдать транслитерацию.

Ссылка на комментарий
Поделиться на другие сайты

2 минуты назад, SoulRainr сказал:

но почему то в браузере он уже сам по себе скачет (хдебаг этого не видит)

Давайте мух от котлет отделим? Тупо в консоли ($ php test.php) что выдает этот код? Всегда правильно или меняется?

Ссылка на комментарий
Поделиться на другие сайты

30 минут назад, Desti сказал:

Давайте мух от котлет отделим? Тупо в консоли ($ php test.php) что выдает этот код? Всегда правильно или меняется?

Не совсем понял, в консоль браузера вывести переменнуЮ?

Ссылка на комментарий
Поделиться на другие сайты

php код может исполняться двумя способами: через браузер и через командную строку. Через браузер у вас проблемы, надо проверить через запуск интерпретатора php. 

Ссылка на комментарий
Поделиться на другие сайты

SoulRainr если у тебя MS система. Надо в cmd или в powershell выполнить команду.

с:\php\php.exe c:\***test.php

Поставь там свои пути в которые установлен php

В консоли линукса команда приведена выше

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...