Что такое код ibase_close

ibase_fetch_assoc возвращает ошибку в windows xp

Это простой код, который я использую для получения некоторых данных из базы данных InterBase:

Этот код отлично работает на Windows 7, но на XP (где код должен работать на производстве) он возвращает следующую ошибку:

ibase_fetch_assoc(): арифметическое исключение, числовое переполнение или усечение строки Невозможно транслитерировать символ между наборами символов

Кто-нибудь знает, как заставить его работать?

Если вы получаете некоторую ошибку, например, «арифметическое исключение», «числовое переполнение» или «усечение строки». Нельзя транслитерировать символ между наборами символов «(это происходит, когда вы пытаетесь использовать символ с акцентами) при использовании этого и после ibase_query() вы должны установить набор символов (т.е. ISO8859_1 или ваш текущий набор символов).

Это решение в моем случае? Если это так, я должен установить набор символов?

Вам необходимо установить правильную кодировку на сеансе ibase. Если не задано, то php следует по умолчанию. Поскольку вы уже устанавливаете кодировку, у вас могут быть данные в базе данных, которые недействительны в качестве ISO-8859-1.

При подключении к базе данных установите кодировку как 4-й параметр в ibase_connect. Вам либо нужно установить «правильную» кодировку, либо в некоторых случаях вы можете использовать charset «NONE», если вы используете «NONE», у вас не будет никаких преобразований символов и используйте более или менее необработанные данные.

ibase_close

Руководство по PHP
Пред. След.

ibase_close

(PHP 3 >= 3.0.6, PHP 4, PHP 5)

ibase_close — Close a connection to an InterBase database

Description

Closes the link to an InterBase database that’s associated with a connection >ibase_connect() . If the connection > TRUE в случае успешного завершения или FALSE в случае возникновения ошибки.

Что такое код ibase_close

Пишу в BCB 6 такой код:

Вызываю его в FormShow.
Использую Firebird-1.0.2.908-Win32.
На моей машине (там где компилирую), установлен этот FB.
ситуация следующая:
— при подсоединии к базе по пути — «localhost:F:\db\base.gdb» — все работает;
— при подсоединии к базе по пути — «F:\db\base.gdb» — все работает;
— при подсоединии к базе по пути — «localhost/3050:F:\db\base.gdb» — вылетает ошибка «Unable to complete network request to host ‘localhost’. Failed to locate host machine. Undefined service 3050/tcp.» Хотя в FAQ на www.ibase.ru сказано:

В последних билдах FB (от 1.0.0.338) клиент (gds32.dll) и сервер по умолчанию
используют порт 3050 (не требуется запись в services), клиент (gds32.dll) может
указать порт в строке коннекта — server/3050:c:\dir\data.gdb

Непонятно — только клиент может указать порт в строке или и из под сервера так можно делать?

Далее. На «чистой» машине, где установлен только Win (проверял на W2k Pro SP3) ситуция другая:

— при подсоединии к базе по пути — «localhost:F:\db\base.gdb» — вылетает ошибка

«Unable to complete network request to host ‘localhost’. Failed to locate host machine. Undefined service gds_db/tcp.»
— при подсоединии к базе по пути — «F:\db\base.gdb» — происходит тоже самое;
— при подсоединии к базе по пути — «localhost/3050:F:\db\base.gdb» — вылетает ошибка

«Unable to complete network request to host ‘localhost’. Failed to locate host

machine. Undefined service 3050/tcp.»

На этой же машине, записываю строчку «gds_db 3050/tcp» в файл services, добаляю

— при подсоединии к базе по пути — «localhost:F:\db\base.gdb» — вылетает ошибка

«operating system directive Create file failed. Системе не удается найти указаный

файл.» Это еще что такое ? Я же ничего не создаю, просто открываю базу.
— при подсоединии к базе по пути — «F:\db\base.gdb» — происходит тоже самое;
— при подсоединии к базе по пути — «localhost/3050:F:\db\base.gdb» — вылетает ошибка «Unable to complete network request to host ‘localhost’. Failed to locate host machine. Undefined service 3050/tcp.»

Так верить факу или нет ?
Между прочим в том же факе сказано, что прописывать строчку надо только для IB5.x,

