2015-12-02 3 views
0

Я могу подключиться к моему db в своем приложении и запросить его у меня, но я не могу на своем локальном сервере. Я знаю, что он правильно аутентифицирован, потому что, если я пропущу пользователя или пароль, я получаю ошибку отказа в доступе. Мой код: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 скажите: «Вы не используете строку соединения«/cloudsql/»для подключения к экземпляру Cloud SQL, если приложение App Engine работает локально на сервере разработки».

Так, "/cloudsql/myappname:mydbinstance" прекрасно, когда вы работаете на appspot, но не, когда вы работаете локально на сервере разработки: в этом случае, она должна быть $servername (общественность IP экземпляра Cloud SQL - Я предполагаю, что с реальными числами, а не с 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-аргументной формы при запуске локально (я не уверен в компромиссы, извините). –

Смежные вопросы