Я использую MySQL 8.0 и php 7.3.0
Я предоставил полные разрешения для 'user_insert_'@'127.0.0.1', и я могу нормально запустить следующий оператор SELECT из pymysql и MySQL Workbench, но не через PDO в php:
"SELECT * FROM worker_status"
Я получаю следующее сообщение об ошибке:
Fatal error: Uncaught PDOException: SQLSTATE[42000]: Syntax error or access violation: 1142 SELECT command denied to user 'user_insert_'@'localhost' for table 'worker_status' in C:\xampp\htdocs\hud\test_api_2\objects\activity.php:33
Я ожидал получить ответ в одну строку.
Я уже модифицировал пользователя MySql для использования собственных паролей, используя следующую строку:
ALTER USER user_insert_ IDENTIFIED WITH mysql_native_password BY 'password123';
Эта модификация является решением, указанным здесь: phpMyAdmin в MySQL 8.0 (Также решение, из которого этот поток отмечен как дубликат)
Вот соответствующий код:
class Database{
private $host = "127.0.0.1";
private $db_name = "hud";
private $username = "user_insert_";
private $password = "password123";
private $charset = 'utf8mb4';
private $dsn = "";
public $conn;
public function getConnection(){
$this->conn = null;
$this->dsn = "mysql:host=$this->host;dbname=$this->db_name;charset=$this->charset";
print($this->dsn);
$this->options = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false,
];
try {
$this->conn = new PDO($this->dsn, $this->username, $this->password, $this->options);
} catch (\PDOException $e) {
throw new \PDOException($e->getMessage(), (int)$e->getCode());
}
return $this->conn;
}
public function __construct($db){
$this->conn = $db;
}
function read(){
$query = "SELECT * FROM worker_status";
$stmt = $this->conn->prepare($query);
$stmt->execute();
$result = $stmt->fetch();
return $stmt;
}
Я проверил:
Мне это показалось довольно ванильным случаем. Почему я получаю ошибку разрешения 1142 SELECT исключительно с php PDO?
@GMB Я использовал private $host = "127.0.0.1"; в качестве переменной в моей строке подключения (не localhost), но просто попытался перезаписать переменную в строке подключения следующим образом: $this->dsn = "mysql:host=127.0.0.1;dbname=$this->db_name;charset=$this->charset"; Любая версия дает мне исходную ошибку.
Измените хост-часть пользователя с 127.0.0.1 на localhost.
@Shadow после модификации private $host = "localhost"; я получаю ошибку: <b>Fatal error</b>: Uncaught PDOException: SQLSTATE[HY000] [2054] The server requested authentication method unknown to the client in C:\xampp\htdocs\hud\test_api_2\config\database.php:26
Если вы получили сообщение об ошибке, пожалуйста, выполните поиск по нему, потому что очень вероятно, что он уже имеет ответ. См. stackoverflow.com/questions/49948350/phpmyadmin-on-mysql-8-0
@Shadow Вы хорошо замечаете, и я ожидал, что вас подтолкнут к этому решению. Я уже реализовал найденное там решение и другие похожие темы, которые я попытался выделить в своем последнем пункте. Я постараюсь сделать это лучше, чтобы прояснить это для будущих вопросов.






В сообщении об ошибке отображается
'user_insert_'@'localhost', а в вашем вопросе упоминается'user_insert_'@'127.0.0.1'; попробуйте изменить строку подключения на хост127.0.0.1