Php PDO,类方法返回true,而参数中的列名错误?

Posted

技术标签:

【中文标题】Php PDO,类方法返回true,而参数中的列名错误?【英文标题】:Php PDO, class method return true while the column name in the param is wrong? 【发布时间】:2014-08-27 14:23:08 【问题描述】:

我创建了具有以下两种方法的类: 连接方法如下:

private function connect()
    try
        $this->con = new PDO("mysql:host=$this->host;dbname=$this->db_name;charset=utf8", $this->db_user, $this->db_pass); 
        $this->con->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
        $this->con->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
        $this->con->setAttribute(PDO::ATTR_EMULATE_PREPARES, TRUE);
    catch(PDOException $ex)
        return $ex->getMessage();
        
    

这里是插入、更新、删除和查找表中记录的方法:

public function dbQuery($sql,$bindVars=array())
        try
            $this->connect();
            $statement = $this->con->prepare($sql);
            $statement->execute($bindVars);
            if($statement->rowCount() > 0)
                return true;
                
            else
                return false;
                
            catch(PDOException $exc)
                return $exc->getMessage(); 
                
            $this->con = null;

现在我正在使用这种方式(例如)将记录插入到我的表中:

1- 填充可以绑定到 dbQuery 方法的数组;

$bindInputInsert = array(
                                        ':empSno'=>$empSno,
                                        ':fromCourt'=>$fromCourt,
                                        ':toCourt'=>$toCourt,
                                        ':transferDate'=>$transferDate,
                                        ':transferFromDate'=>$transferFromDate,
                                        ':causeOfTransfer'=>$causeOfTransfer,
                                        ':departmentDetails'=>$departmentDetails,
                                        ':orderNo'=>$orderNo
                                        );

2- 现在准备这样的插入查询:

                $sqlInsert = "INSERT INTO empoffices (
                                                    empSno,
                                                    fromCourt,
                                                    toCourt,
                                                    transferDate,
                                                    transferFromDate,
                                                    causeOfTransfer,
                                                    departmentDetails,
                                                    orderNo
                                                    ) 
                              VALUES(
                                                    :empSno,
                                                    :fromCourt,
                                                    :toCourt,
                                                    :transferDate,
                                                    :transferFromDate,
                                                    :causeOfTransfer,
                                                    :departmentDetails,
                                                    :orderNo
                                                    )";

3- 将查询发送到 dbQuery 方法并插入测试记录?

if($db->dbQuery($sqlInsert,$bindInputInsert))
      echo($method->sucMsg("Info: - "," Record saved successfully")); 
      
 else 
      echo($method->errorMsg("Error: - ","Record not saved"));
      //end else insert()

我面临的问题: 上面的方法对我来说很好,但是如果我在查询中拼错了一个列名,它不会将记录插入到表中(这是正确的),但它仍然返回 true ???虽然它应该返回假?

我做错了什么我不明白,请帮助我。提前致谢。

【问题讨论】:

【参考方案1】:

您的方法dbQuery 仅在有效查询结果为rowCount() <= 0 时才返回false。当您发送无效查询时,例如列名拼写错误的查询,它会返回异常,特别是 $exc->getMessage();,它不是 false

试试这样的方法:

if ($db->dbQuery($sqlInsert,$bindInputInsert) === true) 
    // success
 ...

当且仅当dbQuery 准确返回true - 而不是false $exc->getMessage();,这将评估为真。

【讨论】:

是的,你是对的,我真的忽略了 $exc->getMessage(),如果我用 false 替换 $exc->getMessage(),我认为它应该对我有用吗?不是吗? @AbdulRahman 是的,用 false 替换 $exc->getMessage() 应该可以解决问题……但是您会丢失异常消息,因此您可能需要先回显该消息,然后返回 false。 感谢您的宝贵提示:我已经像这样替换了 catch 块中的代码:\n catch(.....) $this->tempVar = $exc->getMessage() ; //出于调试目的,仅返回 false; \n 现在,如果我需要显示错误消息,我将在 echo 函数中调用 $obj->tempVar。

以上是关于Php PDO,类方法返回true,而参数中的列名错误?的主要内容,如果未能解决你的问题,请参考以下文章

PHP PDO 语句可以接受表名或列名作为参数吗?

使用 PDO 时如何获取原始表/列名?

php课程---php使用PDO方法详解(转)

从 PHP 类和 DBMS 技术创建 PDO 连接字符串

pdo预处理语句

PDO类PDOPDOStatementPDOException