для 6.х/FB про то что нужно чтото прописывать — ни слова. Хотя только в самом низу сказано, что не прописывать можно только для новой верии Firebird, хотя и это не работает.

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

Добавление от 22.05.2003 22:48:

C помощью filemon смотрел какой файл пытается открыть программа, когда выдает ошибку «operating system directive Create file failed. Системе не удается найти указаный файл.»
Вот что я увидел в этот момент:

C чего это она рубится в C:\Program Files\Borland\InterBase ??
Файл interbase.msg согласно FAQ должен лежать в RootDirectory — там он и лежит.

1. Kid_Deceiver , 23.05.2003 06:34
Или все таки (появились тут у меня смутные подозренья) если хочешь юзать базу, установки одного серевера мало, нужно еще и клиент поставить. надо проверить.
да. Но ведь это Вам уже говорили. И в FAQ черным-по-белому написано, что при любом варианте установки на destination PC должен быть gds32.dll (клиент). Я еще раз повторю, все программы работают _только_ через клиента (даже если сервер стоит на той же машине). Может меняться механизм транспорта, например не через tcp и или ipx, а через т.н. «локальное соединение» (memory-mapped files), но клиент должен быть всегда.

Добавление от 23.05.2003 08:04:

Что это за ключ «InterBase_for_MM»? Это именно в FB так или Ваша самодеятельность? Вообще-то у стандартного IB должно быть просто Уж не поэтому ли установки правильно не читаются?

Base64 Decode / Encode

Как известно в одном байте можно поместить 256 цифр, начиная с 0 и заканчивая 255. В случае с шестибитным байтом умещается только 64 символа, от 0 до 63. Казалось бы, это не дает ничего полезного, а только увеличивает размер представленной информации. На самом же деле, этот алгоритм очень важен и полезен. Он позволяет присвоить каждой цифре из такого байта печатный символ. Нужно всего лишь 64 символа, это не так уж и много, поэтому для этого используется ASCII (стандартная, американская кодировка). Это значит, что Base64 имеет свой собственный «алфавит», который и обеспечивается названной кодировкой.

Сам алфавит можно разделить на несколько групп:

Далее берется три обыкновенных восьмибитных байт, то есть 24 бита, и разбиваются на 4 группы по 6 бит. Каждая из таких четырех групп и будет являться шестибитным байтом. Хотя по сути, это все тот же стандартный байт из восьми бит, но используются в нем только младшие шесть бит, а два старших просто отбрасываются.

Для чего это нужно?

Для веб-мастеров данный алгоритм пригодится в таких сферах:

Как пользоваться декодировщиком Base64?

Наш инструмент для декодирования Base64 очень простой и интуитивно понятен. Все, что от вас требуется это просто вставить код Base64, который вы хотите раскодировать в форму нашего сервиса, и во второй форме сразу же появится раскодированный текст. Здесь же вы можете не только раскодировать, но еще и закодировать в Base64 любой текст, для этого нужно просто сменить направление специальной кнопкой.

Понять «ibase» и «obase» в случае конверсий с bc?

Я часто использую утилиту bc для преобразования hex в десятичную и наоборот. Тем не менее, это всегда бит-бит и ошибка, как следует настроить ibase и obase . Например, здесь я хочу преобразовать шестнадцатеричное значение C0 в десятичное:

Какая здесь логика? obase ( A в моем третьем примере) должен находиться в той же базе, что и преобразованное значение ( C0 в моих примерах) и ibase ( 16 в моем третьем примере), должно быть в базе, где я конвертирую?

3 Solutions collect form web for “Понять «ibase» и «obase» в случае конверсий с bc?”

То, что вы на самом деле хотите сказать:

для hex-to-decimal и:

Вам не нужно ibase как ibase и obase для любого преобразования, включающего десятичные числа, поскольку по умолчанию эти параметры obase 10.

Вам нужно дать оба для конверсий, таких как двоичный-шестнадцатеричный. В этом случае я считаю, что проще всего понять вещи, если вы сначала obase :

Если вы сначала дадите ibase вместо этого, он изменит интерпретацию следующих параметров obase , так что команда должна быть:

