Не могу подключиться к Ingres с php 7

I have to build a php website which has to connect to an Ingres database server.

Я скачал мост JDBC-PHP sourceforge pjbs. Я установил это в папку проекта и попытался подключиться к моей базе данных Ingres. Я не понимаю, какие параметры нужны fsockopen (), для хоста базы данных (сервера VMS) я использую vnode, но ingres использует строку в качестве порта, а fsockopen хочет иметь целое число. я использую php 7.2.3 в Windows 7 Ingres 9.2 на HP OpenVMS v.8.4

<?php

require "lib/PJBridge.php";

function get_connection()
{
    $connStr = "jdbc:ingres://vnode:II7/dbname";

    $db = new PJBridge();
    $result = $db->connect($connStr, $user, $password);

    if (!$result){
        die("Failed to connect");
}
return $result;}


<?php
class PJBridge {

    private $sock;
    private $jdbc_enc;
    private $app_enc;

    public $last_search_length = 0;

    function __construct($host = "vnode", $port=-1, $jdbc_enc = "ascii", $app_enc = "ascii") {

        $this->sock = fsockopen($host, $port);

        $this->jdbc_enc = $jdbc_enc;
        $this->app_enc = $app_enc;
}
phptutorial.info/?fsockopen
Fky 22.05.2018 14:49

Можете ли вы поделиться своим кодом и сообщением об ошибке, если оно существует?

Nico Haase 22.05.2018 14:54

Кажется, что на самом деле существует официально поддерживаемое расширение Ingres для PHP, документация здесь php.net/manual/en/book.ingres.php, использование которого почти наверняка будет намного проще, чем использование сырых сокетов tcp: o

hanshenrik 22.05.2018 15:09

Насколько мне известно, это расширение не работает для PHP 7

yolande 28.05.2018 14:04
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
4
150
1

Ответы 1

ingres uses a string as port - затем преобразуйте его в int. вам, вероятно, также следует убедиться, что он действительно возвращает числовую строку в диапазоне (допустимые диапазоны портов для ipv4 и ipv6: 1-65535. (порт 0 также существует, но недоступен в большинстве систем))

$port = "9999";
$old = $port;
if (false === ($port = filter_var ( $port, FILTER_VALIDATE_INT, array (
        'options' => array (
                'min_range' => 1,
                'max_range' => 65535 
        ) 
) ))) {
    throw new \LogicException ( "port is not a valid integer in range 1-65535! ($old)" );
}
// here, $port is guaranteed to be an int in range 1-65535.

Что касается того, какие параметры нужны socket_connect, проверьте этот пример, подключившись к example.com через порт 80, чтобы загрузить на него веб-сайт html:

$fp = fsockopen ( "www.example.com", 80, $errno, $errstr, 30 );
if (! $fp) {
    echo "error connecting: $errstr ($errno)<br />\n";
} else {
    $out = "GET / HTTP/1.1\r\n";
    $out .= "Host: www.example.com\r\n";
    $out .= "Connection: Close\r\n\r\n";
    fwrite ( $fp, $out );
    while ( ! feof ( $fp ) ) {
        echo fgets ( $fp, 128 );
    }
    fclose ( $fp );
}

все это было взято из документация fsockopen.

И в заключение, у меня нет опыта работы с Ingres, но необработанные API-интерфейсы TCP становятся чрезвычайно редкими. Вы уверены, что для Ingres нет доступных API-интерфейсов более высокого уровня? Обновлено: да, есть, проверьте http://php.net/manual/en/book.ingres.php, использование этого расширения почти наверняка будет намного проще, чем использование сырых сокетов tcp

echo(0x65535); показывает 415029, похоже, писать 65535, поскольку двоичный файл здесь бесполезен.
A.L 22.05.2018 15:15

@ A.L Ого, понятия не имею, как этот 0x попал туда, спасибо. думаю, я обсуждал, писать ли 0xFFFF или 65535, и все испортил (0xFFFF имеет смысл, потому что он короче и это ровно 2 байта, из которых состоит номер порта, это порт uint16_t)

hanshenrik 22.05.2018 15:32

Насколько мне известно, php.net/manual/en/book.ingres.php относится к 2013 году и больше не поддерживается Action (Ingres)

yolande 04.06.2018 10:49

Другие вопросы по теме