0

预计 mysql_query 将被弃用 PHP 5.5.0,我一直在研究一个类来处理我所有的数据库查询:

class DataBaseClass {

    //.....some other function and variables declared here....

    function GetConnection() {
        try {
          $this->conn = new PDO("mysql:host=" . DB_HOST . ";dbname=" . DB_NAME, DB_USER, DB_PASS);
          $this->conn->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION ); 
        }
        catch(PDOException $e) {
           echo $e->getMessage();
        }

         return $this->conn;
     }

     function Query($str_sql, $arr_parameters = array()) {
         try {
            $this->str_mysql_error = $this->int_num_rows = $this->int_num_affected_rows = $this->int_mysql_insert_id =  '';

            if (count($arr_parameters) > 0) {
                $obj_result = $this->conn->prepare($str_sql);
                $obj_result->execute($arr_parameters);
            } else {
                $obj_result = $this->conn->query($str_sql);
            }


         }

         catch(PDOException $e) { 
             $this->str_mysql_error = $e->getMessage() . $str_sql;

          }
     }
}

然后我有另一个类来创建新用户:

class AddNewUser {
    //.....some other function and variables declared here....

    function InsertUser() {
          $str_sql = "INSERT INTO  (uname, name, email, pass, user_regdate, theme)       VALUES )";
           $_SESSION['db_connection']->Query($str_sql, '');         

     }
}

现在在我的主要用户创建页面上,我有:

$_SESSION['db_connection'] = new DataBaseClass; 
//Reason I used $_SESSION to store my DB object, is so that it can be accessible everywhere. 
//Did not want to use "global" everywhere. Not sure if this is he best way???

$cls_new_user = new AddNewUser ();
$cls_new_user->InsertUser(); //Does not raise PDOExecption although SQL cleary wrong inside this method
if ( $_SESSION['db_connection']->str_mysql_error) {
    //show error in error div
}


$str_sql = "SELECT some wrong SQL statment";
$_SESSION['db_connection']->Query($str_sql); // This does raise PDOExecption

if ( $_SESSION['db_connection']->str_mysql_error) {
    //show error in error div
}

我不确定为什么从另一个类调用 DB 类函数“Query”不会引发明显错误的 SQL 异常。但是从主页代码(不在函数/类内部)调用的相同函数会引发异常错误。

此外,即使 SQL 正确,“InsertUser”函​​数也不会执行/插入任何内容到 DB 中。

它可能与范围相关,还是我试图通过将它放在 $_SESSION 中来强制执行我的数据库对象的全局范围?

我会以错误的方式解决这个问题吗?使用类路由来封装我所有的数据库调用的原因是为了避免将来出现任何弃用问题 - 只需更新类。

4

1 回答 1

0

以这种方式制作您的功能。

 function Query($str_sql, $arr_parameters = array()) {
        $stmt = $this->conn->prepare($str_sql);
        $stmt->execute($arr_parameters);
 }

我很确定会抛出异常

唯一的问题可能是捕获异常,而不是抛出异常。它可能是由命名空间引起的,而不是范围。可以肯定的是,您始终可以在所有 PDO 调用前加上斜杠:

\PDO::FETCH_ASSOC
\PDOException

等等

于 2013-06-07T13:22:11.087 回答