Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

TeixeiraRamos

Listar Registros - Um SELECT * FROM - phpOO - Orientado a Objeto

Recommended Posts

Olá a todos.

Através das postagens de 12 de novembro, com título " Não funciona os script para Alterar e Excluir registros "

foi possível criar um CRUD - PDO - Orientado a Objeto.

Gostaria muito, com os mesmos scripts (Orientado a Objeto) criar outras páginas como por exemplo "Listar os registros cadastrados", cria as minhas <div>, <tables> com os registros do banco de dados.

Tentei o seguinte, aproveitando a apostila do Beraldo.

Criei dentro da pasta metadados, onde se encontra o index.php a página minhalista.php com esse escript:

<?php
    //require_once 'classes/Usuarios.php';
    function __autoload($class) {
        require_once  '../classes/' . $class . '.php';
    }
?>

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Minha Lista - estudos</title>
</head>

<body>

<?php 

	//executa a consulta
	$sql = "SELECT * FROM tbl_usuarios ORDER BY nome";
	$res = $mysqli->query($sql);
	
	//total de registro
	$total = $res->num_rows;
	
	echo "<p>Total de Resultados: " . $total . "</p>";
	
	//loop pwelos registros
	while ($f = $res->fetch_array())
	{
	echo "<p>" . $f['nome']	. " | " .
		     $f['email'] . " | "  .  "</p>";
	}
//fecha a conexão
$mysqli->close();

?>

</body>
</html>

Não deu certo mostra esses erros:

Citar

 

( ! ) Notice: Undefined variable: mysqli in C:\wamp\www\phpoo\metadados\minhalista.php on line 21
Call Stack
# Time Memory Function Location
1 0.0004 356280 {main}( ) ...\minhalista.php:0

 

( ! ) Fatal error: Uncaught Error: Call to a member function query() on null in C:\wamp\www\phpoo\metadados\minhalista.php on line 21
( ! ) Error: Call to a member function query() on null in C:\wamp\www\phpoo\metadados\minhalista.php on line 21
Call Stack
# Time Memory Function Location
1 0.0004 356280 {main}( ) ...\minhalista.php:0

 

A linha 21 é aqui:

 

Citar

$res = $mysqli->query($sql);

 

 

 

 

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá felone,

Conforme página 6 e 7 do "Guia de Atualização MySQL Para MySQLi", do Beraldo, consta:

Citar

Exibindo os Dados Usando MySQLi Orientado a Objetos
Como você deve ter percebido, é um tanto chato ter que ficar passando todos
esses parâmetros.
E é aí que o MySQLi Orientado a Objeto mostra suas vantagens.
Veja o código anterior escrito no padrão Orientado a Objeto:

 

$host = 'localhost';
$user = 'roo';
$pass = '';
$db   = 'guia_mysql';

// conexão e seleção do banco de dados
$mysqli = new mysqli($host, $user, $pass, $db);

// Toda essa parte superior eu não coloquei. Chamei a class/Usuario.php que faz a conexão com o bando de dados. Não faz Inclusão,           // Alteração, Exclusão ? Então está fazendo conexão com o banco de dados   

// Tudo abaixo eu adaptei do meu projeto que faz conexão com o banco de dados. Mas está igual a apostila do Beraldo.
// Esse exemplo da apostila funciona e é Orientado a Objetos. Não poderia usar aqui? 

<?php 

	//executa a consulta
	$sql = "SELECT * FROM tbl_usuarios ORDER BY nome";
	$res = $mysqli->query($sql);
	
	//total de registro
	$total = $res->num_rows;
	
	echo "<p>Total de Resultados: " . $total . "</p>";
	
	//loop pwelos registros
	while ($f = $res->fetch_array())
	{
	echo "<p>" . $f['nome']	.  " | "  .
		         $f['email'] . " | "  .  "</p>";
	}
//fecha a conexão
$mysqli->close();

?>

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

voce já configurou o  charset de comunicação entre a aplicação e o banco de dados ?

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Prezado felone,

Meu problema é de caracteres ?

Não entendi. Você se refere aqui?

<meta charset="utf-8">

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá!

Conecte a aplicação ao database assim:
 

<?php

// variáveis para conexão em localhost
    $host = 'seu-server';   // define o host do banco de dados
    $user = 'seu-user';            // user do banco de dados
    $password = 'sua-senha';         // senha do banco de dados
    $database = 'seu-database';  // nome do banco de dados
  }

  // estabelecer conexão com o mysql
  $sua_var = new mysqli($host, $user, $password);


// verificar se houve erro na conexão
  if ($sua_var->connect_error) {
    // se houve erro, mostra erro na tela
    echo "<p>Erro ao Conectar: $sua_var->connect_error</p>";
  }
// alterar o tipo de codificação da conexão com o banco de dados para utf8
  if (!$sua_var->set_charset('utf8')) {
    echo "<p class='error'>O charset não é utf8: $sua_var->error</p>";
  }
// selecionar/abrir o banco de dados para trabalhar
  if (!$sua_var->select_db($database)) {
    // se o banco de dados não for encontrado
    echo "<p class='error'>Banco de dados não encontrado, chefe!</p>";
  }

