Я пытаюсь создать систему рулетки, которая должна работать следующим образом: пользователь нажимает кнопку отправки, которая затем проверяется в файле open_case_handler.php, чтобы узнать, достаточно ли у пользователя средств на его счете или нет, и если он будет повторять код javascript, который создаст анимацию для рулетки, а также выдаст выигрыш. В целях безопасности я выполняю код js на php, поэтому у пользователя нет доступа к нему, поскольку он выполняется на стороне сервера.
Проблема здесь в том, что код js и jquery не выполняется после достижения этой строки кода:
var gw = $(".gift").outerWidth(true);
в open_case_handler.php.
Вы заметите, что есть два предупреждения до и после кода предыдущей строки, о котором я только что упомянул. Если я раскомментирую предупреждение («TEST1»), оно будет выполнено, и появится предупреждающее сообщение, однако остальная часть кода не будет выполнена. Также, если я раскомментирую только предупреждение («ТЕСТ2»), оно не будет выполнено и ничего не произойдет.
Чтобы убедиться, что код javascript действительно работает. Я ранее тестировал его в файле javascript и использовал его в файле index.php, и он работал отлично.
index.php
Эта страница содержит рулетку со всеми различными изображениями каждого предмета. Кнопка отправки находится внизу. Это кнопка, которую пользователи нажимают, чтобы запустить рулетку.
<div class='rafflebox'>
<div class='pointer'></div>
<div class='boxwrapper'>
<ul class='giftwrapper'>
<div class = "gift item bg-size2 box-bg3">
<img class = "item-product2" src = "graphics/mouse.png" draggable = "false">
</div>
<div class = "gift item bg-size2 box-bg2">
<img class = "item-product2" src = "graphics/mouse.png" draggable = "false">
</div>
<div class = "gift item bg-size2 box-bg3">
<img class = "item-product2" src = "graphics/mouse.png" draggable = "false">
</div>
<div class = "gift item bg-size2 box-bg4">
<img class = "item-product2" src = "graphics/mouse.png" draggable = "false">
</div>
</ul>
</div>
</div>
<form method = "post">
<button type = "submit" name = "opening_case" class = "btn open-box-btn btn-openbox-font button"><img id = "lock" src = "graphics/iconos/Candado Cerrado Black.png">ABRIR CAJA</button>
</form>
</div>
open_case_handler.php
<?php
session_start ();
if (isset($_POST['opening_case']))
{
opening_case ();
}
function opening_case ()
{
if ($_SESSION['balance'] >= $_SESSION['box price'])
{
echo '
<script>
//alert("TEST1");
var giftamount = 10;
var gw = $(".gift").outerWidth(true);
//alert("TEST2");
var giftcenter = gw/2;
var cycle = 7;
var containercenter = $(".boxwrapper").outerWidth(true)/2;
for(var i = 0; i <=5; i++)
{
var giftduplicate = $(".giftwrapper").children().clone(true,true);
$(".giftwrapper").append(giftduplicate);
}
$(".button").click(function()
{
alert("You DO have sufficient funds");
var btn = $(this);
btn.hide();
var randomgift = Math.floor(Math.random() * 4) + 1;
var dev = Math.random()*(giftcenter+1);
var distance = giftamount * cycle * gw + (randomgift*gw) - containercenter -24 +dev;
console.info(distance);
$( ".giftwrapper" ).css({left: "0"});
$(".giftwrapper").animate({left: "- = "+distance},10000,function()
{
alert("You Won Gift" + randomgift);
btn.show();
});
});
</script>';
} else {
//to be done
}
}
?>
Пожалуйста, не стесняйтесь высказывать свои идеи о том, как лучше построить этот тип системы. Я открыт для всех предложений, я новичок в этом.
Спасибо!!
$ is not defined в консоль? Это означало бы, что jQuery не загружен ... и это прерывает выполнение. ;)
Да, после проверки консоли я заметил, что произошла ошибка и действительно была связана с тем, что jQuery не был загружен. У меня был скрипт jQuery внизу моего файла, но я заменил его вверху, и он заработал. Спасибо!!
Что касается отсутствующего атрибута действия, я подумал, что он мне не нужен, если я просто включу файл open_case_handler.php в index.php, а затем просто проверю наличие кнопки отправки POST.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Попробуйте использовать Пример цитирования строки Heredoc для печати вашего JavaScript:
$str = <<<EOD
Example of string
spanning multiple lines
using heredoc syntax.
EOD;
Heredoc text behaves just like a double-quoted string, without the double quotes. This means that quotes in a heredoc do not need to be escaped, but the escape codes listed above can still be used. Variables are expanded, but the same care must be taken when expressing complex variables inside a heredoc as with strings.
Если это просто файл с кодом php. Вы можете попробовать несколько ниже.
<?php
echo "some stuff here"
if ($condition){ ?>
<script>
alert("condition true");
</script>
<?php } else { ?>
<script>
alert("condition false");
</script>
<?php }?>
Когда форма отправляется, она перенаправляет вас на страницу PHP (т.е. когда вы нажимаете кнопку «Отправить» в index.php, вы будете перенаправлены на open_case_handler.php), а затем страница PHP отправит вас обратно на страницу индекса с новой информацией. Таким образом, ваш код javascript печатается в файле open_case_handler.php, поэтому ваш javascript не запускается. Кроме того, ваш код javascript всегда будет виден, если вы не сделаете что-то действительно творческое, поэтому, если вы пытаетесь обрабатывать любую конфиденциальную информацию, делайте это на PHP или в любой другой серверной структуре, которую вы используете.
Есть способы решить эту проблему, но я бы порекомендовал другой подход для решения этой проблемы. Вы можете использовать запрос AJAX, который в основном работает следующим образом:
Ваш код Javascript обработает результат и покажет анимацию или что бы вы ни делали.
Таким образом, ваш алгоритм не отображается, а ваш клиент (сторона javascript) обрабатывает только информацию, введенную пользователем, а результаты приходят с сервера.
В вашем случае мы можем сделать это, используя следующие изменения
Index.php (теперь его можно заменить на index.html)
<button type = "submit" id = "opening_case" name = "opening_case" class = "btn open-box-btn btn-openbox-font button"><img id = "lock" src = "graphics/iconos/Candado Cerrado Black.png">ABRIR CAJA</button>
<script src = "https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script>
$("#opening_case").on("click", ()=>{
// $.get( "opening_case_handler.php?opening_case=true", function( data ) {
// console.info(data.funds)
// });
$.ajax({
url: "opening_case_handler.php?opening_case=true",
success: (data)=>{
if (data.funds) {
alert("You DO have sufficient funds")
} else {
("You don't have sufficient funds")
}
},
dataType: "JSON"
});
})
</script>
open_case_handler.php
<?php
if (isset($_GET['opening_case'])) {
$result = [
"funds" => true,
];
$ResultsInJSON= json_encode($result);
echo $ResultsInJSON;
}
?>
Index.php отправит запрос при нажатии кнопки с помощью AJAX, который вы можете прочитать здесь https://api.jquery.com/jquery.get/, тогда ваш PHP получит запрос и ответ с кодом JSON, который может быть обработан с использованием данных. Все, что показано в примере выше.
Примечание. Я не эксперт по PHP, но считаю, что в данном случае лучше использовать этот метод.
Примечание 2: вам не нужен JQuery для Ajax, но это проще! Вот как это сделать без JQuery https://www.w3schools.com/xml/ajax_xmlhttprequest_send.asp
Большое спасибо за такое подробное объяснение и примеры, это сработало! Я определенно согласен с вами, такой подход определенно лучше для построения систем такого типа.
В вашей форме нет атрибута
action, загружается лиopening_case_handler.phpчерез AJAX?