:: Не фоксом единым
PHP+MySQL (Хранимая функция в запросе)
Зингер
Автор

Сообщений: 541
Откуда: Белгород
Дата регистрации: 02.12.2008
Перерыл много форумов и тем, так ответа и не нашел.
Apache2.2+PHP5.3+MySQL5.5 x64 на OpenServer5.2.2. Создаю запрос в классе с БД (реализация PDO):
<?
class select_resultat_class
{
public $array_nastr=array();
public $obj_podkl;
public $array_otdel=array();
public $proba_array=array();
function __construct(){
$obj=new connected_class();
$this->obj_podkl=$obj->mysql_pdo;
}
public function select_resultat_otdel_nastr(){ //Функция "вытягивает" настройки из БД
$command_string='SELECT IFNULL(Prizn2,0) AS prizn2,
IFNULL(Prizn3,20) AS prizn3,IFNULL(Prizn4,"prizn1") AS prizn4,
IFNULL(Prizn5,0) AS prizn5
FROM Nastr WHERE prizn1 IN (SELECT prizn1 FROM Polzovatel WHERE prizn8=1) LIMIT 1';
$stmt=$this->obj_podkl->prepare($command_string);
$stmt->execute();
$i=2;
while ($row=$stmt->fetch()){
for ($i=2;$i<6;$i++){
$this->array_nastr[$i]=$row['prizn'.$i];
}
}
}
public function select_resultat_otdel_data_method(){ //Функция, которая "вытягивает" результат
$command_string="SELECT Otdel.Prizn1 AS prizn1,OTDEL_KOROTKO.Prizn2 AS prizn2,OTDEL_POLN.Prizn2 AS prizn3,
IFNULL(CONCAT(IFNULL(FAM.Prizn2,' '),' ',IFNULL(IMY.Prizn2,' '),' ',IFNULL(OTCH.Prizn2,' ')),'НЕТ') AS fio,
CONCAT(day(Otdel.prizn5),' ',Month_to_text(Otdel.prizn5),' ',YEAR(Otdel.prizn5),' ',TIME(Otdel.prizn5)) AS prizn5, //Строка с Хранимой функцией Month_to_text()
Otdel.prizn6 AS prizn6,
Otdel.prizn7 AS prizn7,
IFNULL(Otdel.Prizn8,0) AS prizn8,
IFNULL(CASE Otdel.prizn8
WHEN 0 THEN 'НЕТ'
WHEN 1 THEN 'ДА'
END,'НЕТ') AS flag_prizn8 FROM OTDEL_KOROTKO
RIGHT OUTER JOIN Otdel ON OTDEL_KOROTKO.Prizn1 = Otdel.Prizn2
LEFT OUTER JOIN OTDEL_POLN ON OTDEL_POLN.Prizn1 = Otdel.Prizn3
CROSS JOIN FAM INNER JOIN Polzovatel ON FAM.Prizn1 = Polzovatel.Prizn2 AND Polzovatel.Prizn1 = Otdel.Prizn4
LEFT OUTER JOIN IMY ON IMY.Prizn1 = Polzovatel.Prizn3
LEFT OUTER JOIN OTCH ON OTCH.Prizn1 = Polzovatel.Prizn4 ";
$command_string=$command_string.(($this->array_nastr[2]==0)?"WHERE (Otdel.Prizn8=0 OR Otdel.Prizn8 IS NULL) ":" "); //в зависимости от настроек
$command_string=$command_string.("order by ".$this->array_nastr[4].(($this->array_nastr[5]==0)?" asc":" desc")); //в зависимости от настроек
echo $command_string.'<br>';
$stmt=$this->obj_podkl->prepare($command_string,array(PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT));
$stmt->execute();
while($row=$stmt->fetch()){
$this->array_otdel[]=array("prizn1"=>$row['prizn1'],"prizn2"=>$row['prizn2'],"prizn3"=>$row['prizn3'],"fio"=>$row['fio'],"prizn5"=>$row['prizn5'],
"prizn6"=>$row['prizn6'],"prizn7"=>$row['prizn7'],"prizn8"=>$row['prizn9'],"flag_prizn8"=>$row['flag_prizn8']);
echo $row['fio']; //Показывает в зависимости от того есть ли хранимка в запросе или нет.
}
}
}
?>

В функции класса select_resultat_otdel_data_method() в запросе объявлена хранимая функция БД Month_to_text(). На сервере запрос "отрабатывает на ура", через PHP возвращает пустой результат. Если, убрать функцию в запросе, то все проходит нормально. Причем в функции Month_to_text() пробовал различные варианты типов возвращаемых значений. Не работает ни хера! Уже 4 дня бьюсь. Может такого в реализации PHP+MySQL не предусмотрено?
Надеюсь нормально объяснил.
Помогите пож-та.
Ratings: 0 negative/0 positive
Re: PHP+MySQL (Хранимая функция в запросе)
Vedmak

Сообщений: 5949
Откуда: CiTY
Дата регистрации: 30.10.2003
Посмотри различия в правах пользователя которым ты "запускаешь" ХП. "На сервере руками" это одни права, а приложение в сессии может не иметь прав "EXECUTE".

в том же ключе, если коннект к базе ограничен правами, то и вызов функций может не работать и триггеры вести себя "странно".

В тоже время логгируй все ошибки в файл... много полезного несет такой опыт!


------------------
Говорить стоит лишь для тех, кто слушает.




