Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

[Dúvida] Erro em Select em banco Oracle

Para deixar claro, eu optei por usar um banco Oracle, por estar estudando ele esses ultimos tempos, detalhes conexão:

<?php

header('Access-Control-Allow-Origin: *');
$tns = "
(DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = xe)
    )
  )
       ";
try {
    $pdo = new PDO("oci:dbname=".$tns, 'cafe', 'cafe');
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

} catch(PDOException $e) {
    echo 'ERROR AT LINE ' . $e->getLine() . PHP_EOL . $e->getMessage() . PHP_EOL;
}

Ao tentar realizar o Select no meu arquivo Index.php sem filtro WHERE, todos os caracteres armazenados com acento no banco são retornados com ? no lugar do acento:

<?php

require_once 'src/conexao-bd.php';

$produtosCafe = $pdo->query("SELECT * FROM produtos")->fetchAll(PDO::FETCH_ASSOC);

Exemplo: Insira aqui a descrição dessa imagem para ajudar na acessibilidade

E ao tentar realizar o Select com o filtro WHERE:

$produtosCafe = $pdo->query("SELECT * FROM produtos WHERE tipo = 'Café'")->fetchAll(PDO::FETCH_ASSOC);

Nada é retornado para a var $produtosCafe. Acredito que por erro de char set também. Quem souber como resolver me ajuda por favor.

2 respostas
solução!

Olá, Vinicius!

Pelo que entendi, você está enfrentando um problema com a codificação de caracteres ao realizar consultas no banco de dados Oracle. Isso pode ser devido ao conjunto de caracteres do cliente não estar configurado corretamente.

No PHP, você pode definir o conjunto de caracteres do cliente usando a função oci_client_charset do Oracle. Porém, como você está usando o PDO, você pode tentar definir o conjunto de caracteres na string de conexão.

Aqui está um exemplo de como você pode fazer isso:

$tns = "
(DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = xe)
    )
  )
       ";
try {
    $pdo = new PDO("oci:dbname=".$tns.";charset=AL32UTF8", 'cafe', 'cafe');
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

} catch(PDOException $e) {
    echo 'ERROR AT LINE ' . $e->getLine() . PHP_EOL . $e->getMessage() . PHP_EOL;
}

No exemplo acima, AL32UTF8 é o conjunto de caracteres Unicode do Oracle. Isso deve resolver o problema com acentos e outros caracteres especiais.

Lembre-se de verificar se o conjunto de caracteres do seu banco de dados Oracle é compatível com AL32UTF8. Você pode fazer isso executando a seguinte consulta SQL no seu banco de dados Oracle:

SELECT value$ FROM sys.props$ WHERE name = 'NLS_CHARACTERSET';

Espero ter ajudado e bons estudos!

DEU CERTO!!! Que sabedoria desbalanceada, obrigado demais!