首页 文章

带有PDO的PHP中的T-SQL

提问于
浏览
0

我正在使用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 回答

  • 1

    功能和非功能查询之间的区别在于SELECT . 失败的包括连续转换 .

    我看到类似的失败,当简单的复杂性(如何为一个矛盾的?)添加到查询中 . 具体来说,我正在使用dblib和sqlserv PDO与Doctrine .

    它可能有助于添加括号以对连接进行分组并为其指定列别名:

    SELECT
      Courses.courseName, Classes.classID, 
      Classes.classStartDate, Classes.classEndDate,
      (convert(nvarchar(MAX),Classes.classStartTime, 0) 
        + ' - ' 
        + convert(nvarchar(MAX),Classes.classEndTime,0)) AS timeRange, 
      Classes.location, Classes.classType, Courses.courseInfoLink  
    ...
    

相关问题