How to use select with php and Pdo

Asked

Viewed 19 times

0

Hi, how are you? I am learning database with php, was creating a class named crud where there is a select function to remove data from the database, however, after select, the result is always 0, and pussuo data in the database, follow the code below:

Class code:

class Crud{
    // VARIAVEIS SOBRE O DATABASE
    // guarda o nome do banco de dados 
    private $db_name;
    // nome do usuario do banco de dados
    private $db_user;
    // senha do banco de dados
    private $db_password;
    // servidor o qual está o banco de dados
    private $db_server;
    // guarda qual a linguagem do banco de dados ( ainda em desenvolvimento )
    private $db_language;
    // guarda a conecção com o banco de dados para que possam ser executadas as funções
    private $db_conn;

    // seta as variaveis para os valores passados ou para os pré definidos
    function __construct($_name, $_user='root', $_password='', $_server='localhost', $_language='mysql'){
        $this->set('db_name', $_name);
        $this->set('db_user', $_user);
        $this->set('db_password', $_password);
        $this->set('db_server', $_server);
        $this->set('db_language', $_language);
    }

    // Conecta ao banco de dados por meio de uma conecção PDO
    private function connect(){
        try {
            // guarda as variaveis globais em variaveis locais para simplificar e diminuir a linha de conecção que vem posteriormente
            $host = $this->get('db_server');
            $name = $this->get('db_name');
            $user = $this->get('db_user');
            $password = $this->get('db_password');
            $language = $this->get('db_language');

            // seta a variavel db_conn como a conecção do banco de dados, permitindo usar em outras funções
            $this->set('db_conn', new PDO("$language:host=$host;dbname=$name", $user, $password));
            $this->db_conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        } catch (PDOException $e){
            return $e;
        }
    }

    // Desconecta do banco de dados atribuindo null a variavel que contem o objeto
    private function desconnect(){
        $this->db_conn = NULL;
    }

 /*
    Função que retorna o dados do banco de dados
    *$column_array: array que contem strings com as colunas que se deseja obter 
    *$table: string que contem o nome da tabela a qual os dados serão inseridos
    *$where: string que contem a condição a ser executada após o where, ex: 'id = 1', caso vazio, retorna tudo da tabela
    */
    public function select($column_array, $table, $where=''){
        $this->connect();
        
        // CRIAÇÃO DA QUERY SQL
        $sql_qr = "SELECT";
        $c = 0;

        // adição das colunas que irão ser retornadas
        foreach($column_array as $column){
            if($c == 0){
                $sql_qr = $sql_qr . " $column";
                $c++;
            } else {
                $sql_qr = $sql_qr . ", $column";
            }
        }

        // Adição da tabela e da condição where
        $sql_qr = $sql_qr . " FROM $table";

        if($where!=''){
            $sql_qr = $sql_qr . " WHERE $where";
        }

        $dados = $this->db_conn->exec($sql_qr);
        echo $dados;

        $this->desconnect();
    }

    // CLASS FUNCTIONS
    private function get($variable){
        return $this->$variable;
    }

    private function set($variable, $value){
        $this->$variable = $value;
    }
}

$c = new Crud('test');
$c->select(['id', 'nome', 'sobrenome'], 'test_table');

As I said, when I give "echo $data" in the function Insert, it returns 0, however, my database is not empty ( photo below ), some suggestion I can do? inserir a descrição da imagem aqui

2 answers

0

The return of function exec PDO only returns the number of affected rows. You are missing the Select result. You can use it like this:

$stmt = $this->db_conn->prepare($sql_qr); // Atribuir a consulta a um objeto preparado
$stmt->execute(); // Executar o comando no banco
$resultado = $stmt->fetchAll(); // Obter o resultado da consulta
var_dump($resultado); // Imprimir o que veio na consulta

$this->desconnect();

0

According to the documentation the function exec() returns the number of affected rows (changed or deleted). As you are doing a select, no record is being changed, causing the function to return 0.

To return the number of rows in the table, you must use the function query() and the function rowCount() as in this example below:

$dados = $this->db_conn->query($sql_qr)->rowCount();
echo $dados; // numeros de registros na tabela

Now, if you want to return the data, consider the example below:

$exec = $this->db_conn->query($sql_qr);
$dados = $exec->fetchAll(PDO::FETCH_ASSOC);
print_r($dados); //dados retornados em um Array

And if even taking all the data you want to later show the amount of rows returned, you can use the function count():

echo count($dados); // numero de linhas retornadas pelo banco de dados

Finally, I’d like you to consider some changes I’ve made to your method select():

public function select($column_array, $table, $where=''){
    $this->connect();

    // CRIAÇÃO DA QUERY SQL
    $sql_qr = "SELECT ";

    // adição das colunas que irão ser retornadas
    $sql_qr .= implode(',', $column_array);

    // Adição da tabela e da condição where
    $sql_qr .= " FROM " . $table;

    if($where!=''){
        $sql_qr .= " WHERE " . $where;
    }

    $exec = $this->db_conn->query($sql_qr);
    $dados = $exec->fetchAll(PDO::FETCH_ASSOC);

    $this->desconnect();

    return $dados;
}

Browser other questions tagged

You are not signed in. Login or sign up in order to post.