Это связано с тем, что в этом порядке значение obase интерпретируется как двоичное число, поэтому вам нужно дать 10000₂ = 16, чтобы получить результат в шестнадцатеричном формате. Это неуклюже.

Теперь позвольте мне объяснить, почему ваши три примера ведут себя так, как они.

echo «ibase=F;obase=A;C0» | bc

Это устанавливает базовую базу на 15, а выходную базу – на 10, поскольку однозначное значение интерпретируется в шестнадцатеричном формате, согласно POSIX . Это просит bc рассказать вам, что C0₁₅ находится в базе A₁₅ = 10, и он правильно отвечает на 180₁₀, хотя это, конечно, не вопрос, который вы хотели спросить.

echo «ibase=F;obase=10;C0» | bc

Это нулевое преобразование в базе 15.

Зачем? Во-первых, потому что один символ F интерпретируется в шестнадцатеричном виде, как я указал в предыдущем примере. Но теперь, когда вы установили его на базу 15, следующий базовый параметр вывода интерпретируется таким образом, а 10₁₅ = 15, поэтому у вас есть нулевое преобразование из C0₁₅ в C0₁₅.

Правильно, выход не в шестнадцатеричном виде, как вы предполагали, это в базе 15!

Вы можете доказать это сами, пытаясь преобразовать F0 вместо C0 . Поскольку в базе 15 нет цифры F , bc зажимает ее до E0 и дает E0 в качестве выхода.

echo «ibase=16; obase=A; C0»

Это единственный из ваших трех примеров, которые, вероятно, имеют практическое применение.

Он сначала меняет входную базу на шестую, так что вам больше не нужно вникать в спецификацию POSIX, чтобы понять, почему A в этом случае интерпретируется как hex, 10. Единственная проблема с этим заключается в том, что избыточно установить выходную базу на A₁₆ = 10, так как это значение по умолчанию.

Установка ibase означает, что вам нужно установить obase на той же базе. Объяснение ваших примеров покажет это:

Вы устанавливаете bc для рассмотрения входных чисел, представленных в базе 15, с помощью «ibase = F». «obase = A» устанавливает выходные номера на базовую 10, что является значением по умолчанию.

bc читает C0 в качестве базового числа 15: C = 12. 12 * 15 = 180.

В этом случае вы устанавливаете вход на базу 15 и выходите на 10 – в базу 15, поэтому выходная база равна 15. Вход C0 в основании 15 является выходом C0 в базе 15.

Установить вход на базу 16, выход на базу 10 (А в основании 16 составляет 10 в базе 10).

C0, преобразованный в основание 10, составляет: 12 * 16 = 192

Мое личное правило состоит в том, чтобы сначала установить obase, чтобы я мог использовать базу 10. Затем установите ibase, также используя базу 10.

Обратите внимание: bc имеет ироническое исключение: ibase=A и obase=A всегда задает ввод и вывод в базу 10. На странице man bc :

Такое поведение закреплено в спецификации bc : из спецификации OpenCroup 2004 года :

Вот почему установка ibase=F изменила вашу базу ввода на базовую 15, и почему я рекомендовал всегда устанавливать базу с использованием базы 10. Не путайте себя.

Все номера интерпретируются GNU bc как текущая база ввода, которая действует для оператора, номер которого появляется. Когда вы используете цифру вне текущего ввода, интерпретируйте их как самую высокую цифру, доступную в базе (9 в десятичной форме), когда часть многозначного числа или их нормальных значений при использовании в качестве числа с одной цифрой ( A = 10 в десятичной форме).

Из руководства GNU bc :

Одиночные цифры всегда имеют значение цифры независимо от значения ibase . (т.е. A = 10.) Для многозначных чисел bc изменяет все входные цифры, большие или равные ibase, на значение ibase -1. Это делает число FFF всегда самым большим 3-значным числом входной базы.

Однако вы должны знать, что стандарт POSIX определяет это поведение для присвоений ibase и obase , а не в каком-либо другом контексте.

Из спецификации SUS на bc :

Если либо ibase, либо obase присваивается однозначное значение из списка в лексических условностях в bc, значение должно приниматься в шестнадцатеричном виде. (Например, ibase = A устанавливает базовую десятку независимо от текущего значения ibase .) В противном случае поведение не определено, если на входе появляются цифры больше или равны значению ibase . Ибаса и обез должны иметь начальные значения 10.

