session — проблема Amp Form с запросом XHR с использованием логики PHP (2 версии с оговорками)

Я поступаю об этом неправильно?

Добавлены 2 примера кода!

Наверное, просто для кого-то другого здесь, я новичок в Amp html и усы, и у меня возникла неприятная проблема при создании AMP-страниц с формами, хотя это почти там!

Я должен переписать это несколько раз, и это всегда один и тот же результат! Я пытаюсь всегда возвращать правильное значение, отправленное через форму, а затем извлеченное из базы данных, оно работает только во второй раз, если страница обновляется, т.е. * нажимает клавишу f5 и пытается снова, в противном случае отображается тот же контент.

Он в основном загружает div с тем, что возвращается из базы данных, если он существует или нет.

Я думаю, что проблема с сеансом, мне пришлось создать переменную успеха и ошибки, чтобы показать различное содержимое в зависимости от того, существуют данные в базе данных или нет, так как ответ XHR всегда будет успешным, если что-то не сломано.

Независимо от того, где я размещаю значение сеанса с неустановленным значением, оно либо ничего не делает, либо заставляет запрос не работать.

Пример на основе сеанса:

<?php
session_start();
header("Access-Control-Allow-Credentials: true");
header("AMP-Same-Origin : true");
header("Access-Control-Allow-Origin: *.ampproject.org");
header("AMP-Access-Control-Allow-Source-Origin: http://www.example.com");
header("Access-Control-Expose-Headers: AMP-Access-Control-Allow-Source-Origin");

include_once('../includes/dbcon.php');
if(isset($_POST['value'])){
$value = isset($_POST['value']) ? $_POST['value'] : '';
//json
header("Content-Type: application/json");
//remove out any spaces from $_post value
$value = str_replace(" ", "", $_POST['value']);
//make session the same as $_post value
$_SESSION["value"] = $value;
$value = $_SESSION["value"];
//check the db
$query = $db->prepare("SELECT * FROM posts WHERE value = '" . $value . "'");
$query->execute();
$rows = $query->fetchAll(PDO::FETCH_ASSOC);
if( $query->rowCount() > 0){
foreach($rows as $row) {
// value exists
$_SESSION['msg'] = 'success';
$output = $_SESSION['msg'];
echo json_encode($output);
}
} else {
// value does not exist
$_SESSION['msg'] = 'error';
$output = $_SESSION['msg'];
echo json_encode($output);
}
} else { //show page
include_once('includes/header.php');  //includes the amped form and mustache.js files etc
?>
<h1>Check value.</h1>

<form method="POST" action-xhr="//www.example.com/test" target="_blank">
<fieldset>
<label>
<span>Check VALUE</span>
<input type="text" name="value" required>
</label>
<input type="submit" value="Check">
</fieldset>
<div submit-success>
<template type="amp-mustache">
<?php
$response = $_SESSION['msg'];
//echo $response .' ( '.$_SESSION['value'] .' ) ';  //test the session value returned
if($response==='success') {
echo 'Value already exists! do something here';
} else if($response==='error') {
echo 'Value does not exist! do something here';
}
?>
</template>
</div>
<div submit-error>
<template type="amp-mustache">
Something has gone wrong! (todo) If there is no response from xhr request then this error is displayed.
</template>
</div>
</form>
<?php include_once('includes/footer.php');
}
?>

Приведенная ниже оригинальная версия с использованием amp-mustache, работает (вроде) нормально, но невозможно и бесполезно, поскольку я не могу отобразить HTML-код в браузере из сообщения об ошибке или об успешном выполнении, манипулировать или сравнивать тег усов с логикой PHP.

Это должно быть возможно …
Например, возвращая обратно массив json, который читает:

"Success! Value found click here: <a href="#">link</a>"

не HTML, так что невозможно добавить кнопку и т. д.

Это все, что мне нужно сделать после проверки значения.

Версия с использованием метки усов

<?php
header("Access-Control-Allow-Credentials: true");
header("AMP-Same-Origin : true");
header("Access-Control-Allow-Origin: *.ampproject.org");
header("AMP-Access-Control-Allow-Source-Origin: http://www.example.com");
header("Access-Control-Expose-Headers: AMP-Access-Control-Allow-Source-Origin");
header("Cache-Control:private");
include_once('../includes/dbcon.php');

if(isset($_POST['value'])){
$value = isset($_POST['value']) ? $_POST['value'] : '';
//json
header("Content-Type: application/json");
//take out any spaces from the value first
$value = str_replace(" ", "", $_POST['value']);
//check db
$query = $db->prepare("SELECT * FROM posts WHERE value = '" . $value . "'");
$query->execute();
$rows = $query->fetchAll(PDO::FETCH_ASSOC);
if( $query->rowCount() > 0){
foreach($rows as $row) {
// value exists
echo json_encode(array('value'=>'My success message.'));
}
} else {
// value does not exist
echo json_encode(array('value'=>'error.<a href="#">test</a>')); //does not display as html
}
} else { //show page

include_once('includes/header.php');  //includes the amped form and mustache.js files etc
?>
<h1>Check value.</h1>
<form method="POST" action-xhr="//www.example.com/test" target="_blank">
<fieldset>
<label>
<span>Check Value</span>
<input type="text" name="value" required>
</label>
<input type="submit" value="Check">
</fieldset>
<div submit-success>
<template type="amp-mustache">
{{value}}
</template>
</div>
<div submit-error>
<template type="amp-mustache">
Something has gone wrong! (todo) If no response from xhr request then this error is displayed.
</template>
</div>
</form>
<?php include_once('includes/footer.php');
}
?>

0

Решение

Я идиот, я понял это усами (Метод 2), я не могу поверить, что я не пробовал это — долгий день, я думаю, на работе, которая не связана с программированием!

Просто измените обе проверки на:

 //success part
$url="http://example.com/success-page";
$title="my success title tag text";
echo json_encode(array(
'value'=>'My <strong>success</strong> message',
'url'=> $url,
'title' => $title
)); // add more variables to build up the JSON array and display them as mustache tags

//error part
$url="http://example.com/error-page";
$title="my error title tag text";
echo json_encode(array(
'value'=>'My error message',
'url'=> $url,
'title' => $title
)); // add more variables to build up the JSON array and display them as mustache tags

и, наконец, измените часть метки усы на:

{{{value}}} <a href="{{url}}" title="{{title}}">Click me</a>

3 фигурные скобки позволяют избежать простых тегов HTML.

1

Другие решения

Других решений пока нет …