我正在尝试做一些测试,我正在使用MAMP并试图连接到我的服务器上的SQL数据库。我以前没有使用过PDO,并且很难确定错误代码的含义。我得到这个:
SQLSTATE[HY000] [2003] Can't connect to MySQL server on 'hostname' (60)
My connection function:
function getConnection() {
$dbhost="hostname";
$dbuser="user";
$dbpass="password";
$dbname="somedb";
$dbh = new PDO("mysql:host=$dbhost;dbname=$dbname", $dbuser, $dbpass);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
return $dbh;
}
我试图执行查询的地方:
function getTypes() {
$sql = "SELECT id, name FROM type";
try {
$db = getConnection();
$stmt = $db->query($sql);
$types = $stmt->fetchAll(PDO::FETCH_OBJ);
$db = null;
echo '{"wine": ' . json_encode($types) . '}';
} catch(PDOException $e) {
echo '{"error":{"text":'. $e->getMessage() .'}}';
}
echo 'getTypes';
}
编辑:我可以使用相同的凭据与mysqli连接。
这是安全问题。为了避免数据库被淹没或被垃圾填充,配置设置说"只有本地ip可以访问数据库"。所有的共享主机都这样做,如果你有一个专用的服务器,这是一个很好的做法。
在Linux的/var/mysql/my.conf中,你会得到这样的内容:
skip-external-locking
# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
bind-address = 127.0.0.1
mysql服务器要么监听本地unix套接字,要么绑定到localhost (127.0.0.1
)。请确保mysql服务器正在监听hostname
的外部IP地址。
注意:连接用户(这里的user
)必须从您的客户端IP访问数据库(somedb
) (GRANT
);
您连接到正确的端口吗?
$dbh = new PDO("mysql:host=$dbhost;port=PORT;dbname=$dbname", $dbuser, $dbpass);
如果运行PHP脚本的服务器是运行SQL server的服务器,则不需要使用hostname
连接,需要引用本地系统。在你的配置中,hostname
不会解析到一个有效的SQLServer的IP,如果你引用localhost
,它会引用正在运行的服务器本身,并连接它需要的方式。您可以使用以下任意一种:
localhost
|| 127.0.0.1