[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: 2 хранимые процедуры из MySql?
wentl
Приветствую.
Подскажите, кто знает. Хочу разобраться с использование хранимых процедур из php
Проблема в следующем. При получении данных из одной процедуры-запроса
всё проходит нормально. Если получать по очереди из двух, на второй возникает ошибка. Понимаю, что видимо делаю что-то не так, но вот что?

test3 test3
test3 test3
test3 test3
123

Fatal error: Call to a member function fetch_array() on a non-object in Z:\home\localhost\www\Intra\test.php on line 35




<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<
html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru" lang="ru">
<
head>
<
title>Тест процедуры</title>
<
meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />
</
head>
<
body>



<?php
$num1 = $_POST["num1"];

if (isset($num1))
{
$hostname = "localhost";
$userdb = "root";
$passworddb = "";
$db = "Intra";
$mysqli = new mysqli($hostname, $userdb, $passworddb, $db);
//$result = $mysqli->query("call add_info('test3','test3')");
$result1 = $mysqli->query("call Test2()");

while($row1=$result1->fetch_array(MYSQLI_ASSOC)){
echo $row1['name'] ." ". $row1['info']."<br>";
};

echo "123<br>";

$result2 = $mysqli->query("call Test($num1)");

//$row2=$result2->fetch_array(MYSQLI_ASSOC);
while($row2=$result2->fetch_array(MYSQLI_ASSOC)){
echo $row2['name']."<br>";
};
/*$row = $result->fetch_array(MYSQLI_NUM);
printf ("%s (%s)\n", $row[0]); */


}
?>

<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">

Число 1:<br />
<
input type="text" name="num1" /><br /><br />

<
input type="submit" value="Считать!" />
<
br>
<? echo $operator?>

</form>

</
body>
</
html>


-- --------------------------------------------------------------------------------
-- Routine DDL
-- Note: comments before and after the routine body will not be stored by the server
-- --------------------------------------------------------------------------------
DELIMITER $$

CREATE DEFINER=`root`@`localhost` PROCEDURE `Test`(t int)
BEGIN
declare t2 int;
set t2 = t+1;
select t2 as name;
END

-- --------------------------------------------------------------------------------
-- Routine DDL
-- Note: comments before and after the routine body will not be stored by the server
-- --------------------------------------------------------------------------------
DELIMITER $$

CREATE DEFINER=`root`@`localhost` PROCEDURE `Test2`()
BEGIN
Select * from info;
END


И ещё вопрос. Как обрабатывать (получать) в php параметр возвращаемый хранимкой?

Спасибо.



Спустя 39 минут, 59 секунд (16.03.2012 - 11:15) glock18 написал(а):
с хранимками дело имел уже очень давно. помню, что проблем в пыхе с ними не оберешься.

Насколько я помню, для получения скалярного значения его нужно через out параметр передавать (у тебя процедура test), все выходные параметры надо биндить, насколько я помню, перед выполнением запроса

Спустя 1 час, 27 минут, 33 секунды (16.03.2012 - 12:42) wentl написал(а):
Цитата (glock18 @ 16.03.2012 - 08:15)
с хранимками дело имел уже очень давно. помню, что проблем в пыхе с ними не оберешься.

Насколько я помню, для получения скалярного значения его нужно через out параметр передавать (у тебя процедура test), все выходные параметры надо биндить, насколько я помню, перед выполнением запроса

через out - занчения только возвращаются
что значит биндить?

если вызывать и обрабатывать только Test - она отрабатывает и возвращает как select, вот когда вместе они или допустим одну и ту же попробовать 2 раза - ругается в
$row1=$result1->fetch_array(MYSQLI_ASSOC)

Спустя 21 минута, 33 секунды (16.03.2012 - 13:04) glock18 написал(а):
Цитата
через out - занчения только возвращаются
что значит биндить?



$rs = $mysqli->query( ‘CALL Test(1, @param));
$rs = $mysqli->query( ‘SELECT @param’ );

передавать параметры тоже надо ;) как переменные в функцию по ссылке
ну, не биндить значит, запамятовал - биндятся в пдо, а в mysqli костыльно их выбирать надо после вызова

Цитата
если вызывать и обрабатывать только Test - она отрабатывает и возвращает как select, вот когда вместе они или допустим одну и ту же попробовать 2 раза - ругается в

да, помню такое, не помню правда уже как править это. В старенькой mysql_lib нужно было при подключении флаг ставить.

для начала попробуй освобождать результат после вызова первой процедуры


$result1->free();


и выведи ошибку во втором запросе


if (!$mysqli->query("SET a=1")) {
printf("Errormessage: %s\n", $mysqli->error);
}

Спустя 29 минут, 42 секунды (16.03.2012 - 13:34) wentl написал(а):
[php]$rs = $mysqli->query( ‘CALL Test(1, @param)’ );
$rs = $mysqli->query( ‘SELECT @param’ );[/php]

Ответ на второй вопрос получен. Спасибо
Цитата
для начала попробуй освобождать результат после вызова первой процедуры
$result1->free();


не помогло
Цитата
и выведи ошибку во втором запросе

Errormessage: Commands out of sync; you can't run this command now 

кстати после процедуры и обычные запросы не желают дальше работать в этом случае

Спустя 3 минуты, 22 секунды (16.03.2012 - 13:37) glock18 написал(а):
Цитата

When calling multiple stored procedures, you can run into the following error: "Commands out of sync; you can't run this command now".
This can happen even when using the close() function on the result object between calls.
To fix the problem, remember to call the next_result() function on the mysqli object after each stored procedure call


пример

// 1st Query
$result = $db->query("call getUsers()");
if($result){
// Cycle through results
while ($row = $result->fetch_object()){
$user_arr[] = $row;
}
// Free result set
$result->close();
$db->next_result();
}

Спустя 24 минуты, 47 секунд (16.03.2012 - 14:02) wentl написал(а):
Всё заработало. Спасибо, дружище! biggrin.gif
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.