Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2003.01.06;
Скачать: [xml.tar.bz2];

Вниз

Не про Дельфи, а про PHP, но может кто подскажет.   Найти похожие ветки 

 
BlackTiger   (2002-12-17 00:21) [0]

Никто и нигде мне не может дать ответа, как буд-то я глупость спрашиваю.

Пытаюсь прочитать данные из MSSQL2000, используя PHP4 (Apache | IIS).
Нашел примеры, поставил Апач для простоты. Настроил ПХП, подключил модуль "php_mssql.dll". Пытаюсь значит.
Сам скрипт вроде понятен: коннект->выбор базы->запрос->перебор записей->закрытие коннекта. И количество записей получаю, и список колонок, и по записям, вроде, проход делается. НО ЗНАЧЕНИЯ ПОЛЕЙ ВСЕ ПОЧЕМУ-ТО ПУСТЫЕ !!! Массив, в который должны заноситься значения полей ($rec = mssql_fetch_array($query_res)), просто ничего не содержит!
Сначала думал, что я что-то не так делаю, потом в нете нашел, что я не одинок, но ответов тоже нету.
Есть очень смутное подозрение на кодировки (charset) и их обработку в ПХП (был у кого-то немного похожая проблема, тоже без толкового ответа).
Вопрос - ну и где грабли? Я понимаю, что PHP+MSSQL далеко не всеми любимое сочетание ( ;-) ), но библиотека php_mssql есть и, имхо, должна работать, несмотря на всякие "фу".


 
McSimm   (2002-12-17 13:08) [1]

Приведи код, в котором это проявляется. Никогда с такой проблемой не сталкивался.
И сразу посмотри что покажет var_dump($rec).


 
BlackTiger   (2002-12-17 14:07) [2]

Вот например такой вариант (перепробовал много, но эффект один)

<%
echo "<html><body>";
echo " Hallo!<br>";