Исправлено 3 раз(а). Последнее : Vedmak, 28.10.17 01:35
Ratings: 0 negative/1 positive
Re: PHP+MySQL (Хранимая функция в запросе)
Зингер
Автор

Сообщений: 541
Откуда: Белгород
Дата регистрации: 02.12.2008
Vedmak
Посмотри различия в правах пользователя которым ты "запускаешь" ХП. "На сервере руками" это одни права, а приложение в сессии может не иметь прав "EXECUTE".
в том же ключе, если коннект к базе ограничен правами, то и вызов функций может не работать и триггеры вести себя "странно".

Спасибо, дружище! Это абсолютно то что было нужно. У юзера, который коннектился не было прав на выполнение хранимок. Как только проставил права, все пошло как по маслу. Как ты думаешь, нужно ли хранить пользователя "root" или так же как в SQL Server я удалял "sa"?
Ratings: 0 negative/0 positive
Re: PHP+MySQL (Хранимая функция в запросе)
Vedmak

Сообщений: 5949
Откуда: CiTY
Дата регистрации: 30.10.2003
Зингер
Спасибо, дружище! Это абсолютно то что было нужно. У юзера, который коннектился не было прав на выполнение хранимок. Как только проставил права, все пошло как по маслу.

Это греет душу.

Зингер
Как ты думаешь, нужно ли хранить пользователя "root" или так же как в SQL Server я удалял "sa"?

Сам пользователь *root* принципиально не отличается от прочих логинов (по крайней мере я не встречал что его отличает), но первое, что я рекомендую, ограничить его права доступа к БД коннектом с localhost. Для начала. Затем следует оценить необходимость удаленного доступа к БД с разными правами. Например, если есть необходимость, создать пользователя с расширенными правами (меньшими, чем у root), но указать явно host с которого этот пользователь будет будет приниматься сервером. Вариантов много. Самый параноидальный вариант изначально запретить все и всем. Затем под каждый логин строго выдавать права на каждый клиентский хост. Лучше ли? не знаю. Зависит от ТЗ и "маний" заказчика.

P.S. Про логирование я не зря упомянул, анализ текстов возвращаемых в приложение сторонними библиотеками крайне полезен для анализа вариантов дальнейшего поведения. Я уверен, что и в твоей ситуации был намек на проблемы с правами.


------------------
Говорить стоит лишь для тех, кто слушает.




Исправлено 2 раз(а). Последнее : Vedmak, 30.10.17 21:31
Ratings: 0 negative/0 positive
Re: PHP+MySQL (Хранимая функция в запросе)
Vedmak

Сообщений: 5949
Откуда: CiTY
Дата регистрации: 30.10.2003
По поводу примера твоего кода приведу свой кусок.

$query = "select c.*,ifnull(p.name,'') `person`"
. " from cards c"
. " left join persons p on c.person_id=p.id"
. $filter
. " ORDER BY c." . $_REQUEST["jtSorting"]
. " LIMIT " .$_REQUEST["jtStartIndex"].",".$_REQUEST["jtPageSize"] .";";
$list = array();
$result = false;
if ( $goSql->query( $query, $result ) ) {
$goSql->fetch( $result, $list );
}

В строке построения текста запроса я стараюсь соблюдать "вложенность". Это не эталон конечно и в большей степени скорее привычка, чем правило, но пустые строки (пробелы и отступы TAB) в коде не вредят.

joxi.ru

joxi.ru

joxi.ru

Мне кажется, что мой код читать легче, чем твой.

Повторюсь, это мое личное мнение.


------------------
Говорить стоит лишь для тех, кто слушает.




Исправлено 3 раз(а). Последнее : Vedmak, 30.10.17 21:49
Ratings: 0 negative/1 positive
Re: PHP+MySQL (Хранимая функция в запросе)
Vedmak

Сообщений: 5949
Откуда: CiTY
Дата регистрации: 30.10.2003
$command_string=$command_string.(($this->array_nastr[2]==0)?"WHERE (Otdel.Prizn8=0 OR Otdel.Prizn8 IS NULL) ":" ");

Думаю мой вариант полегче для чтения. Скобок поменьше на метр кода Но пробелов в разы больше

$command_string .= ( $this->array_nastr[2] == 0
? "WHERE Otdel.Prizn8 = 0 OR Otdel.Prizn8 IS NULL "
: " ");


------------------
Говорить стоит лишь для тех, кто слушает.




Исправлено 2 раз(а). Последнее : Vedmak, 30.10.17 21:46
Ratings: 0 negative/1 positive
Re: PHP+MySQL (Хранимая функция в запросе)
Vedmak

Сообщений: 5949
Откуда: CiTY
Дата регистрации: 30.10.2003
По поводу сборки строки с датой

CONCAT(day(Otdel.prizn5),' ',Month_to_text(Otdel.prizn5),' ',YEAR(Otdel.prizn5),' ',TIME(Otdel.prizn5)) AS prizn5, //Строка с Хранимой функцией Month_to_text()

Думаю имеет смысл рассмотреть возможность получения DATЕTIME из базы в формате UNIX_TIMESTAMP, т.е. кол-во секунд начиная с 01/01/1970. PHP умеет это перевести в строку функцией DATE(). Правда я пока воюю с региональными настройками конечного результата. Все на EN получается, а мне нужны RU и LV.

Как видишь, я тоже учусь.


------------------
Говорить стоит лишь для тех, кто слушает.




Исправлено 2 раз(а). Последнее : Vedmak, 30.10.17 22:01
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 13 (Гостей: 13)

© 2000-2024 Fox Club 
Яндекс.Метрика