SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#26 30.10.2008 16:34:27

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: PHP+MySql+mysqli+хранимые процедуры. Странный фатал ерор. %)

PDO это еще и абстракция от типа БД

Неактивен

 

#27 30.10.2008 16:43:09

LazY
_cмельчак
MySQL Authorized Developer and DBA
Зарегистрирован: 02.04.2007
Сообщений: 849

Re: PHP+MySql+mysqli+хранимые процедуры. Странный фатал ерор. %)

В MySQLi к примеру есть multiquery.
В ХП делаешь 10 SELECT'ов - потом из результата последовательно забираешь

А почему нельзя к той же ХП обратиться через mysql_query, а потом mysql_fetch_row/assoc()?

PDO просто удобнее, кодить в разы меньше.

А что такое PDO?

Неактивен

 

#28 30.10.2008 17:27:20

EugeneTM
Гуру
Зарегистрирован: 11.04.2008
Сообщений: 89

Re: PHP+MySql+mysqli+хранимые процедуры. Странный фатал ерор. %)

multiquery это именно и есть много запросов
не один который выдает много строк, а несколько разных. И выдавать каждый из них может что угодно. Один набор строк, второй одно значение и т.д.
это возможность в одной процедуре собрать их в кучу.


PDO
http://www.php.net/manual/ru/book.pdo.php

Неактивен

 

#29 30.10.2008 23:16:06

MaxRed
Участник
Зарегистрирован: 27.10.2008
Сообщений: 11

Re: PHP+MySql+mysqli+хранимые процедуры. Странный фатал ерор. %)

Ух, помогли нереально просто. Спасибо.
Еще бы ответ на совсем ламерские пару вопросов.
Все же можно или нет сделать подготовку запросов через mysql_query
И как получить то что вернула процедура в случае
$res=mysql_query('CALL test_proc()')
Сама процедура это просто SELECT 1
Когда делаю через менеджер базы то получаю 1. Когда делаю через mysqli то получаю 1, но когда через mysql_query() и дальше какой нибудь mysql_fetch_... , то данные не могу получить. (PROCEDURE 2.test_proc can't return a result set in the given context)
___________________________
Решение было найдено, может и кривое, но все же
в ХП сделал так
BEGIN
SET @a=(SELECT 1);
END
А в скрипте
mysql_query('CALL test_proc()');
$res=mysql_query('SELECT @a');
дальше с результатом работаю как обычно.
Если можно иначе, подскажите.
З.Ы.
Как же все таки я был слеп... когда перешел на mysqli думая что mysql не может делать то что мне нужно.
Знание - сила! Спасибо вам!

Отредактированно MaxRed (31.10.2008 02:45:11)

Неактивен

 

#30 31.10.2008 05:36:23

EugeneTM
Гуру
Зарегистрирован: 11.04.2008
Сообщений: 89

Re: PHP+MySql+mysqli+хранимые процедуры. Странный фатал ерор. %)

Про mysql проскакивало, что не умеет корректно работать с ХП. Похоже на это ты и попал.

Если с MySQLi работет нормально - так и продолжай с ней работать.
Только поиском посмотри в этой конфе Out of Sync - обсуждалось. Есть такие грабли в mysqli, в принципе если знать проблем никаких. Если не знать - можно долго проковыряться.

Неактивен

 

#31 01.11.2008 11:18:28

LazY
_cмельчак
MySQL Authorized Developer and DBA
Зарегистрирован: 02.04.2007
Сообщений: 849

Re: PHP+MySql+mysqli+хранимые процедуры. Странный фатал ерор. %)

Да, действительно обычные mysql-функции в PHP не умеют извлекать данные из хранимых процедур. См. например слайд № 32 в презентации http://www.slideshare.net/dpc/dpc2007-m … and-bouman

В то же время, создавать процедуры или использовать процедуры, не возвращающие значения (например, вставлять данные) с помощью обычной mysql_query() можно.

Неактивен

 

#32 08.10.2009 11:41:45

vlad275
Завсегдатай
Зарегистрирован: 08.10.2009
Сообщений: 25

Re: PHP+MySql+mysqli+хранимые процедуры. Странный фатал ерор. %)

Скажите пожалуйста, могу я получить данные следующим способом?

Код:

DELIMITER $$

DROP PROCEDURE IF EXISTS `p4` $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `p4`(OUT intID, OUT varcharStatus, OUT varcharName)
BEGIN

DECLARE intID INT;
DECLARE varcharStatus, varcharName VARCHAR;
SELECT * INTO intID, varcharStatus, varcharName FROM `tCandidates`;
RETURN intID, varcharStatus, varcharName;
END

DELIMITER ;

Код:

mysql_query('CALL p4()');
$res=mysql_query('SELECT @a');

http://sqlinfo.ru/forum/viewtopic.php?pid=10939#p10939
http://phpclub.ru/talk/showthread.php?s … did=116501

Отредактированно vlad275 (08.10.2009 12:46:56)

