我有一个存储过程,我试图从我的 php.ini 调用。这是存储过程:
BEGIN
DECLARE done INT DEFAULT FALSE;
declare phone_temp VARCHAR(20) default '';
declare phone_cur cursor for SELECT DISTINCT sentNum FROM Queue;
declare continue handler for not found set done = true;
#create temp table
create temporary table if not exists temp_return AS SELECT * FROM Queue LIMIT 0;
#empty if exists
delete from temp_return;
open phone_cur;
phone_loop: LOOP
fetch phone_cur into phone_temp;
if done then
leave phone_loop;
end if;
insert into temp_return SELECT * FROM Queue WHERE num2=phone_temp LIMIT 2;
insert into temp_return SELECT * FROM Queue WHERE num1=phone_temp LIMIT 1;
end loop phone_loop;
close phone_cur;
select * from temp_return;
drop table if exists temp_return;
END
直接在mysql workbench中,调用就可以了。在 php 中,它不起作用。这是我的php:
function grabFromSmsQueue(){
global $myStmt, $conn;
if(isset($myStmt)){
$myStmt -> execute();
}
else{
$query = "CALL myStoredProc();";
$myStmt = $conn->stmt_init();
$myStmt -> prepare($query);
$myStmt -> execute();
}
$result = $myStmt -> get_result();
//print_r ($result);
$info = [];
if(isset($result)){
while($data = $result->fetch_assoc()){
$info[] = $data;
}
}
return $info;
}
像这样连接,我收到以下错误
The localhost page isn’t working
localhost didn’t send any data.
ERR_EMPTY_RESPONSE
$data = $result->fetch_assoc()
我将我print_r
的问题追溯到mysqli_result Object ( [current_field] => 0 [field_count] => 9 [lengths] => [num_rows] => 0 [type] => 1 )
. 我得出的结论是它不起作用,因为[num_rows] => 0
.
现在,回到我的存储过程,我删除了所有提到的游标并将其替换为硬编码值,它在工作台和 php 中都有效。我已经验证了通过 php 连接的用户有权限,连接是打开的,并且相同的代码可以执行其他存储过程(那些不包括游标的)。这是否意味着我不能在 php 调用的存储过程中使用游标?有没有光标的替代品?我是否在我的 php 语法中遗漏了一些处理游标的内容?