我正在尝试通过 PDO 从我的 EC2 实例连接到我的 MySQL RDS 实例。但是,控制台(在所有浏览器上)显示"状态 500"错误。这是我的代码(checkit.php),取自他们的教程:
<?php
$error = 0;
try {
$dbhost = $_SERVER['RDS_HOSTNAME'];
$dbport = $_SERVER['RDS_PORT'];
$dbname = $_SERVER['RDS_DB_NAME'];
$dsn = "mysql:host={$dbhost};port={$dbport};dbname={$dbname}";
$username = $_SERVER['RDS_USERNAME'];
$password = $_SERVER['RDS_PASSWORD'];
$dbh = new PDO($dsn, $username, $password);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
}
catch (Exception $e){$error = $e->getMessage();}
echo $error;
?>
删除行$dbh = new PDO($dsn, $username, $password);
(以及涉及$dbh
的其他行删除错误 500 警告,所以我知道这与 PDO 语句有关。
我已经搜索了一段时间,似乎重复的问题对我没有帮助:
- PHP 肯定已安装:bash
php --version
和 5.6.17 打印。 - PDO预装在这个版本的PHP中(我相信,但我还没有测试过这个)
- 我可以通过SSH连接到数据库,这意味着
- 凭据正确
- 安全组设置正确
上面的PHP代码是使用这个的AJAX:
$('#user').on('submit', function(e) {
e.preventDefault();
$.ajax({
url: "checkit.php",
type: "POST",
data: $(this).serialize(),
success: function(data) {
errors = data;
}
});
});
而这个形式(简化):
<form id="user" action="" method="POST" target="_self" autocomplete="on" novalidate>
<input name="create" type="checkbox">
<button type="sumbit" name="submit">Submit</button>
</form>
导航到http://<ip address>/checkit.php
返回错误 500 状态,所以我怀疑这与 AJAX 有任何关系,但尽管如此,我还是发布了代码以防万一。
关于从哪里开始的任何想法?
这是由于PDO使用与RDS服务器不同的连接方法,默认情况下,系统中不允许这样做。运行以下命令应该可以修复它:
setsebool -P httpd_can_network_connect=1
PDO实际上存在一些问题。我在数据库中创建了一个新用户,并拥有它的所有权限。使用这些登录凭据后,我能够连接到数据库。
顺便说一句,你不能盛大所有特权 GRANT ALL PRIVILEGES ON * . * TO 'dbuser'@'111.11.111.11';
这样的。它给ERROR 1045 (28000): Access denied for user 'dbadmin'@'%' (using password: YES)
而是授予以下权限:
GRANT SELECT ON * . * TO 'dbuser'@'111.11.111.11';
所有特权:SELECT
、INSERT
、DELETE
、UPDATE
、ALTER
、CREATE
参考文献 : https://www.technlg.net/aws/create-mysql-user-aws-rds/, https://stackoverflow.com/a/46589327/8255365