Форум: "Потрепаться";
Текущий архив: 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