Isso é só pra deixar a conexão mais "copmleta/robusta".

Na verdade não entendi se o sr. está tendo algum problema na listagem dos dados.

 

Se quiser continuar usando o mesmo nome na variável de conexão, troque $sua_var por $mysqli

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Prezado Washalbano e todos do fórum boa noite.

Creio que não informei corretamente o que desejo.

Por favor, observem:

  1. Meu desejo inicial, que inclusive teve excito, foi construir uma aplicação Orientado a Objetos onde permitisse "Cadastrar", "Alterar" e "Exclui" registros;
  2. Com as sugestões do pessoal do fórum foi possível concluir com sucesso. Muito bem. O banco dados hoje pode ser "povoado", os registros podem ser "Alterados" e "Excluídos" (postagem aqui dia 12 de novembro, com título " Não funciona os script para Alterar e Excluir registros " );
  3. Aproveitando essa oportunidade gostaria de criar (aprender), dentro dessa mesma aplicação (Orientado a Objetos), ou seja, com o mesmo banco de dados, uma listagem onde mostre os meus registros "Cadastrados" ;
  4. O script abaixo mostra o que realmente desejo e está sendo gerado com um script que considero errado. Entendo que Orientado Objetos ou não não pode ser dessa forma, mesmo que o resultado seja favorável como vocês podem avaliar. Vou explicar:

Página lista.php 

 

<!doctype html>
<html lang="pt-br">
<head>
	<meta charset="utf-8">
	<title>Teste Lista do phpoo</title>
	<meta name="viewport" content="width=device-width, initial-scale=1">
    
    <link href="../css/bootstrap.min.css" rel="stylesheet">
</head>
<body>

<div class="container">

<?php 
	$host = 'localhost';
	$user = 'root';
	$pass = '';
	$db   = 'phpoo';

// conexão e seleção do banco de dados
$mysqli = new mysqli($host, $user, $pass, $db);

mysqli_set_charset($mysqli, 'utf-8'); //Resolve a questão dos acentos por exemplo João

// executa a consulta
$sql = "SELECT * FROM tbl_usuarios ORDER BY nome";
$res = $mysqli->query($sql);

// total de registros
$total = $res->num_rows;

echo "<p>Total de Resultados: " . $total . "</p>";

echo"<body>
<table class='table-responsive' width='50%' border='1' cellpadding='1' cellspacing='0'>
<thead>
	<tr align='center' bgcolor='999999'>
		<td>Nome</td>
		<td>Email</td>
	<tr>
</thead>
<body>";

// loop pelos registros
while ($f = $res->fetch_array())
{
	echo "<tr> 
	 		<td>" . $f['nome']  . "</td> 
	        <td>" . $f['email'] . "</td>
    	 </tr>";
}
echo"</body>
</table>";

// fecha a conexão
$mysqli->close();
?>
</div> 
</body>
</html>

Executando lista.php mostra todos os registros do banco de dados Cadastrados pelo página index.pho:

Citar

Total de Resultados: 9

Nome Email
Antônio Orientado Objeto antoniooo@terra.com.br
Carlos Vai Sair Bem da Silva carlosvsbs@gmail.com
João da Silva Teste joaot@terra.com.br
Mônica do Teste Certo monicadtc@terra.com.br
Maria dos Testes Ponto mariatestep@terra.com.br
Monique do Programa moniquedp@terra.com.br
Toledo da Ordem e Silva toledadaords@terra.com.br
Vera da Perseverança Grande e Silva veradapgs@terra.com.br
Zileide da Ordem Certa zeleideoc@terra.com.br

 

É isso que eu desejo. Sim.

Mas acho que não está correto.

Para que essas linhas?

<?php 
	$host = 'localhost';
	$user = 'root';
	$pass = '';
	$db   = 'phpoo';

Se na aplicação onde se encontra o script acima existe um arquivo chamado:

config.php com o script:

<?php

define('HOST', 'localhost');
define('USER', 'root');
define('PASS', '');
define('BASE', 'phpoo');

O config.php não funciona no index.php, Cadastrando, Alterando e Excluindo? Sim

Então o mais lógico é colocar o config,php em um include no meu escript do arquivo lista.php e vai funcionar. 

Negativo. Não funcionou mostrou erros.

O script da lista.php com o include:

 

<!doctype html>
<html lang="pt-br">
<head>
	<meta charset="utf-8">
	<title>Teste Lista do phpoo</title>
	<meta name="viewport" content="width=device-width, initial-scale=1">
    
    <link href="../css/bootstrap.min.css" rel="stylesheet">
</head>
<body>

<div class="container">

<?php 
	include("../classes/config.php");
	
// conexão e seleção do banco de dados
$mysqli = new mysqli($host, $user, $pass, $db);

mysqli_set_charset($mysqli, 'utf-8'); //Resolve a questão dos acentos por exemplo João

// executa a consulta
$sql = "SELECT * FROM tbl_usuarios ORDER BY nome";
$res = $mysqli->query($sql);

// total de registros
$total = $res->num_rows;

echo "<p>Total de Resultados: " . $total . "</p>";

