Как сохранить / повторно отправить информацию формы после обновления - PullRequest
0 голосов
/ 29 марта 2020

Привет ,

До того, как этот вопрос будет помечен как дублирующий вопрос, остальные вообще не относятся к моей ситуации.

Итак, я делаю простую библиотечную систему, используя PHP и HTML. На данный момент моя проблема заключается в том, что при поиске книги она выполняет запрос SQL и возвращает правильные результаты. Проблема в том, что для того, чтобы узнать больше информации о книге, вы должны нажать на кнопку, которая выполняет sql запросов, а что нет, а затем открывает модальное окно с информацией. Это также работает нормально, но когда вы это делаете, поскольку он выполняет код php, страница обновляется, и данные поиска исчезают, и вам нужно искать снова, чтобы получить те же результаты, если вам нужно. Извините, если я объяснил это плохо, я буду рад уточнить, если потребуется.

Я не хочу использовать AJAX, я не могу использовать node.js, поэтому у меня действительно нет никакой подсказки.

Бит, отображающий книгу:

$library = $_COOKIE["userLibrary"];
if(isset($_GET['search'])){
$author = $_GET['author'];
$title = $_GET['booktitle'];
if($author!='' and $title == '' && mysqli_num_rows(mysqli_query($conn,"SELECT * FROM `$library` WHERE Author LIKE '%$author%' ORDER BY Author"))>0){
echo "<table align='center' class='table table-striped table-hover table-bordered'>";
    $allBooks = mysqli_query($conn,"SELECT * FROM `$library` WHERE Author LIKE '%$author%' ORDER BY Author");
    if(mysqli_num_rows($allBooks)>0){
    echo "<td id='book'><strong>Title</td>";
        echo "<td id='book'><strong>Author</td>";
            echo "<td id='book'><strong>More Information</td>";
                while($row = mysqli_fetch_array($allBooks)){
                //list($row['Title']) = explode("::", $row['Title']);
                $currentCode = $row['InternalBarcode'];
                echo "<tr><td id='book'>".$row["Title"]."</td><td id='book'>".$row["Author"]."</td><td id='book'  align='center'> <form method='get'><input type='hidden' name='action' value='submit' /><input type='hidden' name='more' value=".$row['InternalBarcode']." /><input type='image' src='More.png' name='more' value='".$row['InternalBarcode']."'></form></td>";
                }
            echo "</tr></table>";
        }
    }
    else{
    echo "<table align='center' class='table table-striped table-hover table-bordered'>";
        $allBooks = mysqli_query($conn,"SELECT * FROM `$library` ORDER BY Author");
        if(mysqli_num_rows($allBooks)>0){
        echo "<td id='book'><strong>Title</td>";
            echo "<td id='book'><strong>Author</td>";
                echo "<td id='book'><strong>More Information</td>";
                    while($row = mysqli_fetch_array($allBooks)){
                    //list($row['Title']) = explode("::", $row['Title']);
                    $currentCode = $row['InternalBarcode'];
                    echo "<tr><td id='book'>".$row["Title"]."</td><td id='book'>".$row["Author"]."</td><td id='book'  align='center'> <form method='get'><input type='hidden' name='action' value='submit' /><input type='hidden' name='search'><input type='hidden' name='more' value=".$row['InternalBarcode']." /><input type='image' src='More.png' name='more' value='".$row['InternalBarcode']."'></form></td>";
                    }
                echo "</tr></table>";
            }
        }
    }
    else{
    echo "<table align='center' class='table table-striped table-hover table-bordered'>";
        $allBooks = mysqli_query($conn,"SELECT * FROM `$library` ORDER BY Author");
        if(mysqli_num_rows($allBooks)>0){
        echo "<td id='book'><strong>Title</td>";
            echo "<td id='book'><strong>Author</td>";
                echo "<td id='book'><strong>More Information</td>";
                    while($row = mysqli_fetch_array($allBooks)){
                    //list($row['Title']) = explode("::", $row['Title']);
                    $currentCode = $row['InternalBarcode'];
                    echo "<tr><td id='book'>".$row["Title"]."</td><td id='book'>".$row["Author"]."</td><td id='book'  align='center'> <form method='get'><input type='hidden' name='action' value='submit' /><input type='hidden' name='more' value=".$row['InternalBarcode']." /><input type='image' src='More.png' name='more' value='".$row['InternalBarcode']."'></form></td>";
                    }
                echo "</tr></table>";
            }

Код PHP для формы поиска:

if(isset($_GET['action'])){
$barcode = $_GET['more'];
//unset($_GET['action']);
$bookTitleA = mysqli_query($conn, "SELECT Title FROM `$library` WHERE InternalBarcode = '$barcode'");
$bookTitle = mysqli_fetch_array($bookTitleA)[0];
$desc = mysqli_fetch_array(mysqli_query($conn, "SELECT Description FROM `$library` WHERE Title = '$bookTitle'"))[0];
$onLoanA = mysqli_query($conn, "SELECT OnLoan FROM `$library` WHERE InternalBarcode = '$barcode'");
$onLoanQuery = mysqli_fetch_array($onLoanA)[0];
$onLoanTo = mysqli_fetch_array(mysqli_query($conn, "SELECT username FROM users where id = '$onLoanQuery'"))[0];
$anyOthers = mysqli_query($conn, "SELECT * from `$library` WHERE Title = '$bookTitle' and OnLoan = '0'");
if($onLoanQuery == '0'){
    global $onLoan;
    $onLoan = 'This book is currently not on loan';
}
elseif(mysqli_num_rows($anyOthers)>0){
    global $onLoan;
    $onLoan = "This book is currently on loan to ".$onLoanTo."<br>There are ".mysqli_num_rows($anyOthers)." more coppies available";
}
else{
    global $onLoan;
    $onLoan = 'This book is currently on loan to '.$onLoanTo."<br>There are no more coppies available.";
}
echo "<script>BookModal(`$bookTitle`, `$barcode`, `$desc`, '$onLoan')</script>";    
}
?>

Форма поиска:

<h2 align="center">Search:</h2>
<form action="" method="get">
    <div class="form-group">
        <label for="author">Author:</label>
        <input type="text" class="form-control" name="author" id="author" placeholder="Name of Author"/>
    </div>
    <div class="form-group">
        <label for="booktitle">Title:</label>
        <input type="text" class="form-control" name="booktitle" id="booktitle" placeholder="Title of Book"/>
    </div>
    <input class="form-control" type="submit" name="search" id="search" value="Search">
</form>

Вот JS если вам это нужно:

function ModalOpen(modalName){
    $(modalName).modal('show');
}
function BookModal(title, barcode, description, available){
    document.getElementById('bookTitle').innerHTML=title;
    document.getElementById('barcode').innerHTML=barcode;
    document.getElementById('desc').innerHTML=description;
    document.getElementById('available').innerHTML=available;
    $('#myModal').modal('show');
}
function ModalClose(modalName){
    $(modalName).modal('hide');
}

Я ценю вашу помощь!

Обновление

Я решил использовать AJAX, который работает, Сорта. Он отлично работает для первой строки в таблице, но в остальном модал все равно всплывает, но показывает те же данные, что и книга в верхней части таблицы. Неважно, что я нажимаю первым, все равно отображаются только данные из первой строки таблицы.

Бит, отображающий книги (php):

include 'connect.php';
$library = $_COOKIE["userLibrary"];
if(isset($_GET['search'])){
$author = $_GET['author'];
$title = $_GET['booktitle'];
if($author!='' and $title == '' && mysqli_num_rows(mysqli_query($conn,"SELECT * FROM `$library` WHERE Author LIKE '%$author%' ORDER BY Author"))>0){
echo "<table align='center' class='table table-striped table-hover table-bordered'>";
    $allBooks = mysqli_query($conn,"SELECT * FROM `$library` WHERE Author LIKE '%$author%' ORDER BY Author");
    if(mysqli_num_rows($allBooks)>0){
    echo "<td class='book'><strong>Title</td>";
        echo "<td class='book'><strong>Author</td>";
            echo "<td class='book'><strong>More Information</td>";
                while($row = mysqli_fetch_array($allBooks)){
                //list($row['Title']) = explode("::", $row['Title']);
                $currentCode = $row['InternalBarcode'];
                echo "<tr><td id='book'>".$row["Title"]."</td><td id='book'>".$row["Author"]."</td><td id='book'  align='center'> <form method='get'><input type='button' class='more' src='More.png' value='".$row['InternalBarcode']."'></form></td>";
                }
            echo "</tr></table>";
        }
    }
    else{
    echo "<table align='center' class='table table-striped table-hover table-bordered'>";
        $allBooks = mysqli_query($conn,"SELECT * FROM `$library` ORDER BY Author");
        if(mysqli_num_rows($allBooks)>0){
        echo "<td id='book'><strong>Title</td>";
            echo "<td id='book'><strong>Author</td>";
                echo "<td id='book'><strong>More Information</td>";
                    while($row = mysqli_fetch_array($allBooks)){
                    //list($row['Title']) = explode("::", $row['Title']);
                    $currentCode = $row['InternalBarcode'];
                    echo "<tr><td id='book'>".$row["Title"]."</td><td id='book'>".$row["Author"]."</td><td id='book'  align='center'> <form method='get'><input type='button' class='more' src='More.png' value='".$row['InternalBarcode']."'></form></td>";
                    }
                echo "</tr></table>";
            }
        }
    }
    else{
    echo "<table align='center' class='table table-striped table-hover table-bordered'>";
        $allBooks = mysqli_query($conn,"SELECT * FROM `$library` ORDER BY Author");
        if(mysqli_num_rows($allBooks)>0){
        echo "<td id='book'><strong>Title</td>";
            echo "<td id='book'><strong>Author</td>";
                echo "<td id='book'><strong>More Information</td>";
                    while($row = mysqli_fetch_array($allBooks)){
                    //list($row['Title']) = explode("::", $row['Title']);
                    $currentCode = $row['InternalBarcode'];
                    echo "<tr><td id='book'>".$row["Title"]."</td><td id='book'>".$row["Author"]."</td><td id='book'  align='center'> <form method='get'><input type='button' class='more' src='More.png' value='".$row['InternalBarcode']."'></form></td>";
                    }
                echo "</tr></table>";
            }
        }

Код PHP, который выполняет AJAX:

<?php
if(isset($_POST["barcode"])){
    $library = $_COOKIE["userLibrary"];
    include 'connect.php';
    $barcode = $_POST['barcode'];
    $bookTitleA = mysqli_query($conn, "SELECT Title FROM `$library` WHERE InternalBarcode = '$barcode'");
    $bookTitle = mysqli_fetch_array($bookTitleA)[0];
    $desc = mysqli_fetch_array(mysqli_query($conn, "SELECT Description FROM `$library` WHERE Title = '$bookTitle'"))[0];
    $onLoanA = mysqli_query($conn, "SELECT OnLoan FROM `$library` WHERE InternalBarcode = '$barcode'");
    $onLoanQuery = mysqli_fetch_array($onLoanA)[0];
    $onLoanTo = mysqli_fetch_array(mysqli_query($conn, "SELECT username FROM users where id = '$onLoanQuery'"))[0];
    $anyOthers = mysqli_query($conn, "SELECT * from `$library` WHERE Title = '$bookTitle' and OnLoan = '0'");
    if($onLoanQuery == '0'){
        global $onLoan;
        $onLoan = 'This book is currently not on loan';
    }
    elseif(mysqli_num_rows($anyOthers)>0){
        global $onLoan;
        $onLoan = "This book is currently on loan to ".$onLoanTo."<br>There are ".mysqli_num_rows($anyOthers)." more coppies available";
    }
    else{
        global $onLoan;
        $onLoan = 'This book is currently on loan to '.$onLoanTo."<br>There are no more coppies available.";
    }
    $thing = "BookModal(`$bookTitle`, `$barcode`, `$desc`, '$onLoan'";  
    echo json_encode(['booktitle' => $bookTitle,
        'barcode' => $barcode,
        'desc' => $desc,
        'onloan' => $onLoan], JSON_FORCE_OBJECT);
    exit();
}
?>

Код AJAX:

$(function(){
    $('.more').on('click', function(){
        var barcodeNum = $('input[class="more"]').val();
        $.ajax({
            type: 'post',
            url: '',
            data: {barcode: barcodeNum},
            success: function(data){
                let allVar = JSON.parse(data);
                let booktitle = allVar.booktitle;
                let desc = allVar.desc;
                let onloan = allVar.onloan;
                let barcode = allVar.barcode;
                document.getElementById('bookTitle').innerHTML=booktitle;
                document.getElementById('barcode').innerHTML=barcode;
                document.getElementById('desc').innerHTML=desc;
                document.getElementById('available').innerHTML=onloan;
                $('#myModal').modal('show');
            },
            error: function(data){
                console.log('error');
                alert('error');
            }
        });
    });
})

Ответы [ 2 ]

1 голос
/ 30 марта 2020

Ошибка с вашим AJAX использовала $('input[class="more"]').val(). Это всегда выбирает значение первого элемента с этим атрибутом. При установке значения $(this).val() будет получено значение элемента, по которому щелкнули ( this представляет элемент, вызвавший обработчик).

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

Общие рекомендации

1) Не вставляйте параметры непосредственно в запрос. Это делает вас открытым для SQL инъекции . Поскольку вы уже используете mysqli, вам следует переключиться на подготовленные операторы . Я сохраняю ваши оригинальные небезопасные запросы в следующих примерах, но вы должны заменить их безопасной версией.

