Создание страницы регистрации с Heroku - ошибки NotFoundException

0

Я пытаюсь создать основную страницу регистрации учетной записи для веб-сайта с использованием 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

Любые идеи, что я могу делать неправильно? Спасибо!

Теги:
heroku

1 ответ

1
Лучший ответ

Да, вы смешиваете свой старый способ программирования с использованием 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
});

Я не тестировал это, но вы должны получить эту идею.

  • 0
    Большое вам спасибо за то, что нашли время ответить. Я собираюсь занять некоторое время, чтобы пройти через это сегодня и определенно руководства Silex.
  • 0
    Не против принять ответ, @garson?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню