PHP7.1调用mysqli_stmt_get_result()报未定义函数错误如何解决
错误根因
Call to undefined function mysqli_stmt_get_result() 报错是因为你的PHP 7.1环境没有启用*mysqlnd(MySQL Native Driver)*扩展,mysqli_stmt_get_result() 函数必须依赖这个扩展才能运行,如果你使用的是旧版libmysqlclient驱动、或者服务器默认没开这个扩展就会触发该错误。
另外你的代码本身存在逻辑冗余:同时调用了mysqli_query普通查询和mysqli_stmt预处理,后面遍历结果用的是普通查询返回的$res,预处理逻辑完全没有实际作用,也可以直接优化。
可用解决方案
方案1:启用mysqlnd扩展(优先)
- 自主管理的服务器:在PHP管理面板的扩展列表中找到
mysqlnd、mysqli(选择基于mysqlnd编译的版本),勾选启用后重启PHP服务即可;Windows环境则修改php.ini,删除extension=php_mysqli.dll前的注释,重启服务生效。 - 虚拟主机环境:联系主机服务商协助开启mysqlnd扩展支持。
方案2:修改代码绕过扩展依赖(不需要改服务器配置)
简化写法(删除无用的预处理逻辑)
<?php $sqlprodutos = "SELECT * FROM produtos WHERE categoria = 'Carrinhos de Cliente' ORDER BY ordem ASC"; $res = mysqli_query($con, $sqlprodutos); if (!$res) { echo "Erro. Por favor, tente novamente mais tarde."; } else { if(mysqli_num_rows($res) == 0){ ?> <div class="col-12 mb-3"> <h3 class="text-center">Ops! Nenhum produto foi encontrado.</h3> <br> </div> </div> <?php } else{ while($scprodutos = mysqli_fetch_array($res)){ $id_produto = $scprodutos['id']; $nome_produto = utf8_encode($scprodutos['nome']); $tipo_produto = utf8_encode($scprodutos['tipo']); $imagem_produto = $scprodutos['imagem']; $link_produto = preg_replace('/[ -]+/' , '-' , $nome_produto); ?> <div class="col-6 col-md-3 mb-3"> <a href="produto.php?p=<?php echo $link_produto; ?>&id=<?php echo $id_produto; ?>" class="text-decoration-none"> <div class="card mb-5 h-100 shadow-sc"> <img src="assets/img/produtos/<?php echo $imagem_produto; ?>" class="card-img-top my-3" alt="<?php echo $nome_produto; ?> - <?php echo $tipo_produto; ?>"> <div class="card-body product"> <h5 class="card-title text-uppercase text-center"><?php echo $nome_produto; ?></h5> <div class="bottom"> <h6 class="card-subtitle mb-2 text-muted text-uppercase text-center"><?php echo $tipo_produto; ?></h6> <div class="d-grid gap-2 mb-4"> <a href="produto.php?p=<?php echo $link_produto; ?>&id=<?php echo $id_produto; ?>" class="btn btn-dark">Ver detalhes</a> </div> </div> </div> </div> </a> </div> <?php } } } ?>
预处理写法(需要防SQL注入时使用,不依赖mysqlnd)
用mysqli_stmt_bind_result()绑定变量的方式替代mysqli_stmt_get_result()即可:
<?php $sqlprodutos = "SELECT id, nome, tipo, imagem FROM produtos WHERE categoria = 'Carrinhos de Cliente' ORDER BY ordem ASC"; $stmtprodutos = mysqli_stmt_init($con); if (!mysqli_stmt_prepare($stmtprodutos, $sqlprodutos)) { echo "Erro. Por favor, tente novamente mais tarde."; } else { mysqli_stmt_execute($stmtprodutos); // 绑定结果变量,顺序和SELECT查询的字段顺序保持一致 mysqli_stmt_bind_result($stmtprodutos, $id_produto, $nome_produto, $tipo_produto, $imagem_produto); if (!mysqli_stmt_fetch($stmtprodutos)) { ?> <div class="col-12 mb-3"> <h3 class="text-center">Ops! Nenhum produto foi encontrado.</h3> <br> </div> </div> <?php } else { // 已经提前fetch过一次判断结果,先输出第一条再循环剩余数据 do { $nome_produto = utf8_encode($nome_produto); $tipo_produto = utf8_encode($tipo_produto); $link_produto = preg_replace('/[ -]+/' , '-' , $nome_produto); ?> <div class="col-6 col-md-3 mb-3"> <a href="produto.php?p=<?php echo $link_produto; ?>&id=<?php echo $id_produto; ?>" class="text-decoration-none"> <div class="card mb-5 h-100 shadow-sc"> <img src="assets/img/produtos/<?php echo $imagem_produto; ?>" class="card-img-top my-3" alt="<?php echo $nome_produto; ?> - <?php echo $tipo_produto; ?>"> <div class="card-body product"> <h5 class="card-title text-uppercase text-center"><?php echo $nome_produto; ?></h5> <div class="bottom"> <h6 class="card-subtitle mb-2 text-muted text-uppercase text-center"><?php echo $tipo_produto; ?></h6> <div class="d-grid gap-2 mb-4"> <a href="produto.php?p=<?php echo $link_produto; ?>&id=<?php echo $id_produto; ?>" class="btn btn-dark">Ver detalhes</a> </div> </div> </div> </div> </a> </div> <?php } while(mysqli_stmt_fetch($stmtprodutos)); } mysqli_stmt_close($stmtprodutos); } ?>
内容的提问来源于stack exchange,提问作者poteitow
相关产品推荐
相关产品推荐

