Правила     Закладки     Карма    Календарь    Журналы    Помощь    Поиск    PDA    Чат   
        СМС-ки
   
Пейджер выключен!
Страницы: (2) [1] 2  ( Перейти к первому непрочитанному сообщению )  
Фильтр авторов:    показать 
  скрыть
  Ответ в темуСоздание новой темыСоздание опроса

> Помоги вывести на php странице запрос к mssql SP, PHP, MSSQL Stored Procedure
Dimych071190  
 ۩  [x] Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Новичок
*

Профиль
Группа: Пользователь
Сообщений: 12
Пользователь №: 42486
На форуме: 1 год, 3 месяца, 19 дней
Карма:




Всем ДВС. Столкнулся с проблемой. Есть сайтик в кодировке UTF8. Есть база на MSSQL. Есть там Stored Procedur. Вот сама процедура:

USE [AD_Users]
GO
/****** Object: StoredProcedure [dbo].[my_Vol_Quota_SUM] Script Date: 02/04/2016 10:26:22 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[my_Vol_Quota_SUM]

@Server varchar(9) OUT -- cannot be NULL
,@Vol varchar(6) -- cannot be NULL
,@CDate varchar(10) -- cannot be NULL
,@SQuota float OUT -- cannot be NULL
,@Size float OUT -- cannot be NULL
,@Free float OUT -- cannot be NULL
AS
BEGIN
SET NOCOUNT ON;

SELECT @Server=Vol_Size_Info.Server,
@SQuota=ROUND(SUM(Quota_Size_Info.Quota)/1024/1024, 4),
@Size=ROUND(Vol_Size_Info.Size/1024/1024, 4),
@Free=ROUND(100-(100*SUM(CONVERT(Float,Quota_Size_Info.Quota)))/CONVERT(Float,Vol_Size_Info.Size), 2)
FROM Vol_Size_Info INNER JOIN
Quota_Size_Info ON Vol_Size_Info.CDate = Quota_Size_Info.CDate and
Vol_Size_Info.Vol = Quota_Size_Info.Vol
WHERE Vol_Size_Info.Vol=@Vol and Vol_Size_Info.CDate=@CDate
GROUP BY Vol_Size_Info.Server, Vol_Size_Info.Size, Vol_Size_Info.Vol
END


В результате выходные параметры мне надо вывести в табличку с одной строкой.
Вот код PHP
<?php
$pdo = new PDO("sqlsrv:Server=IPADDRESS,1433;Database=BASE");
$sql = "CALL my_Vol_Quota_SUM(?,?,?,?,?,?)";
$sth = $pdo->prepare($sql);
$sth->bindParam(1, $Server, PDO::PARAM_STR);
$sth->bindParam(2, $Vol, PDO::PARAM_STR);
$sth->bindParam(3, $CDate, PDO::PARAM_STR);
$sth->bindParam(4, $squota, PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT, 7);
$sth->bindParam(5, $size, PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT, 7);
$sth->bindParam(6, $free, PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT,7);
$sth->execute();
print "<td align=\"center\">".$squota."</td>";
print "<td align=\"center\">".$size."</td>";
print "<td align=\"center\">".$free."</td>";
$pdo = null;
?>

Так вот в результате получаем крозябры с текстом ошибки такого рода anslating string for input param 5 to UCS-2: No mapping for the Unicode character exists in the target multi-byte code page.
Я погуглил, нашел такую команду:
$sth->setAttribute(PDO::SQLSRV_ATTR_ENCODING, PDO::SQLSRV_ENCODING_UTF8);

Пробовал с разными параметрами, не помогает. Подскажите, может кто сталкивался?
При чем если использую обычные SQL запросы не через PDO с кодировкой все нормально.
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
TranceIT  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



...Один я одинаковый...
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1776
Пользователь №: 19760
На форуме: 7 лет, 6 месяцев, 6 дней
Карма: 59




No mapping for the Unicode character exists in the target multi-byte code page.
Судя по сообщению, вы передаете в БД Unicode символ у которого нет замены в текущей кодировке БД.

Я с таким не сталкивался, та и вообще с MSSQL не работал, но первое что приходит в голову - установить кодировку соединения с БД.

Что-то типа
$pdo->query("SET NAMES 'utf8'");

сразу после подключения к БД.


--------------------
Безвозмездно помогаю только тем, кто сам пытается что-то сделать.

Остальным за WMR
Даже если там 10 строк кода!
Даже если мне это ничего не стоит!
Даже если вы нуб!

user posted image
PM
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Dimych071190  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Новичок
*

Профиль
Группа: Пользователь
Сообщений: 12
Пользователь №: 42486
На форуме: 1 год, 3 месяца, 19 дней
Карма:




Не помогает. Правда само сообщение об ошибке не читается, но выводятся крозябры вместо чисел.
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
TranceIT  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



...Один я одинаковый...
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1776
Пользователь №: 19760
На форуме: 7 лет, 6 месяцев, 6 дней
Карма: 59




А может проблема в следующем:

@Server varchar(9) OUT -- cannot be NULL
,@Vol varchar(6) -- cannot be NULL
,@CDate varchar(10) -- cannot be NULL
,@SQuota float OUT -- cannot be NULL
,@Size float OUT -- cannot be NULL
,@Free float OUT -- cannot be NULL



$sth->bindParam(5, $size, PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT, 7);

Процедура ожидает float, а передается string.
Я не нашел константы типа float для PDO, может PDO::PARAM_INT?

UPD

Хотя отбой. Пишут что для float\decimal используется PDO::PARAM_STR.


--------------------
Безвозмездно помогаю только тем, кто сам пытается что-то сделать.

Остальным за WMR
Даже если там 10 строк кода!
Даже если мне это ничего не стоит!
Даже если вы нуб!

user posted image
PM
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
TranceIT  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



...Один я одинаковый...
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1776
Пользователь №: 19760
На форуме: 7 лет, 6 месяцев, 6 дней
Карма: 59




Попробуйте сложить данные в базу как есть без использования процедуры. Сама база в utf-8?


--------------------
Безвозмездно помогаю только тем, кто сам пытается что-то сделать.

Остальным за WMR
Даже если там 10 строк кода!
Даже если мне это ничего не стоит!
Даже если вы нуб!

user posted image
PM
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Dimych071190  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Новичок
*

Профиль
Группа: Пользователь
Сообщений: 12
Пользователь №: 42486
На форуме: 1 год, 3 месяца, 19 дней
Карма:




Цитата (TranceIT @ 4.02.2016 - 15:09)
Попробуйте сложить данные в базу как есть без использования процедуры. Сама база в utf-8?

В смысле ссложить в базу? Я к этой базе уже обращался для вывода больших объемов данных через обычный запрос. Все работало на ура. А вот с PDO и хранимыми процедурами такая беда. Уже думаю отказаться от этих процедур и делать запрос к базе..
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
TranceIT  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



...Один я одинаковый...
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1776
Пользователь №: 19760
На форуме: 7 лет, 6 месяцев, 6 дней
Карма: 59




Цитата (Dimych071190 @ 4.02.2016 - 13:13)
В смысле ссложить в базу?

Не обратил внимание, что там селект.

Вобщем вся соль кроется вот тут
"Translating string for input param 5 to UCS-2: No mapping for the Unicode character exists in the target multi-byte code page"
.

Получается что база в UCS-2. Сайт в UTF-8. UCS-2 имеет меньший набор символов чем UTF-8. И при передаче данных процедуре происходит конвертация из UTF-8 в UCS-2, которая в данном случае завершается с ошибкой, т.к. какой-то из передаваемых символов отсутствует в UCS-2 наборе. Отсюда и результат на "эльфийском".


--------------------
Безвозмездно помогаю только тем, кто сам пытается что-то сделать.

Остальным за WMR
Даже если там 10 строк кода!
Даже если мне это ничего не стоит!
Даже если вы нуб!

user posted image
PM
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Dimych071190  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Новичок
*

Профиль
Группа: Пользователь
Сообщений: 12
Пользователь №: 42486
На форуме: 1 год, 3 месяца, 19 дней
Карма:




Это понятно. Спасибо. Буду ковырять дальше.
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Dimych071190  
 ۩  [x] Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Новичок
*

Профиль
Группа: Пользователь
Сообщений: 12
Пользователь №: 42486
На форуме: 1 год, 3 месяца, 19 дней
Карма:




А вот тогда еще вопрос. Сначала я пытался проделать то же самое без PDO
<?php
$server = "myip,1433\MSSQLSERVER";
$connectionInfo = array( "Database"=>"MY_BD");
$conn = sqlsrv_connect($server, $connectionInfo);
if (!$conn)
{
echo "Соединение не удалось, ошибка:";
die( print_r( sqlsrv_errors(), true));
}
else
{
$stmt = mssql_init("my_stored_proc", $conn);
$Server = "fs01";
$Vl = "vl514";
$CDate = $_GET['SelDate'];
mssql_bind($stmt, "@Server", $Server, SQLVARCHAR, false);
mssql_bind($stmt, "@Vl", $Vl, SQLVARCHAR, false);
mssql_bind($stmt, "@CDate", $CDate, SQLVARCHAR, false);
$result = mssql_execute($stmt);
while ($row = sqlsrv_fetch_array($result, SQLSRV_FETCH_ASSOC))
{
print "<td align='center'>".$row['size']."</td>";
print "<td align='center'>".$row['used_per']."</td>";
print "<td align='center'>".$row['used']."</td>";
print "<td align='center'>".$row['available']."</td>";
}
}

?>

В итоге выдется ошибка: [03-Feb-2016 11:08:47 Europe/Moscow] PHP Fatal error: Call to undefined function mssql_init() in C:\inetpub\wwwroot\file.php on line 107
Порылся в инете. Пишут мол не подключен модуль sql, но та же sqlsrv_query() прекрасно работает. Для mssql качал специальные библиотеки php_pdo_sqlsrv_56_nts.dll и php_sqlsrv_56_nts.dll. Они в PHP.ini подключены.
Может mssql_init() и mssql_bind() в других библиотеках находятся? (на mssql_bind() еще не ругается, не доходит на нее я так понимаю, но в инете их в паре всегда пишут при этой ошибке).
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Kusss  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1512
Пользователь №: 28976
На форуме: 5 лет, 9 месяцев, 24 дня
Карма: 86




Dimych071190
я с этим не работал `mssql_` и `sqlsrv_`

Но судя по документации http://php.net/manual/en/function.mssql-init.php , нужно установить соединение
$link = mssql_connect(....);
а у тебя
$conn = sqlsrv_connect(....);

Поэтому он и пишет undefined
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Dimych071190  
 ۩  [x] Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Новичок
*

Профиль
Группа: Пользователь
Сообщений: 12
Пользователь №: 42486
На форуме: 1 год, 3 месяца, 19 дней
Карма:




Переписал
<?php
$server = "myip,1433\MSSQLSERVER";
$link = mssql_connect($server);
if (!$link) {
die('Something went wrong while connecting to MSSQL');
}
mssql_select_db('mybase', $link);
$stmt = mssql_init("my_proc", $link);
$CDate = $_GET['SelDate'];
mssql_bind($stmt, "@Server", "fs01", SQLVARCHAR, false, false, 9);
mssql_bind($stmt, "@Vol", "vlXXX", SQLVARCHAR, false, false, 6);
mssql_bind($stmt, "@CDate", $CDate, SQLVARCHAR, false, false, 10);
mssql_bind($stmt, "@Size", $Size, SQLFLT4, true, false);
mssql_bind($stmt, "@Used_per", $Used_per, SQLFLT4, true, false);
mssql_bind($stmt, "@Used", $Used, SQLFLT4, true, false);
mssql_bind($stmt, "@Available", $Available, SQLFLT4, true, false);
$result = mssql_execute($stmt);
print "<td align='center'>".$size."</td>";
print "<td align='center'>".$used_per."</td>";
print "<td align='center'>".$used."</td>";
print "<td align='center'>".$available."</td>";
mssql_close($link);
?>

Теперь не узнает mssql_connect(). Пишет
PHP Fatal error: Call to undefined function mssql_connect() in C:\inetpub\wwwroot\myphp.php on line 108
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Игорь_Vasinsky  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



c начала 2017 года в Новосибирске.
******

Профиль
Журнал
Группа: ★ЛжеЭксперт★
Завсегдатай форума
Сообщений: 26363
Пользователь №: 21350
На форуме: 7 лет, 2 месяца, 9 дней
Карма: 736




а библиотека в php загружена для работы с mssql? (php_mssql.dll)
https://www.microsoft.com/en-us/download/de...s.aspx?id=20098


--------------------
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql (TSql, BI OLAP, MDX), Git, SVN, CodeIgnater, Yii 2, JiRA, Redmine, Bitbucket, Composer
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Dimych071190  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Новичок
*

Профиль
Группа: Пользователь
Сообщений: 12
Пользователь №: 42486
На форуме: 1 год, 3 месяца, 19 дней
Карма:




Да. На стартовой странице для теста поставил
<?php header("Content-type: text/html; charset=utf-8"); 
phpinfo();
?>

sqlsrv присутствует. Точ в точ как здесь.
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Dimych071190  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Новичок
*

Профиль
Группа: Пользователь
Сообщений: 12
Пользователь №: 42486
На форуме: 1 год, 3 месяца, 19 дней
Карма:




Начинаю сомневаться. У меня php_sqlsrv а надо я так понимаю php_mssql. Если это библиотека php_mssql.dll, то ее нет. Нашел ее в инете, но там непонятно для какой версии php она. Попробовал скачать, кинул ее в директорию с экстеншнами, прописал в php.ini. Никакой разницы. Не видит mssql_connect().
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Dimych071190  
 ۩  [x] Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Новичок
*

Профиль
Группа: Пользователь
Сообщений: 12
Пользователь №: 42486
На форуме: 1 год, 3 месяца, 19 дней
Карма:




Пытаюсь обойтись библиотекой sqlsrv. Она точно работает. Пишу:
$CDate = $_GET['SelDate'];
$server = "10.10.10.10,1433\MSSQLSERVER";
$connectionInfo = array( "Database"=>"mybase");
$conn = sqlsrv_connect($server, $connectionInfo);
$sql = "CALL my_Storedprocedure(?,?,?,?,?,?,?)";
$params = array(1=>"fs01",2=>"vl555",3=>$CDate,4=>$size,5=>$used_per,6=>$used,7=>$available);
$stmt = sqlsrv_query($conn, $sql, $params);
sqlsrv_execute($stmt);
print "<td align='center'>".$size."</td>";
print "<td align='center'>".$used_per."</td>";
print "<td align='center'>".$used."</td>";
print "<td align='center'>".$available."</td>";
sqlsrv_free_stmt($stmt);

Сразу ясно, что параметры задаю не правильно. Но нигде не могу найти примеров. Везде либо через PDO либо один параметр и тот входящий. А у меня 7 параметров, 3 входящих и 4 выходящих. Я так понял входящие помечать не надо, там по-умолчанию SQLSRV_PARAM_IN, а вот как и куда прописать SQLSRV_PARAM_OUT.
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
  Быстрый ответ
Информация о Госте
Введите Ваше имя
Кнопки кодов
Для вставки цитаты, выделите нужный текст и
НАЖМИТЕ СЮДА
Введите сообщение
Смайлики
:huh:  :o  ;) 
:P  :D  :lol: 
B)  :rolleyes:  <_< 
:)  :angry:  :( 
:unsure:  :blink:  :ph34r: 
     
Показать всё

Опции сообщения  Включить смайлики?
 Включить подпись?
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:

Опции темыСтраницы: (2) [1] 2  Ответ в темуСоздание новой темыСоздание опроса