Неактивен

 

#33 08.10.2009 13:14:28

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: PHP+MySql+mysqli+хранимые процедуры. Странный фатал ерор. %)

Не вижу никаких проблем в этом, только CALL p4(@a,@b,@c);

Или внутри процедуры
SELECT @a = ...

Неактивен

 

#34 08.10.2009 13:52:45

vlad275
Завсегдатай
Зарегистрирован: 08.10.2009
Сообщений: 25

Re: PHP+MySql+mysqli+хранимые процедуры. Странный фатал ерор. %)

Не могу сохранить sp, так как MySQL Query Browser нашел ошибку. Но я не могу понять в чем ошибка.

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ' OUT varcharStatus, OUT varcharName)
BEGIN
  DECLARE intID INT;
  DECLARE var' at line 1

Неактивен

 

#35 08.10.2009 14:17:16

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: PHP+MySql+mysqli+хранимые процедуры. Странный фатал ерор. %)

У каждой переменной должен быть тип данных.

Неактивен

 

#36 08.10.2009 14:20:32

vlad275
Завсегдатай
Зарегистрирован: 08.10.2009
Сообщений: 25

Re: PHP+MySql+mysqli+хранимые процедуры. Странный фатал ерор. %)

Не могу найти ошибку. Так тоже не работает:

DELIMITER $$
DROP PROCEDURE IF EXISTS `variantdialog_99k_db1`.`p4` $$
CREATE PROCEDURE `variantdialog_99k_db1`.`p4` (OUT intID INT, OUT varcharStatus VARCHAR)
BEGIN
  #DECLARE intID INT;
#  DECLARE varcharStatus, varcharName VARCHAR;
  SELECT intID, varcharStatus INTO intID,v archarStatus FROM t;
END $$
DELIMITER ;

Ошибка:

Script line: 4    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ')
BEGIN
  #DECLARE intID INT;
#  DECLARE varcharStatus, varcharName VARCHAR;
' at line 1

Отредактированно vlad275 (08.10.2009 14:22:06)

Неактивен

 

#37 08.10.2009 14:55:19

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: PHP+MySql+mysqli+хранимые процедуры. Странный фатал ерор. %)

VARCHAR - это не тип данных. Тип данных - VARCHAR(20), например.

Неактивен

 

#38 15.12.2009 12:04:02

smallhacker
Участник
Зарегистрирован: 10.09.2009
Сообщений: 9

Re: PHP+MySql+mysqli+хранимые процедуры. Странный фатал ерор. %)

Видимо надо закрывать коннект с базой... После выполнения скрипта... Он же ругается на большое количество подключений.

Неактивен

 

#39 20.04.2010 16:31:08

ArniXXX
Участник
Зарегистрирован: 20.04.2010
Сообщений: 4

Re: PHP+MySql+mysqli+хранимые процедуры. Странный фатал ерор. %)

Собственно искал ответ на вопрос как извлечь данные после вызова хранимой процедуры, и должен сказать что автор сбил меня с толку дней так на два ...


С этим кодом почти все нормально ...

$DB_HOST = 'localhost';
$DB_LOGIN ='root';
$DB_PASS = '555';
$DB_NAME = '2';
$mysqli = new mysqli($DB_HOST,$DB_LOGIN,$DB_PASS,$DB_NAME,3307);

for ($i=1; $i<100; $i++)
{
if($stmt = $mysqli->prepare("CALL test_proc()"))
  {
   //$stmt->bind_param('s',$h);
   $stmt->execute();
   $stmt->bind_result($add);
   $stmt->fetch();
   $stmt->close();
   echo $add;
  }
else
  {
   printf("Errormessage: %s\n", $mysqli->error);
   exit;
  }
}
$mysqli->close();

А не работает он потому что автор темы пытался подготовить несколько раз вызов одного и тогоже запроса, вот собственно откуда ошибка.

Вот как нужно было на самом деле ... Мне аж преснилась эта тема smile Всем кто штопорнулся на этом месте желаю всех благ и удачи! smile

if($stmt = $mysqli->prepare("CALL page_select()")){
    for ($i=1; $i<10; $i++)
    {
        //$stmt->bind_param('s',$h);
        $stmt->execute();
        $stmt->bind_result($add);
        $stmt->fetch();
        echo $add . '<br />';
    }
}else
  {
   printf("Errormessage: %s\n", $mysqli->error);
   exit;
  }

$stmt->close();

Неактивен

 

#40 27.04.2010 17:49:55

cooler
Завсегдатай
Зарегистрирован: 14.01.2010
Сообщений: 52

Re: PHP+MySql+mysqli+хранимые процедуры. Странный фатал ерор. %)

MaxRed При выполнении хранимой процедуры мускул возвращает количество резалт сетов в процедуре +1. Поэтому если в процедуре даже SELECT 1. Результат будет 2 резалт сета. Вам нужно в цикле перебрать все резалты (nextresult) после выполнения процедуры.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson