PHP PDO Wrapper类实现

时间:2014-05-30 14:48:58

标签: php mysql pdo

我一直在一个小的PHP框架内开发一个包装类,我在课堂上遇到一些奇怪的方法。

首先是类代码:

<?php
namespace Framework;
header('Content-Type: text/html; charset=UTF-8');

class cConnexion 
{
    public $m_log;//This will be instantiate as a cLog object (another class in the namespace)
    private $m_DB;//PDO instance
    private $m_Host;//Host of the conneciton string
    private $m_DBName;//Name of the DB to connecte to
    private $m_Driver;//Driver name, mysql for MySQL, sqlsrv for MSSQL
    private $m_Login;//Username for authentification
    private $m_Password;//Password for authentification

    public function __construct($p_Driver = "mysql", $p_host, $p_DBName, $p_login, $p_password)
    {
        $this->m_Host= $p_host;
        $this->m_Driver = $p_Driver;
        $this->m_DBName = $p_DBName;
        $this->m_Login = $p_login;
        $this->m_Password = $p_password;
        $this->m_log = new cLog('', '', true, false, false);
    }

    public function SecureExecute($p_query, $p_param)
    {
        try
        {
            $stmt = $this->m_DB->prepare($p_query);
            $status = $stmt->execute($p_param);
            $this->m_log->setMessageFR("Aucune exception ne s'est levé. ");
            $this->m_log->setMessageEN("No exceptions were raised. ");
            $this->m_log->setSuccess($status);
            return $status;
        }
        catch(\PDOException $e)
        {
            $this->m_log->setMessageFR("Une exception de type PDO est levé. ".$e->getMessage());
            $this->m_log->setMessageEN("A PDO exception was raised. ".$e->getMessage());
            $this->m_log->setSuccess(false);
            return false;
        }
    }
}   
?>

请注意,我删除了与问题无关的所有其他方法,但保留了构造函数和所有属性。另请注意,有一种方法可以将$ m_DB属性连接到数据库,您可能希望假设它已被调用。

这是我需要帮助解决的问题: 逐步描述正在发生的事情:

  1. 我创建了一个cConnexion实例,并使用此处未描述的connecteToDB方法,但它工作正常,因为我可以使用另一种方法来执行MySQL&#39; SELECT&#39;言。
  2. 我试图更新MySQL表中不存在的行,但该对象仍告诉我UPDATE成功。
  3. 这是正常的吗?我读了PDO :: PDOStatement :: execute Doc,并且说PDO :: PDOStatement :: execute的返回值是true(成功时)或false(如果失败)。

    以下是使用该方法的代码示例:

    $sql = "UPDATE Employes SET CieNo = 3, Nom = :Name, Dept = :Department WHERE EmplCode = :Code";
    $params = array
    (
        'Code'=>$EmplCode,// = 123
        'Name'=>($lname." ".$fname),// = Lalonde Sebastien
        'Department'=>$dep,// = INFO
    );
    $cn = new cConnexion(/*Connection string and params here*/);
    $cn->connectToDB();
    if($cn->SecureExecute($sql, $params))
    {
        echo "SQL1: true";
    }
    

    以下代码始终输出&#34; SQL1:true&#34;即使UPDATE不起作用......(因为Employes表不包含EmplCode = 123)。 有人可以提出改变我的类的方法,以便SecureExecute()方法在发生这种情况时返回false吗?

3 个答案:

答案 0 :(得分:2)

执行方法在成功时返回true,在您的情况下为真:mysql查询已成功执行,但没有行受影响。

如果您需要检查更新是否实际更改了任何内容,则需要使用“rowCount”:

$stmt = $this->m_DB->prepare('Update ...');
$stmt->execute();

$effected = $stmt->rowCount();

然后,您可以决定是否要从方法中返回true / false值。

http://www.php.net/manual/en/pdostatement.rowcount.php

答案 1 :(得分:1)

如果SQL命令本身出错,您将只收到错误。因此,如果Employes是一个有效的表,并且CieNo,Nom,Dept和EmplCode都是有效列,那么您的SQL语句是有效的,即使它并不总是找到UPDATE行。从技术上讲,它是“成功的”,只是不是你想要的方式。

查看rowCount()

有关如何确定0或更多行是否受查询影响的信息。

答案 2 :(得分:-2)

事实上,整个班级似乎完全没用。使用原始PDO可以获得完全相同的结果,添加量非常小。

$cn = new PDO(/*Connection string and params here*/);
$cn->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );

$stmt = $cn->prepare($sql);
$stmt->execute($params);