PHP – MySQL получает значение параметра out из хранимой процедуры

Я назвал хранимую процедуру MySQL из PHP с помощью mysqli . У этого есть один параметр.

 $rs = $mysqli->query("CALL addNewUser($name,$age,@id)"); 

Здесь @id – это параметр out. Затем я запускаю следующий запрос, чтобы получить значение параметра out:

 $rs2 = $mysqli->query("SELECT @id"); while($row = $rs->fetch_object()){ echo var_dump($row); } 

Результат var_dump выглядит следующим образом.

 object(stdClass)#5 (1) { ["@id"]=> string(6) "100026" } 

Итак, теперь я хочу получить значение @id , которого я не могу. Я пробовал $row[0]->{@id} но это дало следующую ошибку:

PHP Неустранимая ошибка: нельзя использовать объект типа stdClass как массив

Solutions Collecting From Web of "PHP – MySQL получает значение параметра out из хранимой процедуры"

Или даже просто выполните "SELECT @id AS id" тогда $row->id будет работать нормально. Я всегда переименовываю столбцы выбора, чтобы сохранить значение смысла при необходимости 🙂

BTW, вы можете просто объединить вызов и выбрать @ … (с разделителем инструкций), а RS будет возвращенным значением. К сожалению, это возвращает mutli-resultset, и вам нужно очистить полный набор, иначе последующие запросы будут остановлены. См. Следующие примеры:

 $db->multi_query( "CALL addNewUser($name,$age,@id);SELECT @id as id" ); $db->next_result(); // flush the null RS from the call $rs=$db->store_result(); // get the RS containing the id echo $rs->fetch_object()->id, "\n"; $rs->free(); 

Альтернативно добавьте select в addNewUser и верните RS вместо параметра param

 $rs = $db->query( "CALL addNewUser($name,$age)" ); echo $rs->fetch_object()->id, "\n"; $rs->close(); $db->next_result(); // flush the null RS from the call 

Первый возвращает набор из множества (NULL, RS) и второй набор (RS, NULL), поэтому вы можете использовать простой запрос (), который включает в себя первый fetch_object (), но вам все равно нужно очистить стек RS.

Здесь будет работать только $row->{"@id"} . Вы не можете использовать stdClass как массив ( $row[0]... ).

Кроме того, вы можете просто получить данные в виде массива с помощью mysqli::fetch_assoc() и получить доступ к данным с помощью $row['@id'] .

Еще одни правильные методы работы: Cheers !!

 $procedureName = 'VALIDATE_USER'; $procedure = "CALL $procedureName('$username','$pwd',@p_userid)"; $results1 = $dbconnection->query($procedure); $results2 = $dbconnection->query("SELECT @p_userid"); $num_rows = $results2->num_rows; if ($num_rows > 0) { while($row = $results2->fetch_object()) { echo $row->{"@p_userid"}; } } 

Вот рабочее решение:

 enter code $res = $conn->multi_query( "CALL PROCNAME(@x);SELECT @x" ); if( $res ) { $results = 0; do { if ($result = $conn->store_result()) { printf( "<b>Result #%u</b>:<br/>", ++$results ); while( $row = $result->fetch_row() ) { foreach( $row as $cell ) echo $cell, "&nbsp;"; } $result->close(); if( $conn->more_results() ) echo "<br/>"; } } while( $conn->next_result() ); } $conn->close();