Всем добрый вечер! Недавно столкнулся с такой проблемой. Я работаю с MS SQL сервером, не все хостинги поддерживают его, поэтому приходится изобретать велосипед. Я с формы, которая находится на хостинге отправляю запрос на веб сервер, который находится непосредственно там же, где и MS SQL. У меня есть форма, допустим она выглядит так(находится на хостинге): HTML: <form id="form1" name="form1" method="post" action="http://удалённый сервер/script.php"> <p> Логин: <input type="text" name="login" /> </p> <p> Пароль: <input type="text" name="password" /> </p> <p> Подтверждение пароля: <input type="text" name="password2" /> </p> <p> E-mail: <input type="text" name="email" /> </p> <p> <input type="submit" name="Submit" value="Отправить!" /> </p> </form> Вот код script.php(находится на удалённом сервере): PHP: <?php mssql_connect("localhost", "логин", "пароль") or die ("Error!"); mssql_select_db("db") or die ("Error!"); // Тут идёт куча проверок перменных $_POST[...] // Потом проверки на оригинальность отправленных запросов. // Далее идёт запрос INSERT или SELECT в зависмости от того, что нам нужно $sql = mssql_query("INSERT INTO table (field1, field2....) VALUES ('$_POST['login'] .....)"); // потом идёт допустим проверка $sql if($sql) { $result = "Запись успешно добавлена в SQL"; }else{ $result = "Ошибка!"; } // Потом ключевой момент нам нужно отправить результат обратно на хостинг. // Я делаю это так: Header("Location: http://хостинг.ру/?result=$result"); // В этой строчке мы отправляем результат запроса на // хостинг методом GET. Переменную $result отправляем. ?> Вопрос в следующем: Если мы в заголовке отправляем короткий результат, например: "Запись успешно добавлена...", то этот метод вполне подходит. Но если мы делаем не INSERT, а SELECT и в результате нам нужно отправить огромный кучок html кода, полученный например с помощью while(), то тут возникают проблемы, так как GET имеет ограничение на кол-во символов и отсекает html теги. Может быть есть какой-нибудь альтернативный способ?
Ты не так сделай, если у тебя два сервера - на более мощном размести статику и скрипты, а на другом - БД. А то щас у тебя на одном только статика, а на другом - скрипты и БД. Т.е. делай mssql_connect(ip_сервера_бд...
В том то и дело, что мне нужно статику оставить там где она есть, т.е. на хостинге, желательно и скрипты конечно туда запихнуть, но это невозможно, т.к. хостинг это не поддерживает. Нужен альтернативный способ передачи большого кол-ва информации с сервера MS SQL на хостинг.
PHP он поддерживает, но он не поддерживает подключение с Microsoft SQL Server. Т.е. Он при использовании функции mssql_connect, пишет, что такая функция не найдена. Нужны соответствующие модули, но хостеры на эту тему даже разговаривать не хотят.
Ммм, тогда лучше всего делать так: 1. Скрипт с хостинга делает запрос скрипта на втором сервере, с помошью cURL, передавая данные методом POST 2. Скрипт на втором сервере разбирает запрос, выполняет, и получает результат в массив. Потом сериализует массив с результатом запроса (serialize или json_encode, первый вариант должен работать быстрее) и выводит результат (echo). 3. Скрипт на хостинге забирает этот результат (опять же с помощью cURL, все в пределах одного соединения), десериализирует и таким образом получает исходный массив с результатом
Но следует учесть, что тут на производительность будет сильно влиять качество соединения между хостингом и сервером с MS SQL. И хотя сервер БД кеширует результаты идущих подряд одинаковых запросов, толку от этого будет немного, т.к. намного больше времени уйдет на общение между серверами. Может быть, лучше поискать хостинг с MS SQL.
Так, теперь по порядку. 1-й пункт это я так понимаю моя форма на хостинге. 2-й пункт не совсем понятен. Выполняем запрос, результат запихиваем в массив, допустим: PHP: <?php // Выполняем запрос, далее выводим его if(mssql_num_rows($sq)>0) { while($field=mssql_fetch_array($sql)) { echo $field['field1']."<br />"; } }else{ echo "В базе ничего не найдено!"; } ?> И вот дальше мне не совсем понятно, что нужно делать и как использовать выше представленные функции. Нсчёт 3-го пункта тоже не понятно, как форма может забрать полученный результат?
Мне производительность не так Важна гигабайтов информации там всё равно не будет, речь идёт о передаче 2-3 Кб информации.
тупой вопрос: а что мешает на том сервере, где стоит MS SQL держать и сам сайт? веб-сервер там есть, php, видимо тоже. Зачем эти танцы с бубнами? и тупой вопрос №2: а что, держать 2 сервака дешевле, чем 1 нормальный с нужными настройками?
А - сервер хостинга, Б - сервер с mysql. action у формы - http://A/script.php. script.php: PHP: <?php if (isset($_POST['form'])) { $ch = curl_init('http://'.Б.'/dbscript.php'); /* Передача POST-запрса - не помню функции cURL )) */ $result = unserialize(curl_exec()); echo 'Ваш id '.$result['id']; // :-) } dbscript.php: PHP: <?php if (isset($_POST['login'])) { mssql_connect(...); $res = mssql_query('SELECT `id` FROM `users` WHERE `login`="'.$_POST['login'].'"'); echo serialize(mssql_fetch_array($res)); }
интересно, если я предложу слать запросы на сервер с БД тем же постом, контролировать откуда запросы пришли и отдавать в ответ нормальный xml, то меня ногами не запинают? а вообще, вышезаданные вопросы ещё в силе. зы. третий вопрос. если так дорога система из двух серверов, то почему бы не поискать такие, где можно нормально организовать запросы к удалённой базе?
Я бы так и сделал и не парился бы, но мне нужно сделать именно так, как я описал. Причин много, одна из них: "начальство".
в таком применении практически ни чем а вообще, можно нехилую систему кэширования запросов замутить… хотя, пофиг. Начальство же.
Сериализация работает именно так как нужно. Есть правда небольшая потеря в производительности, но не критично. При результате в 700 строк из БД, весь процесс длиться около 2-х секнду - это приемлимо. Спасибо за помощь такой способ пока подходит. Если возникнет проблема в производительности, буду продолжать танцевать с бубнами над кешеированием запросов).