echo"<body>
<table class='table-responsive' width='50%' border='1' cellpadding='1' cellspacing='0'>
<thead>
	<tr align='center' bgcolor='999999'>
		<td>Nome</td>
		<td>Email</td>
	<tr>
</thead>
<body>";

// loop pelos registros
while ($f = $res->fetch_array())
{
	echo "<tr> 
	 		<td>" . $f['nome']  . "</td> 
	        <td>" . $f['email'] . "</td>
    	 </tr>";
}
echo"</body>
</table>";

// fecha a conexão
$mysqli->close();
?>
</div> 
</body>
</html>

Ao invés de mostra a <table> com os registros mostra:

 

Citar

 

( ! ) Notice: Undefined variable: host in C:\wamp\www\phpoo\metadados\lista.php on line 18
Call Stack
# Time Memory Function Location
1 0.0003 357920 {main}( ) ...\lista.php:0

 

( ! ) Notice: Undefined variable: user in C:\wamp\www\phpoo\metadados\lista.php on line 18
Call Stack
# Time Memory Function Location
1 0.0003 357920 {main}( ) ...\lista.php:0

 

( ! ) Notice: Undefined variable: pass in C:\wamp\www\phpoo\metadados\lista.php on line 18
Call Stack
# Time Memory Function Location
1 0.0003 357920 {main}( ) ...\lista.php:0

 

( ! ) Notice: Undefined variable: db in C:\wamp\www\phpoo\metadados\lista.php on line 18
Call Stack
# Time Memory Function Location
1 0.0003 357920 {main}( ) ...\lista.php:0

 

( ! ) Warning: mysqli::__construct(): (HY000/1045): Access denied for user ''@'localhost' (using password: NO) in C:\wamp\www\phpoo\metadados\lista.php on line 18
Call Stack
# Time Memory Function Location
1 0.0003 357920 {main}( ) ...\lista.php:0
2 0.0035 359360 __construct ( ) ...\lista.php:18

 

( ! ) Warning: mysqli_set_charset(): Couldn't fetch mysqli in C:\wamp\www\phpoo\metadados\lista.php on line 20
Call Stack
# Time Memory Function Location
1 0.0003 357920 {main}( ) ...\lista.php:0
2 0.0181 359520 mysqli_set_charset ( ) ...\lista.php:20

 

( ! ) Warning: mysqli::query(): Couldn't fetch mysqli in C:\wamp\www\phpoo\metadados\lista.php on line 24
Call Stack
# Time Memory Function Location
1 0.0003 357920 {main}( ) ...\lista.php:0
2 0.0190 359512 query ( ) ...\lista.php:24

 

( ! ) Notice: Trying to get property of non-object in C:\wamp\www\phpoo\metadados\lista.php on line 27
Call Stack
# Time Memory Function Location
1 0.0003 357920 {main}( ) ...\lista.php:0

Total de Resultados:

 

( ! ) Fatal error: Uncaught Error: Call to a member function fetch_array() on null in C:\wamp\www\phpoo\metadados\lista.php on line 42
( ! ) Error: Call to a member function fetch_array() on null in C:\wamp\www\phpoo\metadados\lista.php on line 42
Call Stack
# Time Memory Function Location
1 0.0003 357920 {main}( ) ...\lista.php:0

 

Não é só digitar o include em lista.php, tem em algo mais para trabalhar.

 

 

 

 

 

 

 

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

O principal foco da orientação a objeto é reaproveitamento, se não reaproveitar tudo a maior parte do código é reaproveitado.

Ou seja, se escrevemos um código em um arquivo, logo não usamos em outro e isso está bem longe da orientação.

Quando criamos var's em um arquivo e precisamos dessas variáveis em outro, obrigatoriamente temos que incluir o arquivo que gerou a ou as variáveis antes de usar-las. Assim sendo quando isso não acontece desencadeia uma série de erros, que é comum quando não há verificação do dados.

 

Aqui vemos que 4 variáveis não foram definidas antes de usar-las:

10 horas atrás, TeixeiraRamos disse:

Notice: Undefined variable: host in C:\wamp\www\phpoo\metadados\lista.php on line 18

Notice: Undefined variable: user in C:\wamp\www\phpoo\metadados\lista.php on line 18

Notice: Undefined variable: pass in C:\wamp\www\phpoo\metadados\lista.php on line 18

Notice: Undefined variable: db in C:\wamp\www\phpoo\metadados\lista.php on line 18

Ou seja elas não existem, e se não existem não geram o construtor que gera outro erro que desencadia mais erros até o último onde o fetch_array não pode ser executado em dados que NÃO EXISTEM.

10 horas atrás, TeixeiraRamos disse:

Fatal error: Uncaught Error: Call to a member function fetch_array() on null in C:\wamp\www\phpoo\metadados\lista.php on line 42

 

Agora só explicando, uma coisa é variável outra coisa é constante...

Isso são variáveis:

10 horas atrás, TeixeiraRamos disse:

$host = 'localhost';

$user = 'root';

$pass = '';

$db = 'phpoo';

 

Logo o uso seria assim mesmo:

10 horas atrás, TeixeiraRamos disse:

$mysqli = new mysqli($host, $user, $pass, $db);

 

 