2) То же самое относится и к имени таблицы, которую вы держите в кулинарии ie (хотя я не знаю почему ты это сделал). Cookies могут быть скомпрометированы. Я советую вам поместить какое-то другое уникальное значение в значение cook ie, которое вы затем переводите в имя таблицы. Например, если ваше имя таблицы было main_library, вы можете сохранить main в файле cook ie, а затем сделать switch в php, чтобы получить фактическое имя. Если значение cook ie не может быть переведено, ничего не делайте.

3) Всегда проверяйте, успешно ли выполнен ваш запрос. Прямо сейчас вы проверяете только mysqli_num_rows, но эта функция ожидает mysqli_result в качестве параметра, но ошибочный запрос будет иметь логическое значение false, что приведет к ошибке.

Относительно сценария отображения вашей книги :

1) Многие из них вы распечатываете: <td id='book'>. Я предполагаю, что вы хотели сделать это классом, а не идентификатором. Идентификаторы должны быть уникальными. Кроме того, если все ваши клетки имеют этот класс, то они не должны иметь его. Независимо от того, какая родительская структура может инкапсулировать этот стиль (строка таблицы или, может быть, сама таблица), должен иметь класс, и тогда вы можете стилизовать ячейки, указав .book td. Таким образом, вам не нужно применять класс к каждой отдельной ячейке.

