Перенаправление не работает с облачным SQL
Я новичок в кодировании. PHP-код, сгенерированный моим автономным программным обеспечением, хорошо работает с localhost и mysql. Но после того, как он связался с облачным хранилищем стандартной среды Google App Engine, форма php не перенаправляет на страницу успеха. Хотя с облаком SQL данные формы успешно отправлены, но затем появляется пустой экран без изменения URL. Если используется localhost, страница успеха появляется после отправки формы. Чтобы адаптировать код для облака GAE sql, я вставил переменные $ mysql_port и $ mysql_Socket вручную, которых нет в исходном коде, который работал на localhost.
Код: -
<?php
if ($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_POST['formid']) && $_POST['formid'] == 'My-Form-Name')
{
$success_url = './success-page.html';
$error_url = './error-page.html';
$error = '';
$mysql_server = null;
$mysql_database = 'My-DB';
$mysql_table = 'My-Table';
$mysql_username = 'My-Username';
$mysql_password = 'My-Password';
$mysql_port = null;
$mysql_socket = '/cloudsql/CloudSql-Instance-Connection-Name';
$eol = "\n";
$db = mysqli_connect($mysql_server, $mysql_username, $mysql_password, $mysql_database, $mysql_port, $mysql_socket) or die('Failed to connect to database server!<br>'.mysqli_error($db));
mysqli_set_charset($db, 'utf8');
mysqli_query($db, "CREATE DATABASE IF NOT EXISTS $mysql_database");
mysqli_select_db($db, $mysql_database) or die('Failed to select database<br>'.mysqli_error($db));
mysqli_query($db, "CREATE TABLE IF NOT EXISTS $mysql_table (ID int(9) NOT NULL auto_increment, `DATESTAMP` DATE, `TIME` VARCHAR(8), `IP` VARCHAR(15), `BROWSER` TINYTEXT, PRIMARY KEY (id))");
foreach($form_data as $name=>$value)
{
mysqli_query($db ,"ALTER TABLE $mysql_table ADD $name VARCHAR(255)");
}
mysqli_query($db, "INSERT INTO $mysql_table (`DATESTAMP`, `TIME`, `IP`, `BROWSER`, `REFERER`)
VALUES ('".date("Y-m-d")."',
'".date("G:i:s")."',
'".$_SERVER['REMOTE_ADDR']."',
'".$_SERVER['SERVER_NAME'].$_SERVER['PHP_SELF']."',
'".$_SERVER['HTTP_USER_AGENT']."')")or die('Failed to insert data into table!<br>'.mysqli_error($db));
$id = mysqli_insert_id($db);
foreach($form_data as $name=>$value)
{
mysqli_query($db, "UPDATE $mysql_table SET $name='".mysqli_real_escape_string($db, $value)."' WHERE ID=$id") or die('Failed to update table!<br>'.mysqli_error($db));
}
mysqli_close($db);
header('Location: '.$success_url);
exit;
}
Страницы успеха и ошибки являются внутренними страницами проекта. App yaml имеет следующий обработчик:
# TO serve static
- url: /(.*\.(html$|css$|js$|svg$|))
static_files: \1
upload: (.*\.(html$|css$|js$|svg$))
application_readable: true
# to serve all php scripts
- url: /(.+\.php)$
script: \1
Как успешно перенаправить на success-page.html после отправки формы с облаком SQL? Кроме того, страница успеха может быть страницей.php или страницей.html?
После первой помощи, приведенной ниже, было обнаружено, что Redirect или Cloud SQL работают одновременно. Если мы удаляем облачную часть sql, Redirect работает и если мы игнорируем часть Redirect, Cloud SQL успешно помещает данные в таблицу, но затем не перенаправляет. Здесь я специально называю Cloud SQL, потому что Redirect работает с MySQL на localhost. Пожалуйста, помогите подробнее о том, как перенаправить страницу php с облачной формой sql.
Заранее спасибо.
2 ответа
Пустая страница означает, что php обнаружил ошибку во время выполнения. В вашем случае это может быть несколько вещей:
- недостающие права SQL для создания таблицы
- отсутствуют SQL-права для изменения таблицы
- недостающие права sql для вставки / обновления
- mysqli не загружается на вашем сайте
- и т.п.
Кроме того, эта строка должна вызвать синтаксическую ошибку:
header('Location: './$success_url);
Должно быть так:
header('Location: /'.$success_url);
Или это также может быть так (как кажется, стиль двойных кавычек):
header("Location: /$success_url");
Чтобы точно выяснить, что пошло не так, у вас есть две возможности:
- включить шоу ошибки в php.ini
- посмотрите на ваш журнал ошибок на вашем сервере
Вам также может не понадобиться начальная косая черта в вашей команде заголовка перенаправления.
Изменить: Из-за комментариев ниже, вопросник нуждается в дополнительной помощи, чтобы решить эту проблему:
- Старайтесь не создавать схему базы данных каждый раз, когда вы открываете соединение с ней. Выполните эту задачу извне и примите в своем скрипте, что база данных уже существует. Большинство провайдеров не поддерживают создание базы данных. В основном вам нужно делать это через веб-интерфейс, который предоставляется вам вашим провайдером. Итак, в вашем случае Google Cloud SQL.
- Старайтесь не изменять таблицу каждый раз, когда вы ее используете. Это не имеет смысла. Я думаю, что у вас есть одна и та же форма HTML каждый раз. Итак, было бы лучше создать столбцы для всех полей формы HTML один раз. В противном случае вы могли бы использовать сериализованную форму представления данных в форме HTML (например, команду PHP serialize, или для лучшей читаемости и использования в других языках используйте json_encode).
Благодаря поддержке здесь и везде я научился читать и понимать журналы ошибок в App Engine. В моем коде было 3 пробела:
1-й был в yaml, в котором отсутствовал обработчик URL. Я скопировал это из документации GAE на yaml.
2nd была одна скрытая переменная в форме php. Это было для получения имени пользователя из данных сеансов. Я удалил эту переменную. а также
3-я ошибка заголовка уже отправлена. Я использовал функции $File и $Line, чтобы узнать, куда они были отправлены первыми. Журнал показал, что он был отправлен в строке 1. Я не смог найти причину. Хотя в php-скрипте не было эха или печати в строке 1. Хотя HTML был ниже кода PHP, но это началось с <!doctype html>
, Я старался ob_start()
а также OB-flush()
, Я также использовал exit
должным образом. После нескольких вариаций If-Else я наконец заменил header('Location: '.$success_url);
функция с Meta Refresh, которая является echo "<META http-equiv='refresh' content='0;URL=success_url'>";
И ЭТО РАБОТАЕТ:)
Вся помощь сообщества stackru, включая @alpham8, очень ценится.