Agora isso são constantes:

10 horas atrás, TeixeiraRamos disse:

define('HOST', 'localhost');

define('USER', 'root');

define('PASS', '');

define('BASE', 'phpoo');

 

Então seu uso seria assim:

Citar

$mysqli = new mysqli(HOST, USER, PASS, BASE);

 

 

Então quando se deve usar variáveis e quando se deve usar contantes?

A preferência sempre deve ser dada a variáveis, pois consomem menos do sistema para serem geradas, porém como dito sempre devem ser re-incluídas quando necessárias.

Já as contantes são um caso a parte pois enquanto o http request não muda elas existem, ou seja por exemplo se no index eu crio uma constante ou incluo um arquivo que a cria, qualquer arquivo dentro daquele endereço url reconhece essa constante não sendo necessária a recriação e re-inclusão desse dado.

Um exemplo prático está nessa classe que criei para envio de e-mails:

Spoiler

<?php

/**
 * ****************************************************
 * @Copyright (c) 2016, Spell Master.
 * @Version 3.0
 * ****************************************************
 * @Class Envio de e-mail
 * ****************************************************
 * @requires
 * * PHPMailer 5.2
 * * Contants de definição
 * ****************************************************
 * * @const MAILSLL  : Tipo de acesso tls/ssl ao SMTP
 * * @const MAILHOST : Endereço do SMTP
 * * @const MAILPORT : Porta de Acesso
 * * @const MAILUSER : endereço do e-mail que envia
 * * @const MAILPASS : Senha do e-mail que envia
 * * @const NAME     : Nome de quem envia
 * ****************************************************
 * @tutorial localhost
 * - Abra o arquivo httpd.conf do apache
 * Habilite o ssl_module
 * - Abra o arquivo php.ini
 * Ative as extensões:
 * php_curl
 * php_openssl
 * php_sockets
 * php_smtp(caso tenha)
 * - NOTA -
 * Caso o SMTP do e-mail que envia tenha segurança de
 * criptografia de dados como é o caso do GMAIL:
 * Acessar: https://myaccount.google.com/security
 * Procure por: "Acesso a aplicativos menos seguros"
 * e libere a autorização.
 * - NOTA 2 -
 * Em localhost no windows alguns softwares anti-virus
 * podem bloquear o acesso SMTP, uma vez que a máquina
 * estará a enviar dados para um local onde o mesmo
 * não pode monitorar.
 * ****************************************************
 */
class Mail {

    private $mailer;
    private $address;
    private $template;
    private $title;
    private $content;
    private $find;
    private $replaces;
    private $sendError;
    private $sendAcept;

    /**
     * ************************************************
     * @Method: Construtor, altera o comportamento da
     * class PHPMailer
     * ************************************************
     */
    function __construct() {
        $this->mailer = new PHPMailer;
        $this->mailer->IsSMTP();
        $this->mailer->IsHTML(true);
        $this->mailer->SMTPAuth = true;
        $this->mailer->SMTPSecure = MAILSLL;
        $this->mailer->Host = MAILHOST;
        $this->mailer->Port = (int) MAILPORT;
        $this->mailer->Username = MAILUSER;
        $this->mailer->Password = MAILPASS;
        $this->mailer->FromName = NAME;
    }

    /**
     * ************************************************
     * @Method: Recebe os dados
     * @Param ($Address) : Para quem o e-mail vai ser
     * enviado.
     * @Param ($title) : Título do e-mail
     * @Param ($html) : Arquivo que contém o html do
     * e-mail
     * @Param ($values) : Array com as informações que
     * serão enviadas.
     * ************************************************
     */
    public function sendMail($Address, $title, $html, $values = []) {
        $this->address = (string) $Address;
        $this->title = (string) $title;
        $this->template = (string) $html;
        $this->templateDir();
        $this->find = [];
        $this->replaces = [];
        foreach ($values as $key => $value) {
            $this->find[] = '{' . $key . '}';
            $this->replaces[] = $value;
        }
        $this->objectValues();
    }

    /**
     * ************************************************
     * @Method: Quando não consegue enviar informa o
     * erro que ocorreu.
     * ************************************************
     */
    public function mailError() {
        return $this->sendError;
    }

    /**
     * ************************************************
     * @Method: Informa o e-mail foi enviado.
     * @return (bool)
     * ************************************************
     */
    public function sendStatus() {
        if ($this->sendAcept) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * ************************************************
     * @Method: Checa se o arquivo de template do html
     * existe.
     * @access private
     * ************************************************
     */
    private function templateDir() {
        if (!file_exists($this->template)) {
            die('Erro ao solicitar dados para envio de e-mail');
        }
    }

    /**
     * ************************************************
     * @Method: Cria os objetos de envio
     * @access private
     * ************************************************
     */
    private function objectValues() {
        ob_start();
        include($this->template);
        $content = ob_get_clean();
        if (!empty($this->find) && !empty($this->replaces)) {
            $this->content = str_replace($this->find, $this->replaces, $content);
        }
        if ($this->sendValues()) {
            return true;
        }
    }

    /**
     * ************************************************
     * @Method: Envia os dados
     * @access private
     * @return Exeption (true/false)
     * ************************************************
     */
    private function sendValues() {
        $this->mailer->AddAddress($this->address);
        $this->mailer->Subject = $this->title;
        $this->mailer->Body = $this->content;
        try {
            $this->mailer->Send();
            $this->sendAcept = true;
        } catch (Exception $e) {
            $this->sendError = "Erro ao enviar e-mail linha: {$e->getCode()}<br/>Arquivo: {$e->getFile()}<br/>Detalhes: {$e->getMessage()}";
            $this->sendAcept = false;
        }
    }

}

 

 

Se notar a o uso de algumas constantes como MAILSLL/ MAILHOST etc... que não são criados dentro do escopo da classe.

 

 

Voltando ao assunto da orientação a objeto. Pois até agora o apresentado no post está muito longe de ser OO.

Pois para termos um mínimo nesse conceito, seria você possuir uma classe só para conexão essa classe por suas vez teria pelo menos dois métodos; um para construir a conexão outro para devolver a aplicação o objeto da conexão.

Outra classe para leitura que possuem método para:

Chamar a conexão, outro para verificar dados antes da consulta, outro para consultar, outro para modular a consulta, outro para consultar, outro para verificar os resultados, outro para modular os resultados quando existem, outro para devolver os resultados se existirem.

E se serve de exemplo veja essas duas classes que criei para conexão outra para leitura de dados

Obs.: Uso PDO (P = "php" / D = "data" / O = "object") Ou seja orientado a objeto por natureza.

Connect:

Spoiler

<?php

/**
 * ****************************************************
 * @Class: Classe de conexão PDO SingleTon.
 * ****************************************************
 */
class Connect {

    private static $host = HOST;
    private static $user = USER;
    private static $pass = PASS;
    private static $data = DATA;
    private static $isConnect = null;
    private static $isError = null;

    /**
     * ************************************************
     * Constroi a conexão
     * * @access private
     * ************************************************
     */
    private static function makeConnect() {
        try {
            if (self::$isConnect == null) {
                $dsn = 'mysql:host=' . self::$host . '; dbname=' . self::$data;
                $options = [PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES UTF8'];
                self::$isConnect = new PDO($dsn, self::$user, self::$pass, $options);
            }
        } catch (PDOException $e) {
            self::$error = '<br>Não foi possível conectar com o banco de dados!<br> Descrição:' . $e->getMessage() . '<br>';
            die('Erro interno no servidor. Código de referência 500');
        }
        self::$isConnect->SetAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        return (self::$isConnect);
    }

    /**
     * ************************************************
     * Chama o construtor da conexão
     * * @access public
     * ************************************************
     */
    protected static function callConnect() {
        return (self::makeConnect());
    }

    /**
     * ************************************************
     * Informa erros de conexão quando são disparados
     * * @access public
     * ************************************************
     */
    protected static function getError() {
        if (self::$isError) {
            return (self::$isError);
        }
    }

}

 

 

Select:

Spoiler

<?php

/**
 * ****************************************************
 * @Class "PDO" Faz leitura de dados no banco.
 * ****************************************************
 * @changelog
 * * V1.2 (Spell Master):
 * - Adicionado método de verificação de exceções para
 * tratamento de erros.
 * ****************************************************
 */
class Select extends Connect {

    /** @Attr: Armazena a tabela */
    private $selectTable;

    /** @Attr: Armazena os valores */
    private $selectFields;

    /** @Attr: Armazena a syntax da query */
    private $selectSyntax;

    /** @Attr: Armazena a conexão */
    private $selectConn;

    /** @Attr: Armazena se houve sucesso na incerssão */
    private $selectData;

    /** @Attr: Armazena o erro para personalizar a saída */
    private $selectError;

    /**
     * ************************************************
     * Recebe os dados para ler.
     * * @Param ($table) : Tabela para ler.
     * * @Param ($fields) : Campos para ler.
     * * @Param ($statements) : Valores para ler.
     * * @todo: (LIMIT/OFFSET) São opcionais.
     * ************************************************
     */
    public function query($table, $fields = null, $statements = null) {
        if (!empty($statements)) {
            parse_str($statements, $this->selectFields);
        }
        $this->selectTable = 'SELECT * FROM ' . $table . (isset($fields) ? ' WHERE ' . $fields : null);
        $this->selectExecute();
    }

    /**
     * ************************************************
     * Para leitura de múltipas tabelas
     *   simultâneas com uso de 
     *   "INNER_JOIN / LEFT_JOIN".
     * * @Param ($Query) : Tabela para ler.
     * * @Param ($statements) : Valores para ler.
     * * @todo : "LIMIT/OFFSET" São opcionais.
     * ************************************************
     */
    public function setQuery($Query, $statements = null) {
        if (!empty($statements)) {
            parse_str($statements, $this->selectFields);
        }
        $this->selectTable = (string) $Query;
        $this->selectExecute();
    }

    /**
     * ************************************************
     * Informa quantos resultados que foram
     *   encontrados.
     * * @Return: (INT) Quantidade de registros
     * ************************************************
     */
    public function count() {
        return ($this->selectSyntax->rowCount());
    }

