我正在使用php和PDO sqlsrv驱动程序连接到Azure SQL数据库 . 在我尝试在我的sql语句中使用t-SQL转换函数之前,它一直正常工作 .
要清楚我在问什么:为什么这个t-SQL在我的PDO语句中不起作用 . 这是使用PDO和sqlsrv的限制吗?
这个声明工作正常:
"SELECT Courses.courseName, Classes.classID, Classes.classStartDate, Classes.classEndDate, Classes.classStartTime ,Classes.classEndTime, Classes.location, Classes.classType, Courses.courseInfoLink
FROM Classes
JOIN Courses
ON Courses.courseID = Classes.courseID
JOIN ClassRegistration
ON Classes.classID = ClassRegistration.classID
JOIN Employees ON
ClassRegistration.employeeID = Employees.employeeID
WHERE Employees.employeeID = {$employeeID} AND ClassRegistration.isCompleted = 0 AND Classes.classStartDate > GETDATE()"
这个声明没有(尽管它在Azure SQL管理门户中有效,所以我知道它是有效的T-SQL):
"SELECT Courses.courseName, Classes.classID, Classes.classStartDate, Classes.classEndDate, convert(nvarchar(MAX),Classes.classStartTime, 0)+' - '+convert(nvarchar(MAX),Classes.classEndTime,0), Classes.location, Classes.classType, Courses.courseInfoLink
FROM Classes
JOIN Courses
ON Courses.courseID = Classes.courseID
JOIN ClassRegistration
ON Classes.classID = ClassRegistration.classID
JOIN Employees ON
ClassRegistration.employeeID = Employees.employeeID
WHERE Employees.employeeID = {$employeeID} AND ClassRegistration.isCompleted = 0 AND Classes.classStartDate > GETDATE()"
当我使用该语句时,我收到一条错误消息:“PHP致命错误:无法访问第44行的... / db.php中的空属性”
第44行是“$ this - > _ results = $ this - > _ query-> fetchAll(PDO :: FETCH_OBJ);”来自下面的query()函数
如果有助于了解如何使用它,那么这是我的相关代码:
public function query($sql, $params = array()) {
$this-> _error = false;
if($this->_query = $this->_pdo->prepare($sql)) {
$x=1;
if(count($params)) {
foreach ($params as $param) {
$this->_query->bindValue($x, $param);
$x++;
}
}
if($this->_query->execute()) {
$this->_results = $this->_query->fetchAll(PDO::FETCH_OBJ);
$this->_count = $this->_query->rowCount();
}
else {
$this->_error = TRUE;
}
}
return $this;
}
public function getUpcomingClasses () {
$employeeID = $this->_employeeID;
$sql = "SELECT Courses.courseName, Classes.classID, Classes.classStartDate, Classes.classEndDate, convert(nvarchar(MAX),Classes.classStartTime, 0)+' - '+convert(nvarchar(MAX),Classes.classEndTime,0), Classes.location, Classes.classType, Courses.courseInfoLink
FROM Classes
JOIN Courses
ON Courses.courseID = Classes.courseID
JOIN ClassRegistration
ON Classes.classID = ClassRegistration.classID
JOIN Employees ON
ClassRegistration.employeeID = Employees.employeeID
WHERE Employees.employeeID = {$employeeID} AND ClassRegistration.isCompleted = 0 AND Classes.classStartDate > GETDATE()";
$x= 0;
foreach ($this->_db->query($sql)->results() as $results) {
$classes[$x] = $results;
$x++;
}
return $classes;
}
****这被标记为如何从PDO中获取错误的可能重复 . 不太确定是否适用 . 虽然这可能有所帮助,但这不是问题的原因 . 正如这里真正的问题是“这是否是对使用PDO和sqlsrv的限制?”
我总是想要任何可能有用的东西,所以我将 $this ->_pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
添加到我的PDO中,然后在query()函数中使用try catch修改我的代码,如下所示:
try {
$this->_query->execute();
}
catch (PDOException $e) {
$this->_error = "Error: " . $e->getMessage() . "
\n";
}
}
return $this;
然后我修改了我的foreach循环以简单地返回我的错误(我只是有一个error()函数在我的运行查询的类中返回$ this - > _ error:
echo $this->_db->query($sql)->error()"
返回空白 . 所以抛弃它:
var_dump($this->_db->query($sql)->error());
返回“bool(false)” . 因为我在初始化时将error属性设置为false,所以它似乎没有捕获任何特定错误,对吗?
*另一个更新 . 我创建了一个存储过程并尝试执行它,但得到了相同的结果 .
然而,我然后将我的PDO查询更改为获取数组(FETCH_ASSOC)而不是FETCH_OBJ,并且's returning the array (both as I originally posted it and as a stored procedure). I can't找到关于此的任何文档,说明为什么我无法将其作为对象获取,所以我仍然会欣赏任何见解 . 谢谢
1 回答
功能和非功能查询之间的区别在于SELECT . 失败的包括连续转换 .
我看到类似的失败,当简单的复杂性(如何为一个矛盾的?)添加到查询中 . 具体来说,我正在使用dblib和sqlserv PDO与Doctrine .
它可能有助于添加括号以对连接进行分组并为其指定列别名: