Estou executando o Ubuntu 22.04, nginx 1.18.0, mariadb 15.1 e PHP 8.1.2. Aqui está o código do meu database.php
:
<?php
$SERVER_APP = "localhost";
$DATABASE_APP = "mydb";
$USERNAME_APP = "root";
$PASSWORD_APP = "password";
function db_connect() {
global $SERVER_APP, $DATABASE_APP, $USERNAME_APP, $PASSWORD_APP;
try {
$dbApp = new PDO("mysql:host=$SERVER_APP;dbname=$DATABASE_APP", $USERNAME_APP, $PASSWORD_APP);
$dbApp->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$dbApp->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
echo "Connected to db";
return $dbApp;
} catch (PDOException $e) {
echo $e->getMessage();
}
}
se eu executar este código a partir da linha de comando:
php -r "require 'database.php'; db_connect();"
funciona bem:
Conectado ao banco de dados
E também posso conectar ao banco de dados SQL usando:
mysql -u root -p
e inserindo a mesma senha. Mas quando a função acima é chamada de um script PHP, assim samples.php
:
<?php header("Access-Control-Allow-Origin: *");
header("Content-type: application/json");
require 'database.php';
ini_set('display_errors', 1);
error_reporting(E_ALL);
$dbApp = db_connect();
$stmt = $dbApp->prepare("SELECT * FROM sensors WHERE sampled > (now() - interval 24 hour) ORDER BY sampled;");
$stmt->execute();
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);
echo json_encode($results);
$dbApp = null;
que, por sua vez, é chamado de index.php
:
// url = 'samples.php'
function get_samples(url) {
fetch(window.location.protocol + "//" + window.location.hostname + ":3001" + url, {
method: "GET",
headers: {
"Content-Type": "application/json"
},
})
.then(response => response.text())
.then(text => {
// do something
})
.catch(error => console.error(error))
}
a conexão com o banco de dados falha:
SQLSTATE[HY000] [1698] Acesso negado para o usuário 'root'@'localhost'
Claro que o banco de dados está no mesmo servidor, ou seja, localhost
. O que poderia causar o erro de acesso negado se o mesmo script estiver funcionando quando chamado manualmente do console?
mariadb 15.1 tem certeza?
O problema que você está enfrentando provavelmente está relacionado à maneira como o usuário root do MySQL está configurado para autenticar no Ubuntu. Por padrão, em sistemas Ubuntu, o usuário root do MySQL geralmente usa autenticação baseada em soquete em vez de autenticação baseada em senha quando acessado da máquina local. Isso significa que quando você se conecta usando a linha de comando, o sistema autentica o usuário como root com base na sessão de login do sistema operacional, sem precisar de uma senha.
Entretanto, quando o script PHP é executado por meio de um servidor web (como Nginx ou Apache), ele não é autenticado por meio do soquete e, portanto, não consegue autenticar com a senha que você forneceu.
Em vez de usar o usuário root, o que não é recomendado para aplicativos web, crie um novo usuário MySQL específico para seu aplicativo e conceda a ele as permissões necessárias.