    /**
     * ************************************************
     * Informa os resultados que foram
     *   encontrados.
     * * @Return: (ARRAY/BOLL) Resultados em String/NULL
     * ************************************************
     */
    public function result() {
        if ($this->selectData) {
            return ($this->selectData);
        }
    }

    /**
     * ************************************************
     * Informa erros de consulta.
     * * @Return: (STRING/BOLL) Resultado em a partir
     *           de PDOException - String/NULL
     * ************************************************
     */
    public function error() {
        if (!empty($this->selectError)) {
            return ($this->selectError);
        }
    }

    /**
     * ************************************************
     * Constroi a Syntax para query.
     * - Altomaticamente detecta o uso de vinculos
     *    atribuitivos de resultado (LIMIT/OFFSET) e
     *    trata os mesmos como INTEGER.
     * ************************************************
     */
    private function selectConstruct() {
        if ($this->selectFields) {
            foreach ($this->selectFields as $type => $value) {
                if ($type == 'limit' || $type == 'offset') {
                    $value = (int) $value;
                }
                $this->selectSyntax->bindValue(":{$type}", $value, (is_int($value) ? PDO::PARAM_INT : PDO::PARAM_STR));
            }
        }
    }

    /**
     * ************************************************
     * Inicia a conexão e faz o Prepare Statements.
     * ************************************************
     */
    private function selectConnect() {
        $this->selectConn = parent::callConnect();
        $this->selectSyntax = $this->selectConn->prepare($this->selectTable);
        $this->selectSyntax->setFetchMode(PDO::FETCH_OBJ);
    }

    /**
     * ************************************************
     * Executa os métodos e obtem os
     *   resultados.
     * * @Return: (EXCEPTION) TRUE or FALSE
     * ************************************************
     */
    private function selectExecute() {
        $this->selectConnect();
        try {
            $this->selectConstruct();
            $this->selectSyntax->execute();
            $this->selectData = $this->selectSyntax->fetchAll();
        } catch (PDOException $error) {
            $this->selectData = null;
            $this->selectError = "Erro ao ler dados: {$error->getMessage()} {$error->getCode()}";
        }
    }

}

 

 

Usando:

Spoiler

<?php
defined('HOST') || define('HOST', 'localhost');
defined('USER') || define('USER', 'roo'); // Não seria root ?
defined('PASS') || define('PASS', '');
defined('DATA') || define('DATA', 'guia_mysql');

require 'Connect.php';
require 'Select.php';

$select = new Select();
$select->setQuery("SELECT * tbl_usuarios ORDER BY nome");
if ($select->count()) {
    /* Isso é só para depurar valores */
	echo ("Total de resultados: {$select->count()}");
    echo ("<pre>");
    var_dump($select->result());
    echo ("</pre>");
    /* **** */
    
    foreach ($select->result() as $value) { // Exibindo os resultados com formatação HTML
        echo ("<p>Nome: {$value->nome} | E-Mail: {$value->email}</p>");
    }

} else if ($select->error()) {
    echo ("Erro na conexão ou consulta!! Detalhes técnicos do erro: {$select->error()}");
} else {
    echo ("A consulta foi realizada com exito mas nenhum resultado encontrado");
}

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Prezado Omar,

Pelo visto Espírito Santo é o reduto dos programadores. Há anos estou aposentado e perdi o contato com um grande amigo e um excelente profissional da área de informática. Na época eu chefiava a seção de faturamento e cobrança de uma empresa pública e ele também funcionário da mesma empresa, residindo no seu Estado, mas no cargo de programador. Implantamos um sistema de faturamento. Foi nessa época que tive oportunidade de conhecer esse local maravilhoso. Lembro que ao chegar no hotel, de frente para praia, já encontrei caixas de bombons garoto. Depois da minha apresentação eles me levaram à noite em um bar chamado "Bar do Bigode". No dia seguinte almocei em um restaurante em Vila Velha, não lembro o nome, mas fica na subida de um morro. Dos janelões do restaurante dá para apreciar os navios de grande porte, pessoas acenando... Tudo muito bom. Que peixe!
Estou fora do foco do fórum. Perdão pessoal.
Bem, você postou uma apostila, um livro tudo muito bem comentado. Vou imprimir e estudar com muito prazer o que você postou.
Confesso que estou assustado, mas não vou desistir. Não tenho vergonha de informar, mas ainda não consegui criar o que desejo em PHP. Não pretendo criar sites para vendas, complexos, não sei nem o que falar, ou melhor, digitar. Cadastrar, Alterar, Excluir e Editar os registros já está ótimo. Abaixo você vai ver livros que não mostram esse meu desejo, mas comprei na esperança de “retirar” o          que me interessava. Depois vou dando continuidade e estudando mesmo que não venha a aplicar.    
Com vontade de aprender PHP observe o material que comprei, mas ainda não tive a satisfação de criar algo como já citei. Não gosto de chamar os projetos de “Simples”. Tudo é “simples”       quando você sabe. Tem muito isso em informática. Depois de tudo pronto chega um sujeito e diz: mas é “Simples” assim? Se é simples porque você não criou antes?  

Livros:

1)   Desenvolvimento Websites com PHP – Juliano Niederauer;

2)   Construindo uma Aplicação Web Completa em PHP e MySQL – William Pereira Alves;