2) Когда вы используете get, проверьте, установлен ли каждый параметр (в настоящее время вы проверяете только, если search. Поэтому, чтобы избежать неопределенных уведомлений об индексах, сделайте что-то подобное, чтобы задать для ваших переменных значение по умолчанию:

$author = isset($_GET['author']) ? $_GET['author'] : '';
// or use a shorter equivalent with the null-coalescing operator like this
$author = $_GET['author'] ?? '';

3) Остальная часть кода может быть реструктурирована для удаления ненужного дублирования. Вместо того чтобы использовать один и тот же вывод html в каждой ветви if-else, используйте только ветку для определения вашего запроса:

// this is the default query, so it can be set right at the start
$allBooks = "SELECT * FROM `$library` ORDER BY Author";
if(isset($_GET['search'])){
    $author = $_GET['author'] ?? '';
    $title = $_GET['booktitle'] ?? '';
    if ($author !== '' and $title !== '') {
        // here we just overwrite it if we have all the necessary parameters
        $allBooks = "SELECT * FROM `$library` WHERE Author LIKE '%$author%' ORDER BY Author";
    }
}

А затем выполните запрос и один раз используйте вывод html с результат запроса.

Относительно вашего скрипта, вызываемого AJAX:

1) Здесь вы делаете три запроса, чтобы извлечь три столбца из одной таблицы:

