我正在尝试进行一些测试,我正在使用MAMP并尝试连接到我服务器上的SQL数据库。我以前没有使用过PDO,很难跟踪错误代码的含义。我得到了这个:
SQLSTATE[HY000] [2003] Can't connect to MySQL server on 'hostname' (60)
我的连接功能:
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相同的凭据进行连接。
答案 0 :(得分:1)
您的mysql服务器正在侦听本地unix socket 或绑定到 localhost (127.0.0.1
)。确保mysql服务器正在侦听hostname
的外部IP地址。
注意:连接用户(此处为user
)必须具有来自您的客户端IP(GRANT
)的访问权限(somedb
);
答案 1 :(得分:1)
这是一个安全问题。为避免您的数据库泛滥或充满垃圾,配置设置说“只有本地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
答案 2 :(得分:0)
您是否正在连接到正确的端口?
$dbh = new PDO("mysql:host=$dbhost;port=PORT;dbname=$dbname", $dbuser, $dbpass);
答案 3 :(得分:0)
如果运行PHP脚本的服务器是运行SQL Server的服务器,则不需要使用hostname
连接,需要引用本地系统。您在配置中拥有的内容hostname
无法解析为有效SQLServer的IP,如果您引用localhost
,它将引用正在运行的服务器本身,并连接它所需的方式。您可以使用以下任一方法:
localhost
|| 127.0.0.1