$dbli = mssql_connect("SQLSRV","sa","PASSWORD");
if ($dbli > 0)
{
$dbs = mssql_select_db("SHOPING",$dbli);
if ($dbs)
{
$my_query = "select TOP 100 [Code] as "Item Code",Description as "Item Description" from Items";
$result = mssql_query($my_query);
$nRows = mssql_num_rows($result);
$nCols = mssql_num_fields($result);
if($nRows == 0) die ("<br>No data found!<br>\n");
echo " Total of ".$nRows." rows and ".$nCols." columns returned.\n";

echo "<table>\n";
echo "<tr>";
for ($i = 0; $i <= $nCols - 1; $i++) {
$fName = mssql_field_name($result, $i);
echo "<th>", $fName, "</th>";
}
echo "</tr>\n";
for ($i = 0; $i <= $nRows - 1; $i++) {
#while ($r = mssql_fetch_array($result)) {
$r = mssql_fetch_row($result);
echo "<tr>";
for ($j = 0; $j <= $nCols - 1; $j++) {
$d = $r[$j];
if (!$d) $d = "*";
echo "<td>".$d."</td>\n";
}
echo "</tr>\n";
}
echo "</table>\n";
}
}
else
{
echo "Error!
";
}
mssql_close($dbli);
echo "See you...";
echo "</body><html>";
%>
</CODEЮ
Я перепробовал mssql_fetch_row, mssql_fetch_array, mssql_result, а результат один - нет значентй полей. В этом примере получаю таблицу из 100 строк звездочек :(
НУ ПОЧЕМУ? ВСЕ ГОВОРЯТ, ЧТО У НИХ РАБОТАЕТ!


 
AL2002   (2002-12-17 14:19) [3]


> BlackTiger (17.12.02 00:21)
> Никто и нигде мне не может дать ответа, как буд-то я глупость
> спрашиваю.

Видать, ты здесь ещё не спрашивал:
http://www.adelavida.com.ua/Forums/?Idx=7Scripts.PHP%26MySQL&StartVsQuest=Yes

Запад нам поможет.


 
McSimm   (2002-12-17 14:32) [4]

Все же интересно что показывает
$r = mssql_fetch_row($result); var_dump($r);

Сообщи детали: версия mssql, и типы полей Code,Description.



 
McSimm   (2002-12-17 14:33) [5]

насчет версии не заметил сразу.

У меня 7ка, с 2000 непробовал.



 
BlackTiger   (2002-12-17 14:36) [6]

У меня есть смутное предположение, что с MySQL работать будет (?!), но ставить его мне лень, да и задача - получить данные именно из MSSQL2000. И что-то либо в настройках самого PHP4 (о которых в доках почти ничего нет), либо непонятки в модуле php_mssql.dll


 
BlackTiger   (2002-12-17 15:10) [7]

Вот результат var_dump($res)
resource(2) of type (mssql result)

Мне лично ниочем не говорит, к тому же php.exe вываливается с GPF.
А может ли как-то влиять то, что кодировка страницы стоит UTF-8?


 
McSimm   (2002-12-17 15:18) [8]

Кодировка страницы никак повлиять не может.
Проблема imho в сервере 2000.
Могу предложить выход из положения - не использовать php_mssql.dll, а работать через OLE.
На самом деле достаточно удобно. Я например в основном только так и работаю, просто потому, что знаю ADO объекты.
Вот пример:
define("ConnectionString","Provider=SQLOLEDB; Data Source=server; Initial Catalog=Target_Vostok; User ID=user; password=\"password\"");
$conn = new COM("ADODB.Connection");
$conn->Open(ConnectionString);
$sql = "SELECT ID, WebClientLogin FROM Documents WHERE WebClientLogin = "$sessvar[Login]" order by ID";
$rs = $conn->Execute($sql);


 
BlackTiger   (2002-12-17 17:20) [9]

Хммм... АДО - это конечно хорошо, но я себе специально усложнил задачу. А что, если PHP (сам Web-сервер) под никсами, а MSSQL2000 под сам знаешь чем? Там никакими ADO и не пахнет, есть вроде unixODBC и что еще (FreeDS, кажется или что-то вроде того).

Меня даже больше интересует именно такая конфигурация - PHP на никсах, данные в MSSQL2000.

З.Ы.: Да, кстати, как обратиться к значениям поля?
echo "<td>", $result->fields(0).value, "</td>"
не проходит. Вроде д/б ["value"], что должно предшествовать?


 
McSimm   (2002-12-17 17:34) [10]

Тогда надо отказываться от 2000 и использовать 7.0
(Это мое мнение, возможно я ошибаюсь)

---
Напрямую от RecordSet получить значения полей я не смог. Делаю через Field. Вот функция для преобразования RS в ассоциативный массив:

function GetFields($rs)
{
$num_columns = $rs->Fields->Count();
for ($i=0; $i < $num_columns; $i++)
{
$fld = $rs->Fields($i);
$result[$fld->Name] = $fld->Value;
}
return $result;
}


 
BlackTiger   (2002-12-17 17:45) [11]

Как и ожидал - через АДО все работает. Блин! Как не возьмешься за всякие супер-пупер-оупен-соурс, так вечно грабле-хождение начинается...
Значит библиотечка несколько крива, по крайней мере для MSSQL2000 (блин, уже скоро новая версия выходит, а они все на 6.5/7-ом обкатывают).

З.Ы. (ИМХО): Ну почему, когда кто-то кричит "да мы! да у нас! да мы круче!", значит смотреть надо в оба. Скорее всего, это склад граблей и всяких "но". Вот Майкрософт, они не кричат, что самые крутые - они делом это доказывают (ну, иногда, не совсем получается, но воплей типа "да мы самые крутые!" я не помню). Майкрософт просто спокойно констатирует - "Да <пауза> мы самые крутые, за это вы нам и платите".


 
Wonder   (2002-12-17 17:46) [12]

А так не нагляднее?


while (list($field1, $field2)=mssql_fetch_row($result)) {
echo "field1: ".$field1." field2: ".$field2;
}


 
BlackTiger   (2002-12-17 18:03) [13]

2Wonder: такой вариант тоже пробовал. Проблема на в синтаксисе/подходе, а в самом модуле доступа php_mssql.dll
Он не может корректно выбрать само значение, но все операции проводит честно (открытие, кол-во записей, перебор записей).
Может он nvarchar не понимает (а в базе почти все данные - nvarchar), но пробовать мне уже лень - настроение испорчено самим фактом наличия такого косяка. Будет настроение - проверю.



Страницы: 1 вся ветка

Форум: "Потрепаться";
Текущий архив: 2003.01.06;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.008 c
7-15331
zalviko
2002-10-27 14:44
2003.01.06
Вопрос


14-15264
RV
2002-12-17 10:34
2003.01.06
Эспорт в Ексель идет не всегда. В чем м/б дело?


1-15148
Agent
2002-12-22 20:20
2003.01.06
Мастаки Help!!!!!!


3-14918
Vick
2002-12-02 16:26
2003.01.06
Сортировка в TClientDataSet


6-15186
Anar
2002-11-07 18:42
2003.01.06
Опять про MSHTML





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский