Я учусь использовать Google Cloud SQL и пытаюсь подключиться к базе данных с помощью PHP. Я следую за Инструкции Google здесь.
Я создал 3 файла (guestbook.php
, sign.php
, а также app.yaml
) и скопировал код, представленный в статье. Для подключения к базе данных я использовал PDO_MySQL
вариант.
В guestbook.php
а также sign.php
, в if
Скажите: я заменил <your-project-id>
а также <your-instance-name>
по мере необходимости. Я оставил ''
для пароля пусто.
В guestbook.php
а также sign.php
, в else
Скажите: я заменил 127.0.0.1
а также <password>
по мере необходимости. Я оставил 3306
как есть.
В app.yaml
: Я заменил <your-application-name>
по мере необходимости.
Затем я сохранил 3 файла в локальном каталоге, а затем развернул его, используя GoogleAppEngineLauncher
,
Когда я загрузил первую страницу, все выглядело нормально. Я набрал что-то и нажал Submit
, Затем я был перенаправлен на страницу /guestbook
, но потом было сказано:
Error: Not Found
The requested URL /guestbook was not found on this server.
Я очень новичок в веб-приложениях и PHP в целом. Я понятия не имею, что это сообщение об ошибке просит меня сделать. Я уже загрузил файлы на сервер Google с помощью панели запуска приложений. Я уверен, что внимательно следовал инструкциям.
Некоторые вещи, которые я пытался сделать:
В guestbook.php
а также sign.php
Я заполнил ''
с соответствующим паролем.
В guestbook.php
а также sign.php
Я удалил по умолчанию 3306
,
В guestbook.php
а также sign.php
Я удалила if
заявление и использовал только содержание else
заявление.
В app.yaml
: Я добавил -url: /guestbook
,
В guestbook.php
а также sign.php
Я перешел с PDO_MySQL
в mysqli
,
Ни одна из вышеперечисленных попыток ничего не сделала для решения проблемы. Попытки 1 также привели к сообщению Unable to connect.
,
РЕДАКТИРОВАТЬ:
В sign.php
, Я изменился header('Location: '."/guestbook");
в header('Location: '."/");
, Это, кажется, избавилось от URL not found
ошибка, но кажется, что ничего в моей базе данных не изменяется. PHP ничего не делает для изменения базы данных.
Что я делаю неправильно? Как я могу решить эту проблему и подключиться, прочитать и написать в моей базе данных?
Догадаться. Их PHP-код гостевой книги сломан, прост и понятен. Они пытаются выполнить перенаправление (используя заголовок Location) после того, как они уже выдают теги и, что недопустимо.
В результате, если вы не вошли в систему, код предполагаемый чтобы перенаправить вас на страницу входа, но это не так. И затем, когда вы пытаетесь опубликовать в гостевой книге, «$ user» имеет значение null, поэтому страница не работает.
О, да, и страница sign.php перенаправляет в / guestbook, который вы правильно определили, не существует. И он перенаправляет вверх в коде sign.php, что, очевидно, заставит код впоследствии ничего не делать. Вот некоторый фиксированный код.
Guestbook.php:
<?php
use google\appengine\api\users\User;
use google\appengine\api\users\UserService;
$user = UserService::getCurrentUser();
if ($user === null) {
header('Location: ' . UserService::createLoginURL($_SERVER['REQUEST_URI']));
}
?>
<html>
<body>
<h2>Guestbook Entries</h2>
<?php
// Create a connection.
echo 'Hello, ' . htmlspecialchars($user->getNickname()) . '<br>';
$db = null;
if (isset($_SERVER['SERVER_SOFTWARE']) &&
strpos($_SERVER['SERVER_SOFTWARE'],'Google App Engine') !== false) {
// Connect from App Engine.
try{
$db = new pdo(mysql:unix_socket=/cloudsql/<your-project-id>:<your-instance-name>;dbname=guestbook', 'root', '');
}catch(PDOException $ex){
die(json_encode(
array('outcome' => false, 'message' => 'Unable to connect.')
)
);
}
} else {
// Connect from a development environment.
try{
$db = new pdo('mysql:host=127.0.0.1:3306;dbname=guestbook', 'root', '<password>');
}catch(PDOException $ex){
die(json_encode(
array('outcome' => false, 'message' => 'Unable to connect')
)
);
}
}
try {
// Show existing guestbook entries.
foreach($db->query('SELECT * from entries') as $row) {
echo "<div><strong>" . $row['guestName'] . "</strong> wrote <br> " . $row['content'] . "</div>";
}
} catch (PDOException $ex) {
echo "An error occurred in reading or writing to guestbook.";
}
$db = null;
?>
<h2>Sign the Guestbook</h2>
<form action="/sign" method="post">
<div><textarea name="content" rows="3" cols="60"></textarea></div>
<div><input type="submit" value="Sign Guestbook!!"></div>
</form>
</body>
</html>
И sign.php
<?php
use google\appengine\api\users\User;
use google\appengine\api\users\UserService;
$user = UserService::getCurrentUser();
if (!$user) {
die("Not logged in");
}
$db = null;
if (isset($_SERVER['SERVER_SOFTWARE']) &&
strpos($_SERVER['SERVER_SOFTWARE'],'Google App Engine') !== false) {
// Connect from App Engine.
try{
$db = new pdo('mysql:unix_socket=/cloudsql/<your-project-id>:<your-instance-name>;dbname=guestbook', 'root', '');
}catch(PDOException $ex){
die(json_encode(
array('outcome' => false, 'message' => 'Unable to connect.')
)
);
}
} else {
// Connect from a development environment.
try{
$db = new pdo('mysql:host=127.0.0.1:3306;dbname=guestbook', 'root', '<password>');
}catch(PDOException $ex){
die(json_encode(
array('outcome' => false, 'message' => 'Unable to connect')
)
);
}
}
try {
if (array_key_exists('content', $_POST)) {
$stmt = $db->prepare('INSERT INTO entries (guestName, content) VALUES (:name, :content)');
$stmt->execute(array(':name' => htmlspecialchars($user->getNickname()), ':content' => htmlspecialchars($_POST['content'])));
$affected_rows = $stmt->rowCount();
// Log $affected_rows.
}
} catch (PDOException $ex) {
// Log error.
}
$db = null;
header('Location: '."/");
?>
Других решений пока нет …