Ключевым фактором, который вам не хватает, является то, что F на самом деле не шестнадцать, но на самом деле пятнадцать, поэтому, когда вы устанавливаете ibase = F, вы устанавливаете базу ввода на пятнадцать.

Поэтому, чтобы переносить ibase в шестнадцатеричный из неизвестного состояния, вам необходимо использовать два оператора: ibase=A; ibase=16 ibase=A; ibase=16 . Однако в начале программы вы можете полагаться на то, что она десятичная, и просто используйте ibase=16 .

Деобфускация PHP кода

Так уж случилось, что на днях мне попался один нужный PHP скрипт, но обфусцированный.
По какой-то причине он никак не работал. Я пишу на PHP достаточно давно, и мне очень нравится отлавливать нестандартные ситуации в скриптах, особенно когда при выполнении в логах нет ошибок, а скрипт просто не выполняет своих предназначенных обязанностей, руки так и чесались расшифровать. Последней каплей стало то, что автора этого скрипта не было в сети, чтобы помочь решить мою проблему. Скрипт кстати куплен моим товарищем, собственно он и попросил помочь.

Цель данной статьи, показать принцип дешифровки, зашифрованных скриптов, чтобы например расшифровать залитый злоумышленником вирус на PHP.

Анализирование кода

Вот один из этих скриптов, открывая такой скрипт в блокноте, мы увидим:

Разобьем для начала его на строки:

и сохраним в файл encoded_script.php

Видно что тут код разбит на 4е части. В каждой выполняется eval.
Для удобства дешифровки eval воспользуемся расширением для PHP — Evalhook. Его написал Stefan Esser за что ему большущее спасибо. С помощью него можно расшифровывать в несколько проходов например монстров закодированных через www.php-crypt.com функциями eval, gzuncompress, base64_decode и тд.

Установка evalhook

Скачиваем архив с исходниками

Распаковываем и собираем расширение для PHP

расширение готово, теперь его можно динамически подгружать в консоль и смотреть зашифрованный скрипт.

где encoded_script.php — закодированный файл.
Для получения исходного кода просто жмем «Y» несколько раз в процессе деобфускации. Каждый новый Y будет расшифровывать следующий eval. Ну что ж вооружимся консолью и в бой!

Деобфускация и декодирование

1-й eval расшифровали, нужный нам код находится между символами»—-«. Впоследствии после всех шагов нужно будет его скопировать в файл. Нажимаем Y и продолжаем расшифровывать.
2-й проход:

Ну вот и всё, дальше продолжать нет смысла, потому что внутри нашего шифрованного файла, как видно по коду, includ’ится еще один зашифрованный файл, но мы его потом отдельно расшифруем. Главное правило сколько у нас eval, столько раз жмём Y, иначе наш скрипт выполнится вплоть до исполнения кода целиком, нам это не нужно.

Собираем полученное в один файл

Копируем содержимое всех расшифрованных eval (код между —-) в блокнот, я получил вот такую картину:

Чтобы не было всё в каше без пробелов пропустим это добро через php beautifier, дабы получить нормальные отступы.

Наш код уже становится похож на человечный

Далее, видим что вместо привычных нами функций, в файле определены глобальные переменные с их именами, чтобы нам расшифровать их имена, и не заниматься этим вручную, после последнего определения $GLOBALS[‘_888028985_’] = Array(… сделаем var_export, выглядеть будет примерно так:

сохраним полученный код в тот же файл и выполним его просто через консоль (можно и в браузере):

получаем заветные названия функций:

Далее последняя стадия, замена всех функций из глобального массива ($GLOBALS[‘_888028985_’]) на их настоящие аналоги.
Но для начала удалим все вспомогательные куски (те что идут до var_export($GLOBALS[‘_888028985_’]);die;).
Как вы поняли обфускатор первые три eval’a использовал для 3х разового кодирования функций в глобальный массив $GLOBALS[‘_888028985_’], в четвертом eval’e все настоящие функции были заменены их псевдонимами из $GLOBALS[‘_888028985_’], поэтому нам нужно оставить только четвертый раскодированный код, первые три раскодированных куска, включая наш код для вывода ($GLOBALS[‘_888028985_’]) нам больше не нужны.

Окончательная замена функций:

Есть два пути решения:
1) вручную поиск всех строк типа $GLOBALS[‘_888028985_’][. ]() и замена их на соответствующий им ключ в расшифрованном массиве функций.
2) автоматом, я выбрал этот вариант, так как файлов было много, я написал простенький скрипт __decode.php для автозамены данных функций, привожу его код тут.

