我一直在一个小的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属性连接到数据库,您可能希望假设它已被调用。
这是我需要帮助解决的问题: 逐步描述正在发生的事情:
这是正常的吗?我读了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吗?
答案 0 :(得分:2)
执行方法在成功时返回true,在您的情况下为真:mysql查询已成功执行,但没有行受影响。
如果您需要检查更新是否实际更改了任何内容,则需要使用“rowCount”:
$stmt = $this->m_DB->prepare('Update ...');
$stmt->execute();
$effected = $stmt->rowCount();
然后,您可以决定是否要从方法中返回true / false值。
答案 1 :(得分:1)
如果SQL命令本身出错,您将只收到错误。因此,如果Employes是一个有效的表,并且CieNo,Nom,Dept和EmplCode都是有效列,那么您的SQL语句是有效的,即使它并不总是找到UPDATE行。从技术上讲,它是“成功的”,只是不是你想要的方式。
有关如何确定0或更多行是否受查询影响的信息。
答案 2 :(得分:-2)
$cn = new PDO(/*Connection string and params here*/);
$cn->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
$stmt = $cn->prepare($sql);
$stmt->execute($params);