Mysql Двойной результат при вызове хранимой процедуры

Фанат

oncle terrible
Команда форума
При вызове хранимой процедуры кроме результата возвращается еще какая-то отрыжка -
PHP:
mysql> call bla('b');
+----------+----------+------+------+
| username | password | file | num  |
+----------+----------+------+------+
| b        | NULL     |      | NULL |
+----------+----------+------+------+
1 row in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)
что это за кверь такой, второй по счету?

в mysqli оно выглядит, как неловимый Джо:
more_results returns TRUE
next_result returns TRUE
store_result ... returns FALSE!

но при этом не дает исполнять следующие запросы, верещит, что коммандс аут оф синк.

И что с этим делать? тупо засторить и забыть?
Там бывает что-нибудь полезное?
 

Фанат

oncle terrible
Команда форума
В общем, родил такой овнокодик
PHP:
		$res   = mysqli_query($this->conn, $query);
		if (mysqli_more_results($this->conn))
		{
			$this->extra_results = array();
    	    while(mysqli_more_results($this->conn))
    	    {
				mysqli_next_result($this->conn);
				$_res = mysqli_store_result($this->conn);
				if ($_res)
				{
					$this->extra_results[] = $_res;
				}
			}
	      
 		}
 		return $res;
не уверен в его осмысленности, но уверен в работоспособности на моей сборке
 

fixxxer

К.О.
Партнер клуба
http://dev.mysql.com/doc/refman/5.6/en/c-api-multiple-queries.html

Multiple-result processing also is required if you execute CALL statements for stored procedures. Results from a stored procedure have these characteristics:

Statements within the procedure may produce result sets (for example, if it executes SELECT statements). These result sets are returned in the order that they are produced as the procedure executes.

In general, the caller cannot know how many result sets a procedure will return. Procedure execution may depend on loops or conditional statements that cause the execution path to differ from one call to the next. Therefore, you must be prepared to retrieve multiple results.

The final result from the procedure is a status result that includes no result set. The status indicates whether the procedure succeeded or an error occurred.
 

Фанат

oncle terrible
Команда форума
Ага, спасибо.

Но всё равно непонятно, нафига тогда mysqli_more_results - по идее, она и должна на этой штуке рубиться.
Ну ладно, короче, работает - и ладно.

Ты лучше скажи - вот этот говнокод с возвратом первого результата обычным порядком, а остальных - в отдельный массивчик - это "filthy or filthy, but wearable"?
 

fixxxer

К.О.
Партнер клуба
да фиг знает, я бы для такого, наверное, отдельный вызов делал, и возвращал бы массив

а вообще я не вижу причин пользоваться хранимыми процедурами в mysql - они там на коленке для галочки сделаны при предпродажной подготовке sun-у, чтобы ценник набить. пользоваться этим малореально
 

Фанат

oncle terrible
Команда форума
а вообще я не вижу причин пользоваться хранимыми процедурами в mysql - они там на коленке для галочки сделаны при предпродажной подготовке sun-у, чтобы ценник набить. пользоваться этим малореально
:)))

Мда. С одной стороны, дергать more_results после каждого запроса - если даже и не слишком затратно, то неоптимальненько.
С другой - идеология класса с её однострочными вызовами, мать её...

Надо было не економить на спичках, и вместо
PHP:
$data = getAll($query, $param1, $param2);
делать
PHP:
$data = getAll($query, [$param1, $param2], $flags);
Тем более, что именованные, мать их, плейсгольдеры тоже массива требують...
 

флоппик

promotor fidei
Команда форума
Партнер клуба
А ведь Фаната предупреждали, что этим все закончится ;)
 

флоппик

promotor fidei
Команда форума
Партнер клуба
Да я так, о усложении твоей библиотеки. Изначально было, что «я тут однострочную процедурщину сделаю, этого достаточно для каждого, а все эти ваши фичи НЕ_НУЖНЫ» ;) No offence.
 

Фанат

oncle terrible
Команда форума
Да я так, о усложении твоей библиотеки. Изначально было, что «я тут однострочную процедурщину сделаю, этого достаточно для каждого, а все эти ваши фичи НЕ_НУЖНЫ» ;) No offence.
Так дело-то не в однострочности, а в формате вызова параметров. А однострочность по-любому нужна. Вот сделаю скоро статик вариант - совсем лафа будет.
Про "достаточно каждому" я нигде не говорил.
То, что люди, которые пользуются классом, хотят его же использовать и для 1% задач, для которых он не предназначен - это другое дело. Будем пилить.

Вообще, тупой флейм конечно тоже тонизирует, но конкретные замечания/примеры всяко полезнее.
Беда, собственно, всех этих "говорений" как раз в том, что говорить все горазды, а показать на примере мало кто способен.
При этом я слыхал достаточно разговоров, чтобы принимать их на веру.
 
Сверху