в итоге в файле unencoded_script_full.php будет полностью искомый скрипт с нормальными функциями, полученный код смотреть здесь.

Кстати деобфускация помогла мне решить проблему, из-за чего не работал скрипт, но это уже другая история…

P.S. Естественно скрипты могут быть зашифрованы различными и более ухищренными способами и мой способ не панацея, я лишь показал логику дешифровки таких скриптов. Например некоторые обфускаторы могут всем переменным присвоить другие имена, и понять логику таких скриптов уже будет сложнее.

UPD от автора скрипта:

zuziken (20:30:15 2/02/2012)
*THUMBS UP*
zuziken (21:10:42 2/02/2012)
Спс за обзор, но код пишет программист, а не я:-)

ibase_fetch_assoc возвращает ошибку в windows xp

Это простой код, который я использую для получения некоторых данных из базы данных InterBase:

Этот код отлично работает на Windows 7, но на XP (где код должен работать на производстве) он возвращает следующую ошибку:

ibase_fetch_assoc(): арифметическое исключение, числовое переполнение или усечение строки Невозможно транслитерировать символ между наборами символов

Кто-нибудь знает, как заставить его работать?

Если вы получаете некоторую ошибку, например, «арифметическое исключение», «числовое переполнение» или «усечение строки». Нельзя транслитерировать символ между наборами символов «(это происходит, когда вы пытаетесь использовать символ с акцентами) при использовании этого и после ibase_query() вы должны установить набор символов (т.е. ISO8859_1 или ваш текущий набор символов).

Это решение в моем случае? Если это так, я должен установить набор символов?

Вам необходимо установить правильную кодировку на сеансе ibase. Если не задано, то php следует по умолчанию. Поскольку вы уже устанавливаете кодировку, у вас могут быть данные в базе данных, которые недействительны в качестве ISO-8859-1.

При подключении к базе данных установите кодировку как 4-й параметр в ibase_connect. Вам либо нужно установить «правильную» кодировку, либо в некоторых случаях вы можете использовать charset «NONE», если вы используете «NONE», у вас не будет никаких преобразований символов и используйте более или менее необработанные данные.

Что такое код ibase_close

Пишу в BCB 6 такой код:

Вызываю его в FormShow.
Использую Firebird-1.0.2.908-Win32.
На моей машине (там где компилирую), установлен этот FB.
ситуация следующая:
— при подсоединии к базе по пути — «localhost:F:\db\base.gdb» — все работает;
— при подсоединии к базе по пути — «F:\db\base.gdb» — все работает;
— при подсоединии к базе по пути — «localhost/3050:F:\db\base.gdb» — вылетает ошибка «Unable to complete network request to host ‘localhost’. Failed to locate host machine. Undefined service 3050/tcp.» Хотя в FAQ на www.ibase.ru сказано:

В последних билдах FB (от 1.0.0.338) клиент (gds32.dll) и сервер по умолчанию
используют порт 3050 (не требуется запись в services), клиент (gds32.dll) может
указать порт в строке коннекта — server/3050:c:\dir\data.gdb

Непонятно — только клиент может указать порт в строке или и из под сервера так можно делать?

Далее. На «чистой» машине, где установлен только Win (проверял на W2k Pro SP3) ситуция другая:

— при подсоединии к базе по пути — «localhost:F:\db\base.gdb» — вылетает ошибка

«Unable to complete network request to host ‘localhost’. Failed to locate host machine. Undefined service gds_db/tcp.»
— при подсоединии к базе по пути — «F:\db\base.gdb» — происходит тоже самое;
— при подсоединии к базе по пути — «localhost/3050:F:\db\base.gdb» — вылетает ошибка