3)   E-Commerce com PHP e MySQL – Larry Ullman;

4)   Aprendendo PHP – O’REILLY – David Sklar;

5)   PHP na prática – 200 exercícios resolvidos – Júlia Marques Carvalho da Silva.

Outros que também falam alguma coisa de PHP

6)   MySQL – Guia do Programador – André Milani;

7)   Criação Rápida de Sites Responsivo com o Bootstrap – Ricardo Queirós

Outros em eBook como por exemplo:

8)   PHP 7: Learn OOP, The Hard Way

 

 

Cursos:

1)   Ultimate PHP 2.0 - Revisado Para o PHP 7 – Beraldo;

2)   Curso de PHP, MySQLi e Bootstrap4 – celke

Deixo claro que nenhum livro ou curso tem culpa de não ter conseguido criar o que desejo até hoje.
O que acontece no meu ver no estudo de PHP é que cada um autor faz o melhor na visão dele para um grupo de usuários. E é impossível é claro de atender a todos. É aqui que eu entro. Os primeiros passos vão muito bem com os exercícios. Até que em um ponto ele pede para instalar um programa. Com isso sua máquina já tem, por exemplo, um Wampserver e o livro já pede outro (aqui eu entendo que vai ser tudo igual os scripts), já tem outro livro que o banco de dados é em SQLite (desenvolvido na linguagem C) e assim vai. Tenho experiência sair instalando tudo que os livros pedem. Aí chega a famigerada porta 80 que pede para mudar para 3077, essa e por sua vez para de funcionar outro programa e assim vai.

Bem Omar, você já reparou a minha vontade de aprender, daí fui para mais uma tentativa. Dessa vez no YouTube. Assisti uma aula onde foi possível construir algo que até antes não sabia, ou seja, foi possível cadastrar, alterar e excluir registros (tudo orientado a objeto).
A única fonte (Orientado a Objetos) que eu tenho que explica claramente como inserir registro em um banco de dados e imprimir é o que informei na última postagem, ou seja, da apostila do Beraldo. Contudo, eu sabia que estava listando os registros (da aula no youtube), mas tinha plena certeza que a conexão com o banco de dados...estava longe de se tratar de algo Orientado a Objetos. Sabia que estava errado, mas procurei mostrar mesmo errado para aprender com vocês. Cabe a pergunta - Mas com tudo que você tem você não sabe criar uma lista de registro voltado para Orientação a Objetos? A resposta é não, não sei.
Por favor, poderia me responder o seguinte:
Todos os scripts da minha postagem inicial, onde se concentra em uma página chamada index.php (Orientado a Objetos) estão corretos?
Se positivo tenho que estudar o que você, brilhantemente postou e dar continuidade para criar a lista.php (Orientado a Objetos). Correto?
  

     

Compartilhar este post


Link para o post
Compartilhar em outros sites

@TeixeiraRamos Pelo visto o que procuras é algo conhecido no popular como CRUD que são as 4 ações tomadas quando se trata de banco de dados (C = "create" / R = "read" / U = "update" / D = "delete").

 

Então não necessariamente estamos em OO, pois orientação a objeto é só um conceito da forma de programar leia mais em:

https://pt.wikipedia.org/wiki/Orientação_a_objetos

 

No mais estou lhe enviando uma MP para lhe apresentar um projeto meu que evidentemente seu código é orientado a objeto, e usa ações de manuseio de banco de dados, ou seja criar, ler, atualizar e apagar dados.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom dia Omar e a todos do fórum,

Estou lendo o que você sugeriu e ficarei aguardando a MP.

Contudo, creio que não consegui passar para você o que realmente estou desejando.

Desculpe Omar se estou passando dos limites, teimando...Não, não é essa a minha intenção.

Por favor, eu farei a pergunta e eu mesmo vou responder.

1)    Você já conseguiu criar algo com “popular como CRUD...”?
Resposta: Sim, conforme pode ser observado aqui: https://www.youtube.com/watch?v=mhdKMVCGAaY

Que tem como título: PHP OO do Jeito fácil de CRUD com Bootstrap - Parte 1;

2)    Você conseguiu concluir todas as aulas e o que o “curso” se propõe foi satisfatório?

Resposta: Sim. Consegui “povoar” o banco de dados, ou seja, “Cadastrar”, “Alterar” e “Excluir” registros. Sem problema (com a ajuda daqui do fórum).

3)    Você entendeu tudo com relação a “PHP OO do Jeito fácil de CRUD...”?

Resposta: Acompanhando as aulas entendi, mas gostaria de aprender mais, fazer outros exercidos.

4)    O que você deseja então com esses registros cadastrados através da criação de CRUD?

Resposta: Gostaria de poder “amostrar” esses registros cadastrado via CRUD, dentro de uma <div> ou <table>..., porém utilizando PHP 00.

5)    Você acredita que a sua postagem aproveitando um script da apostila do Beraldo pode ter confundido o Omar e outras pessoas do fórum?

