Я пытаюсь создать основную страницу регистрации учетной записи для веб-сайта с использованием Heroku. Я установил PostGRESQL и создал таблицу с именами пользователей со всеми соответствующими столбцами. (Я еще не использовал шифрование, так как я просто пытаюсь получить эту работу в первую очередь.) Вот мой PHP для страницы:
<?php
require('../vendor/autoload.php');
require('../includes/config.php');
$app = new Silex\Application();
$app['debug'] = true;
// Register the monolog logging service
$app->register(new Silex\Provider\MonologServiceProvider(), array(
'monolog.logfile' => 'php://stderr',
));
// Register the Twig templating engine
$app->register(new Silex\Provider\TwigServiceProvider(), array(
'twig.path' => __DIR__.'/../views',
));
/*checking database*/
// if form was submitted
if ($_SERVER["REQUEST_METHOD"] == "POST")
{
/**/
//check that all three fields have been filled out
if (empty($_POST["username"])||empty($_POST["password"])||empty($_POST["confirmation"]))
{
apologize("You need to complete the username, password, and confirmation fields.");
exit;
}
//check that password and confirmation are the same
if ($_POST["password"] != $_POST["confirmation"])
{
apologize("Password and confirmation must match.");
exit;
}
if (!filter_var($_POST["email"], FILTER_VALIDATE_EMAIL) )
{
apologize("Email address not valid. Try again.");
exit ;
}
// Register the Postgres database add-on
$dbopts = parse_url(getenv('DATABASE_URL'));
$app->register(new Herrera\Pdo\PdoServiceProvider(),
array (
'pdo.dsn' => 'pgsql:dbname='.ltrim($dbopts["path"],'/').';host='.$dbopts["host"],
'pdo.port' => $dbopts["port"],
'pdo.username' => $dbopts["user"],
'pdo.password' => $dbopts["pass"]
)
);
$st = $app['pdo']->prepare('INSERT INTO users (username, email, hash) VALUES ('. $_POST["username"] . ', ' . $_POST["email"]. ', '. $_POST["password"]. ')');
$st->execute();
$app->get('/db/', function() use($app) {
$st = $app['pdo']->prepare('SELECT username FROM users');
$st->execute();
$names = array();
while ($row = $st->fetch(PDO::FETCH_ASSOC)) {
$app['monolog']->addDebug('Row ' . $row['name']);
$names[] = $row;
}
return $app['twig']->render('database.twig', array(
'names' => $names
));
});
$app->get('/twig/{name}', function($name) use($app) {
return $app['twig']->render('index.twig', array(
'name' => $name,
));
});
$app->run();
//if the registration worked, log the user in
if ($result !== false)
{
//if registration worked, remember that session ID
$rows = query("SELECT LAST_INSERT_ID() AS id");
$id = $rows[0]["id"];
$_SESSION["id"] = $id;
redirect("../index.php");
}
}
else
{
// else render form
render("register_form.php", ["title" => "Register"]);
}
?>
При отправке страницы я получаю следующие ошибки:
Извините, страница, которую вы ищете, не найдена. 2/2 NotFoundHttpException в строке RouterListener.php 145: маршрут "POST/" не найден (из " http://secret-ridge-6332.herokuapp.com/register.php ")
in RouterListener.php line 145
at RouterListener->onKernelRequest(object(GetResponseEvent), 'kernel.request', object(EventDispatcher))
at call_user_func(array(object(RouterListener), 'onKernelRequest'), object(GetResponseEvent), 'kernel.request', object(EventDispatcher)) in EventDispatcher.php line 164
at EventDispatcher->doDispatch(array(array(object(RouterListener), 'onKernelRequest'), array(object(LocaleListener), 'onKernelRequest'), array(object(LogListener), 'onKernelRequest'), array(object(MiddlewareListener), 'onKernelRequest')), 'kernel.request', object(GetResponseEvent)) in EventDispatcher.php line 53
at EventDispatcher->dispatch('kernel.request', object(GetResponseEvent)) in HttpKernel.php line 126
at HttpKernel->handleRaw(object(Request), '1') in HttpKernel.php line 66
at HttpKernel->handle(object(Request), '1', true) in Application.php line 538
at Application->handle(object(Request)) in Application.php line 515
at Application->run() in register.php line 72
1/2 ResourceNotFoundException в строке UrlMatcher.php 96:
in UrlMatcher.php line 96
at UrlMatcher->match('/') in RedirectableUrlMatcher.php line 30
at RedirectableUrlMatcher->match('/') in LazyUrlMatcher.php line 51
at LazyUrlMatcher->match('/') in RouterListener.php line 127
at RouterListener->onKernelRequest(object(GetResponseEvent), 'kernel.request', object(EventDispatcher))
at call_user_func(array(object(RouterListener), 'onKernelRequest'), object(GetResponseEvent), 'kernel.request', object(EventDispatcher)) in EventDispatcher.php line 164
at EventDispatcher->doDispatch(array(array(object(RouterListener), 'onKernelRequest'), array(object(LocaleListener), 'onKernelRequest'), array(object(LogListener), 'onKernelRequest'), array(object(MiddlewareListener), 'onKernelRequest')), 'kernel.request', object(GetResponseEvent)) in EventDispatcher.php line 53
at EventDispatcher->dispatch('kernel.request', object(GetResponseEvent)) in HttpKernel.php line 126
at HttpKernel->handleRaw(object(Request), '1') in HttpKernel.php line 66
at HttpKernel->handle(object(Request), '1', true) in Application.php line 538
at Application->handle(object(Request)) in Application.php line 515
at Application->run() in register.php line 72
Любые идеи, что я могу делать неправильно? Спасибо!
Да, вы смешиваете свой старый способ программирования с использованием Silex.
В общем, вы $app->get('/someroute', function(Request $request) {... });
для ответа на запросы GET с кодом для этого маршрута "/someroute" внутри функции и $app->post()
для запросов POST. Вы НЕ используете $_GET
, $_POST
т.д., Но вместо этого используете объект запроса, переданный этим функциям контроллера, для доступа к данным запроса.
Пожалуйста, ознакомьтесь с некоторыми учебными материалами Silex и основным руководством Silex, чтобы узнать больше.
Я попытался немного приукрасить ваше приложение и дал ему индексную страницу, маршрут формы входа и обработчик POST, а также путь к форме регистрации и обработчик POST. Пожалуйста, используйте подготовленные заявления со связанными параметрами, чтобы защитить себя от SQL-инъекции, и, пожалуйста, не храните пароли в обычном тексте в базе данных, а crypt()
их правильно, используя BCrypt.
<?php
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
require __DIR__.'/../vendor/autoload.php';
$app = new Silex\Application();
$app->register(new Silex\Provider\MonologServiceProvider(), [
'monolog.logfile' => 'php://stderr',
]);
$app->register(new Silex\Provider\TwigServiceProvider(), array(
'twig.path' => __DIR__.'/../views',
));
$dbopts = parse_url(getenv('DATABASE_URL'));
$app->register(new Herrera\Pdo\PdoServiceProvider(), array(
'pdo.dsn' => sprintf('pgsql:dbname=%s;host=%s;port=%s', ltrim($dbopts["path"],'/'), $dbopts["host"], $dbopts["port"]);
'pdo.username' => $dbopts["user"],
'pdo.password' => $dbopts["pass"],
'pdo.options' => array(\PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION),
));
$app->get('/', function(Request $request) use($app) {
// your index code goes here, maybe render index.html.twig:
return $app['twig']->render('index.html.twig');
});
$app->get('/login', function(Request $request) use($app) {
// render login form here
return $app['twig']->render('login.html.twig');
});
$app->post('/login', function(Request $request) use($app) {
$email = $request->request->get('email');
$password = $request->request->get('password');
// try to log in here
$s = $app['pdo']->prepare('SELECT * FROM users WHERE email = :email');
if($s->execute(array(':email' => $email))) {
$u = $s->fetch();
// compare crypted password to stored hash, constant time and all
// the hash acts as the salt at the same time, clever stuff
if(!password_verify($password, $u['password'])) {
// password wrong
} else {
// login okay
}
} else {
// no such user
}
});
$app->get('/register', function(Request $request) use($app) {
// render registration form here
return $app['twig']->render('register.html.twig');
});
$app->post('/register', function(Request $request) use($app) {
$email = $request->request->get('email');
// hash password using bcrypt (safe "2y" algorithm, cost factor 10, random salt)
$password = password_hash($request->request->get('password'), PASSWORD_BCRYPT);
$s = $app['pdo']->prepare('INSERT INTO users (email, password) VALUES(:email, :password)');
$s->execute(array(':email' => $email, ':password' => $password));
// success page unless there is an exception
});
Я не тестировал это, но вы должны получить эту идею.