«Unable to complete network request to host ‘localhost’. Failed to locate host

machine. Undefined service 3050/tcp.»

На этой же машине, записываю строчку «gds_db 3050/tcp» в файл services, добаляю

— при подсоединии к базе по пути — «localhost:F:\db\base.gdb» — вылетает ошибка

«operating system directive Create file failed. Системе не удается найти указаный

файл.» Это еще что такое ? Я же ничего не создаю, просто открываю базу.
— при подсоединии к базе по пути — «F:\db\base.gdb» — происходит тоже самое;
— при подсоединии к базе по пути — «localhost/3050:F:\db\base.gdb» — вылетает ошибка «Unable to complete network request to host ‘localhost’. Failed to locate host machine. Undefined service 3050/tcp.»

Так верить факу или нет ?
Между прочим в том же факе сказано, что прописывать строчку надо только для IB5.x,

для 6.х/FB про то что нужно чтото прописывать — ни слова. Хотя только в самом низу сказано, что не прописывать можно только для новой верии Firebird, хотя и это не работает.

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

Добавление от 22.05.2003 22:48:

C помощью filemon смотрел какой файл пытается открыть программа, когда выдает ошибку «operating system directive Create file failed. Системе не удается найти указаный файл.»
Вот что я увидел в этот момент:

C чего это она рубится в C:\Program Files\Borland\InterBase ??
Файл interbase.msg согласно FAQ должен лежать в RootDirectory — там он и лежит.

1. Kid_Deceiver , 23.05.2003 06:34
Или все таки (появились тут у меня смутные подозренья) если хочешь юзать базу, установки одного серевера мало, нужно еще и клиент поставить. надо проверить.
да. Но ведь это Вам уже говорили. И в FAQ черным-по-белому написано, что при любом варианте установки на destination PC должен быть gds32.dll (клиент). Я еще раз повторю, все программы работают _только_ через клиента (даже если сервер стоит на той же машине). Может меняться механизм транспорта, например не через tcp и или ipx, а через т.н. «локальное соединение» (memory-mapped files), но клиент должен быть всегда.

Добавление от 23.05.2003 08:04:

Что это за ключ «InterBase_for_MM»? Это именно в FB так или Ваша самодеятельность? Вообще-то у стандартного IB должно быть просто Уж не поэтому ли установки правильно не читаются?

ibase_close

ibase_close — Close a connection to an InterBase database

Description

Closes the link to an InterBase database that’s associated with a connection >ibase_connect() . Default transaction on link is committed, other transactions are rolled back.

Parameters

An InterBase link >ibase_connect() . If omitted, the last opened link is assumed.

Return Values

Returns TRUE on success or FALSE on failure.

See Also

  • ibase_connect() — Open a connection to a database
  • ibase_pconnect() — Open a persistent connection to an InterBase database

User Contributed Notes

Before close the connection remember to free your query results too.

$dbh = ibase_connect($host, $username, $password);
$stmt = ‘SELECT * FROM tblname’;
$sth = ibase_query($dbh, $stmt);
while ($row = ibase_fetch_object($sth)) <
.
>
ibase_free_result($sth); //

Что такое код: base ()

Какова цель base() в следующем коде?

Почему во время разработки отображаются сообщения؟

2 ответа

base() в вашем коде — это вызов конструктора без параметров базового класса myTextBox , который является TextBox . Обратите внимание, что этот базовый конструктор будет выполняться до выполнения тела конструктора в производном классе.

Каждый конструктор класса должен в конечном итоге вызвать один из конструкторов своего базового класса, либо напрямую, либо через цепочечные конструкторы в одном и том же классе. Следовательно, в каждом объявлении конструктора всегда есть неявный / явный вызов base(. ) или явный вызов this(. ) . Если он опущен, существует неявный вызов base() , т.е. конструктор без параметров базового класса (это означает, что вызов base() в вашем примере является избыточным). Компилируется ли такое объявление или нет, зависит от того, существует ли такой базовый конструктор в базовом классе.

РЕДАКТИРОВАТЬ : две тривиальные точки:

Илон Маск рекомендует:  Основы для веб-разработчика «PHP, уровень 1»
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL