2015-12-02 41 views
0

我可以连接到并在我的应用程序上查询我的数据库,但无法在本地服务器上查询。我知道它是正确的身份验证,因为如果我拼错用户或密码,我会得到一个访问被拒绝的错误。我的代码是:GAE - 本地服务器上的“连接失败:未知数据库”

<?php 
$servername = "173.194.xxx.xxx"; 
$username = "admin"; 
$password = "mypassw0rd"; 
$dbname = "dev"; 

// Create connection 
$conn = new mysqli(null, $username, $password, $dbname, null, "/cloudsql/myappname:mydbinstance"); 

// Check connection 
if ($conn->connect_error) { 
    die("Connection failed: " . $conn->connect_error); 
} 
?> 

将返回:

Warning: mysqli::mysqli(): (HY000/1049): Unknown database 'dev' in C:\Users\myusername\myfolder\dbconnect.php on line 9 
Connection failed: Unknown database 'dev' 

但它的罚款在线!有任何想法吗?

+0

btw,实例和db名称相同 - “dev” – Warren

回答

0

由于the docs说:“如果您的App Engine应用程序在Development Server中本地运行,则不要使用基于”/ cloudsql /“的连接字符串连接到Cloud SQL实例。

所以,"/cloudsql/myappname:mydbinstance"是很好,当你在Appspot上运行,但不你在开发服务器在本地运行:在这种情况下,它应该是云SQL实例的$servername(公网IP - 我假设的是真实数字而不是xxx,指出这一点仅仅是因为你正在设置,但没有在你的代码片段中使用它,所以不能确定你是否真的正确设置了它),然后按:3306指定端口。

+0

感谢Alex。我试过你的建议,但没有运气。我现在使用'$ conn = new mysqli(null,$ username,$ password,$ dbname,null,$ servername。“:3306/myappname:mydbinstance”);'。我也在'$ servername'之前尝试了一个斜杠并且没有端口号。有趣的是,拼写错误我的应用程序或实例名称给出了相同的错误,所以我不认为它连接到实例以确定“dev”不存在。任何其他想法? – Warren

+0

我做了一些研究,我意识到我的mysqli论点是错误的。这让我在本地工作:'$ conn = new mysqli($ servername,$ username,$ password,$ dbname,3306,“/”。$ servername。“/ myappname:mydbinstance”);' – Warren

0

这是一个可能的解决方案,但我不希望将其标记为答案,如果它不是最好的做法:

if($_SERVER["REMOTE_ADDR"]=="::1"){ 
    echo 'local'; 
    $conn = new mysqli($servername, $username, $password, $dbname, 3306, "/173.194.xxx.xxx/myappname:mydbinstance"); 
}else{ 
    $local = False; 
    echo 'app engine'; 
    $conn = new mysqli(null, $username, $password, $dbname, null, "/cloudsql/myappname:mydbinstance"); 
} 

基本上,我还不能使用相同的代码两种环境,使我为每个环境使用不同的连接字符串。

+0

使用不同的一般想法取决于环境的连接是正确的。但https://cloud.google.com/appengine/docs/php/cloud-sql/仅在非本地运行时提供6参数,当在本地运行时为4参数形式(我不确定权衡,抱歉)。 –

相关问题