我有以下函数,我希望它从 MySQL 数据库检索匹配的记录:
public function GetUserData($conn){
$username = $_SESSION['username'];
$stmt = $conn->prepare("CALL GetUserData(?)") or die("Query fail: " . mysqli_error($conn));
$stmt->bind_param("s",$username);
$stmt->execute() or die("Query fail: " . mysqli_error($conn));
while($row = $stmt->fetch()){
print_r($row);
}
exit;
}
GetUserData 是一个存储过程,如下所示:
CREATE DEFINER=`root`@`localhost` PROCEDURE `GetUserData`(IN `StoredUsername` VARCHAR(255))
LANGUAGE SQL
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ''
BEGIN
select firstname from users where username=StoredUsername;
END
我的问题是 print_r($row)
只打印“1”
如果匹配行是两行,则打印“11”
我似乎无法弄清楚我使用/做错了什么。
预先感谢您的帮助。
最佳答案
- mysqli_stmt_fetch() 的行为与您的想法不同
- 用户名应通过参数传递
- 虽然连接应该是一个类变量
获得结果后,您必须移至过程返回的其他结果,以便能够运行其他查询。
public function GetUserData($username){ $stmt = $this->conn->prepare("CALL GetUserData(?)"); $stmt->bind_param("s",$username); $stmt->execute(); $data = $stmt->get_result()->fetch_all(); $this->conn->next_result(); return $data; }
此外,不要手动检查每个数据库命令的结果,而是告诉 mysqli 自动抛出错误。在 mysqli_connect 之前添加此行,然后永远忘记所有这些丑陋的或死
:
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
关于PHP 和 Mysqli 以及存储过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32682913/