Я назвал хранимую процедуру 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 как массив
Или даже просто выполните "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, " "; } $result->close(); if( $conn->more_results() ) echo "<br/>"; } } while( $conn->next_result() ); } $conn->close();