我正在研究业务监视器(提供一些指标的面板)。 为了获得该数据,我执行了sql请求。顺便说一句,我使用了一个存储过程。 我的代码是:
public function execErrorWarnLogs($id){
try {
$sql = "exec [BUSINESS_MONITOR_LOGS] @id='".$id."'";
$req = $this->_bdd->prepare($sql);
$req->execute();
$res = $req->fetchAll(PDO::FETCH_ASSOC);
$req->closeCursor();
return $res;
} catch (Exception $e) {
echo $e->getMessage();
}
}
当我试图通过$ id索引某些数据时,遇到了一些麻烦。我得到的数组具有空值...但是,如果我使用SQL客户端执行该存储过程,则会得到结果。
这里有人已经发生了吗?有人可以解释一下我为什么得到这个吗?
如果您需要更多信息,请告诉我。
谢谢。
答案 0 :(得分:0)
$ id是整数还是字符串?
尝试使用绑定参数。这是一个示例,说明如何在我的代码中完美运行:
public function execErrorWarnLogs($id){
try {
$sql = "exec BUSINESS_MONITOR_LOGS @id=:id";
$req = $this->_bdd->prepare($sql);
$req->execute([
'id' => $id
]);
$res = $req->fetchAll(PDO::FETCH_ASSOC);
$req->closeCursor();
return $res;
} catch (Exception $e) {
echo $e->getMessage();
}
}
出于安全原因,您也应该使用参数!
两个站点注释:
如果进行字符串插值,则无需准备语句。然后,您可以这样做:
$req = $this->_bdd->query($sql);
$res = $req->fetchAll(PDO::FETCH_ASSOC);
但是(为了安全起见)推荐方法是提供值作为绑定参数并准备查询。
据我所知,如果您使用Microsoft最新的pdo驱动程序用于MSSQL,则不需要$ req-> closeCursor()。是否需要closeCursor取决于您使用的驱动程序。
答案 1 :(得分:0)
我的存储过程:
创建过程BUSINESS_MONITOR @id VARCHAR(50)
AS
开始
SET NOCOUNT ON;
SELECT e.METRIC_NAME, e.METRIC_VALUE
FROM MONITOR_EVENTS e
WHERE e.MAIN_ID = @id
END
答案 2 :(得分:0)
还有两个可能的原因:
我会假设您遇到编码问题。如果$ id包含字符,超出了ASCII范围,并且您使用了另一种编码,则可能导致查询失败。因此,请检查$ id和您的数据库连接的编码
也许您的ID中包含空格。