$bookTitleA = mysqli_query($conn, "SELECT Title FROM `$library` WHERE InternalBarcode = '$barcode'");
$bookTitle = mysqli_fetch_array($bookTitleA)[0];
$desc = mysqli_fetch_array(mysqli_query($conn, "SELECT Description FROM `$library` WHERE Title = '$bookTitle'"))[0];
$onLoanA = mysqli_query($conn, "SELECT OnLoan FROM `$library` WHERE InternalBarcode = '$barcode'");

Все это должно быть сделано в одном запросе с SELECT Title, Description, OnLoan ....

2) Нет необходимости делать $onLoan глобальным. Вы используете его в выходных данных скрипта, поэтому вы можете просто удалить все эти строки.

3) Вам также не нужен exit, потому что вы уже достигли конца скрипт.

4) $thing = "BookModal($bookTitle, $barcode, $desc, '$onLoan'"; выглядит как остаток, так как он не используется в скрипте.

Относительно вашего javascript:

1) Предпочитаете использовать const и let свыше var. Я вижу, что вы используете let, поэтому вы должны хотя бы частично ознакомиться с ними. Я бы посоветовал вам превратить var barcodeNum в const barcodeNum.

2) Вам не нужны все эти переменные в функции успеха. Все, что вам действительно нужно, это const allVar = JSON.parse(data); (обратите внимание, что я изменил его на const, поскольку вам не нужно его переназначать). Тогда вы можете просто использовать его свойства напрямую и избежать ненужной инициализации нескольких переменных, которые вы используете только один раз:

document.getElementById('bookTitle').innerHTML = allVar.booktitle;
0 голосов
/ 30 марта 2020

Я использовал

$('.btn').on('click', function()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...