Resposta: Sim. O que eu tenho de mais claro no momento é esse título, ou seja, “Exibindo dos Dados Usando MySQLi Orientado a Objetos”. Consegui colocar na tela os meus registros, eles foram listados, mas sabia que algo estava errado. Estava fazendo duas vezes a mesma coisa. Explique.

Se já tenho um arquivo config.php

<?php

define('HOST', 'localhost');

define('USER', 'root');

define('PASS', '');

define('BASE', 'phpoo');    

    

Para criar uma página lista.php com “SELECT * FROM tbl_usuarios”; tenho que fazer uma conexão nova? Então para que serve o config.php? Ele já não faz a conexão do banco?

6)    Então você acredita que o código da apostila do Beraldo, página 6 e 7, com o título “Exibindo os Dados Usando MySQLi Orientado a Objetos”, tem que ser trabalhado considerando o que você já tem no seu config.php e outros códigos?

Resposta: Sim. Acredito que tem que ser modificado o código considerando os meus códigos já existentes em config.php e quem sabe outros como CrudUser.php.

     

7)      Como você resumiria para concluir o que você deseja?

Resposta:  Como é claramente informado na aula “Exibindo dos Dados Usando MySQLi Orientado a Objetos” – “...trata-se do básico em Cadstrar, Alterar e Excluir...”, desejo aprender a criar uma página tipo listar.php, com um “SELECT * FROM tbl_usuarios”, considerando que já existem os código do “PHP OO do Jeito fácil de CRUD com Bootstrap - Parte 1. (postagem aqui dia 12 de novembro, com título " Não funciona os script para Alterar e Excluir registros " );

 

Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá gente!

Boa noite.

O que eu estava lutando consegui criar. Agora juntando os códigos postados 12 de novembro, com título " Não funciona os script para Alterar e Excluir registros "  e esse ultimo consegui concluir parte do que estava pensado em criar. Falta muita coisa.

Agora o arquivo lista.php edita os registros com o código PDO.

Como tinha pensado foi necessário inclusão de uma linha no código do config.php assim:

 

$conn = new PDO('mysql:host=' . HOST . ';dbname=' . BASE . ';', USER, PASS);

Somente assim foi possível Listar os registros do banco de dados com PHP e PDO.

Agora tenho um código da página index.php em PDO, onde Cadastra, Altera e Exclui registro.

E, dentro desse mesmo projeto o config.php faz a conexão para Listar os registros.

O código da página lista.php ficou assim:

<?php 
include_once '../classes/config.php';
?>

<!doctype html>
<html lang="pt-br">
<head>
	<meta charset="utf-8">
	<title>Teste Lista do phpoo</title>
	<meta name="viewport" content="width=device-width, initial-scale=1">
    
    <link href="../css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<div class="table-responsive" align="center">
    <h1>Lista de Registros Cadastrados</h1>
<?php

    //SQL para selecionar contatos os registros 
	$result_msg_cont = "SELECT * FROM tbl_usuarios ORDER BY nome ASC";
	
	//Selecionar os registros
     $resultado_msg_cont = $conn->prepare($result_msg_cont);
	 $resultado_msg_cont->execute();

echo "<table width='50%' border='1' cellpadding='3' cellspacing='0'>
		<thead>     
		        <tr align='center' bgcolor='#999999'>
					<td>Id</td>
					<td>Nome</td>
					<td>Email</td>
				</tr>
		</thead>
		<tbody>"; 	
	 	 
	while($row_msg_cont = $resultado_msg_cont->fetch(PDO::FETCH_ASSOC)){
		
		echo "<tr>
				<td>" .$row_msg_cont['id']    . "</td>
				<td>" .$row_msg_cont['nome']  . "</td>
				<td>" .$row_msg_cont['email'] . "</td>	
	         </tr>";
}
echo "</tbody>
</table>";
?>
</div>
</body>
</html>

Que tem o resultado:

Citar

Lista de Registros Cadastrados

Id Nome Email
4 Antônio Orientado Objeto antoniooo@terra.com.br
3 Carlos Vai Sair Bem da Silva carlosvsbs@gmail.com
10 Gilda Teste gilda@terra.com.br
1 João da Silva Teste joaot@terra.com.br
5 Mônica do Teste Certo monicadtc@terra.com.br
2 Maria dos Testes Ponto mariatestep@terra.com.br
6 Monique do Programa moniquedp@terra.com.br
8 Toledo da Ordem e Silva toledadaords@terra.com.br
7 Vera da Perseverança Grande e Silva veradapgs@terra.com.br
9 Zileide da Ordem Certa zeleideoc@terra.com.br

 

Muito obrigado.

Caso o código contenha algo para comentar por favor.

Tenho que estudar muito ainda.

 

 

 

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pessoal,

Eu não estou declarando a variável  ';dbname=' errada no config.php ?

 

<?php

define('HOST', 'localhost');
define('USER', 'root');
define('PASS', '');
define('BASE', 'phpoo');


$conn = new PDO('mysql:host=' . HOST . ';dbname=' . BASE . ';', USER, PASS);

Se positivo, como a Listas de Registros do Banco de Dados mostra os registros?

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.