2015-03-16 3 views
1

У меня есть хранимая процедура в MySQL. Звоню процедуру в PHP, какphp Num rows хранимой процедуры MySQL

$qry = $mysqli->prepare("CALL seen_table()"); 

я пытался получить результирующие строки по

$row = $qry->num-rows; 

но его результате 0 даже есть результирующая set.Then я попытался также поставить выходной параметр в моем процедура, при которой в внутри моего прок есть ...

SELECT COUNT(*) INTO cnt FROM TBL 

... то это мои коды

$qry = $mysqli->prepare("CALL seen_table(@cnt)"); 
$qry1 = $mysqli->query("SELECT @cnt"); 
$row = $qry1->num_rows; 

то теперь его всегда результаты 1 даже нет счета. когда я пытаюсь выполнить CALL и SELECT @cnt в Mysql. если нет счета. результат будет

|@cnt| 
|(null)| 

это действительно действительно считается как один? пожалуйста, помогите. большое спасибо.

EDIT: Добавлена ​​seen_table коды Процедура

DELIMITER $$ 

USE `xiroosco_mundoxiro`$$ 

DROP PROCEDURE IF EXISTS `seen_table`$$ 

CREATE DEFINER=`xiroosco`@`103.16.170.%` PROCEDURE `seen_table`(bound 
VARCHAR(255),IN cmntId INT,IN cmntViewID VARCHAR(255),OUT viewCNT INT) 
BEGIN 

DECLARE seen_ID INT DEFAULT 0; 
DECLARE seen_notifica_ID INT DEFAULT 0; 
DECLARE seen_viewers TEXT; 
DECLARE occurance INT DEFAULT 0; 
DECLARE i INT DEFAULT 0; 
DECLARE splitted_value INT; 
DECLARE done INT DEFAULT 0; 
DECLARE cur1 CURSOR FOR SELECT seen.seen_ID, seen.seen_notifica_ID, 
seen.seen_viewers 
       FROM seen 
       WHERE seen.seen_notifica_ID = cmntId; 
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; 

DROP TEMPORARY TABLE IF EXISTS seen2; 
CREATE TEMPORARY TABLE seen2( 
`seen_ID` INT NOT NULL, 
`seen_notifica_ID` INT NOT NULL, 
`seen_viewers` VARCHAR(255) NOT NULL 
) ENGINE=MEMORY; 

OPEN cur1; 
read_loop: LOOP 
    FETCH cur1 INTO seen_ID,seen_notifica_ID, seen_viewers; 
    IF done THEN 
    LEAVE read_loop; 
    END IF; 

    SET occurance = (SELECT LENGTH(seen_viewers) - 
LENGTH(REPLACE(seen_viewers, bound, '')) +1); 
    SET i=1; 
    WHILE i <= occurance DO 
    SET splitted_value = (SELECT 
REPLACE(SUBSTRING(SUBSTRING_INDEX(seen_viewers, bound, i), 
    LENGTH(SUBSTRING_INDEX(seen_viewers, bound, i - 1)) + 1), ',', '')); 

    INSERT INTO seen2 VALUES (seen_ID,seen_notifica_ID, splitted_value); 
    SET i = i + 1; 

    END WHILE; 
END LOOP; 
IF cmntViewID = "*" THEN 
    SELECT * FROM seen2 GROUP BY seen2.seen_viewers; 
    SELECT COUNT(*) INTO viewCNT FROM seen2; 
ELSE 
    SELECT * FROM seen2 WHERE seen2.seen_viewers = cmntViewID GROUP BY 
seen2.seen_viewers; 
    SELECT seen_ID INTO viewCNT FROM seen2 WHERE seen2.seen_viewers = 
cmntViewID GROUP BY seen2.seen_viewers; 
END IF; 
CLOSE cur1; 
END$$ 

DELIMITER ; 

это, как я называю моя процедура пример

CALL seen_table (',',2995,'356',@count); 
+0

В этом случае да. Вы пытались использовать вашу процедуру в качестве запроса в php? Вы также, вероятно, не должны использовать подготовку, просто запрос с хранимой процедурой. – ElefantPhace

+0

привет, если я использую запрос (вызов), он не работает. Я не знаю почему. если он готов, он будет работать. он будет работать с использованием запроса, если его обработать не в ООП –

+0

Вместо того, чтобы делать то, что вы делаете, присваиваете счету что-то ('select @cnt as cnt'), извлекайте результаты, а затем echo' $ result-> cnt' , Вы все еще можете получить 1. Вы уверены, что ваша процедура правильная? Вы запускаете его отдельно? – ElefantPhace

ответ

0

NULL считается как один, но, насколько я могу видеть, что это противоречит стандарту ANSI : Если результатов нет, также не должно быть возвращено NULL.

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

Я не знаю, какой выбрать вы хотите, чтобы вернуть счет, так что просто дать вам пример:

{your procedure before this part} 
IF cmntViewID = "*" THEN 
    SELECT SQL_CALC_FOUND_ROWS * FROM seen2 GROUP BY seen2.seen_viewers; 
    SELECT COUNT(*) INTO viewCNT FROM seen2; 
ELSE 
    SELECT * FROM seen2 WHERE seen2.seen_viewers = cmntViewID GROUP BY 
seen2.seen_viewers; 
    SELECT seen_ID INTO viewCNT FROM seen2 WHERE seen2.seen_viewers = 
cmntViewID GROUP BY seen2.seen_viewers; 
END IF; 
{your procedure after this part} 

Затем выполните:

CALL seen_table(); 
SELECT FOUND_ROWS(); 

Это возвращает количество строк в "SELECT SQL_CALC_FOUND_ROWS * FROM seen2 GROUP BY seen2.seen_viewers;" запрос.

+0

(null)! = null, в этом случае. «(null)» является результатом его запроса, который является одним объектом, который является нулевым – ElefantPhace

+0

. Посмотрите на этот учебник http://www.mysqltutorial.org/mysql-stored-procedures-return-multiple-values/. Также, задавая вопрос о хранимой процедуре, покажите нам код внутри этой хранимой процедуры. –

+0

мой код для моей процедуры слишком длинный. могу ли я разместить его здесь? –

Смежные вопросы