Search code examples
phpmysqlistatements

stmt get_result another way


An example of one of my queries...

public function db_query_select($query, $params, $param_types){
        $dbc = $this->dbConnect();
        if($stmt = $dbc->prepare($query)){
            //prepared.
            //move the types to the front of the param array
            array_unshift($params, $param_types);
            //call the bind param function with the parameters passed in by reference
            //bind_param only allows by reference.
          call_user_func_array(array($stmt, "bind_param"), $this->paramsToRefs($params));
                //binded.
                //attempt to execute the sql statement.
                if ($stmt->execute()){
                            $result = $stmt->get_result();
                            $stmt->close();
                            $dbc->close();
                            return $result;
                }
            }
            //must have failed...
            return NULL;
    }

how can I change stmt get_result(); to something that is accepted by shared servers/hosts without the native driver... mysqlnd.

Anyone know? without changing all of my functions that use this database function.

Thanks.

UPDATED:::: Thanks to @your common sense, See Answer.

I believe this is what I was after. Hope it helps anyone that was having the same problem as myself. PDO vs MySQLi, seems simpler... no user call func or anything like that.

DB HANDLER:

private function dbConnect(){
        $config = parse_ini_file($_SERVER['DOCUMENT_ROOT'].'/NTConfig.ini');
        try {
        $dbc = new PDO('mysql:host='.$config['DB_HOST'].';dbname='.$config['DB_DATABASE'].'', $config['DB_USER'], $config['DB_PASSWORD']);
        $dbc->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        } catch (PDOException $e) {
        echo 'Connection failed: ' . $e->getMessage();
        exit;
    }
        return $dbc;

    }


public function db_query_select($query, $params){
        $dbc = $this->dbConnect();
        if($stmt = $dbc->prepare($query)){
            //prepared.
                //attempt to execute the sql statement.
                if ($stmt->execute($params)){
                    $result = $stmt->fetch(PDO::FETCH_ASSOC);
                    print_r($result);
                    //$stmt->close();
                    //$dbc->close();
                    return $result;
                }
            }
            //must have failed...
            return NULL;
    }

Outside the DBHANDLER

$query = "SELECT error_desc FROM nt_errors WHERE error_code = :ERROR_CODE LIMIT 1";
            //array: holds parameters for the query.
            $params = array(
            ':ERROR_CODE' => $code
            );
            $result = $db->db_query_select($query, $params);
            if ($result == NULL){
                $errorText = 'ERROR: Failed to retrieve error';
            }
            else{
                //var_dump($result);
                $errorText = $result['error_desc'];

Solution

  • PDO is not only much more user friendly than mysqli but also doesn't have any of such a nasty drawbacks. So I strongly suggest to use PDO instead of mysqli.

    With DO, the function you're after should be as simple as this

    function run($sql, $args = NULL)
    {
        $pdo = ...;//your means of getting the connection variable
        $stmt = $pdo->prepare($sql);
        $stmt->execute($args);
        return $stmt;
    }
    

    After gettin the function's result, you can chain a fetch method to its call, fetchColumn() in your case.

    Given your code is mostly procedural, let me suggest you a very simple PDO wrapper I wrote. So the full code would be:

    $sql = "SELECT error_desc FROM nt_errors WHERE error_code = ?";
    $errorText = DB::run($sql,[$code])->fetchColumn();
    if (!$errorText){
        $errorText = 'ERROR: Failed to retrieve error';
    }
    

    Here DB class is a better replacement of your dbConnect() function, and run() method is a replacement for db_query_select() that actually can be used for any query type, including insert, update or anything.