@rebootbutton

Почему я не могу получить новые значения $_GET в AJAX+PHP, кто-то может помочь?

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>PHP</title>
    <link rel="stylesheet" href="style.css">
</head>
<body>
<h2>PHP AJAX Try</h2>
<p class="article">For more information please <a href="001.php">see</a></p>
<p class="article">or get <a href="002.php">back to table</a></p>
<p class="article"></p>
<?php
//------------1.CONNECTION--------------------------
$conn = mysqli_connect('localhost', 'root', '', 'tovarlar');
$query = "SELECT * from royhat";
$result = mysqli_query($conn, $query);
//------------2.TABLE CREATION--------------------------
?>
<table>
    <tr>
        <th>Идентификатор товара
        </th>
        <th>Наименование товара
            <form action="002.php" method="get">
            
            <input id="search" type="text" name="search" autocomplete="off" placeholder="Поиск...">
            </form>
        </th>
        <th>Цена товара</th>
    </tr>
<?php 
//------------3.1.PHP CHECK GET REQUEST --------------------------
var_dump($_GET);
if (isset($_GET['search'])) {
    //------------3.2.FETCH DATA IF FILTER IS SET--------------------------
    $query = "SELECT * from royhat where tovar_nomi LIKE '%$_GET[search]%'";
    $result = mysqli_query($conn, $query);
    while ($rows = mysqli_fetch_assoc($result)) {
        echo "<tr>";
        echo "<td>$rows[tovar_id]</td>";
        echo "<td>$rows[tovar_nomi]</td>";
        echo "<td>$rows[tovar_narxi]</td>";
        echo "</tr>";
    }
}else{
    //------------3.3.FETCH DATA IF FILTER IS NOT SET--------------------------
    while ($rows = mysqli_fetch_assoc($result)) {
        echo "<tr>";
        echo "<td>$rows[tovar_id]</td>";
        echo "<td>$rows[tovar_nomi]</td>";
        echo "<td>$rows[tovar_narxi]</td>";
        echo "</tr>";
    }
}
?>
<script>
//------------4.SCRIPTS. AJAX. SENDING --------------------------
var search = document.getElementById('search');
search.addEventListener('input', function () {
    searchval = document.getElementById('search').value;
    var xhr = new XMLHttpRequest();
    console.log(xhr);
     xhr.onreadystatechange = function(){
        if (this.readyState == 4 && this.status == 200) {
            console.log('xhr');
            console.log(this.readyState + 'readyState');
            console.log(this.status + 'status');
        }
    }
    xhr.open("GET", "002.php?search=" + searchval, true);
    console.log("002.php?search=" + searchval);
    xhr.send();
});

</script>
</table>
</body>
</html>


сам файл называется 002.php, то есть здесь всё отражено. Только нет базы.
По мне при вводе в текстовое поле должен быть GET запрос, и формируется $sql переменный и получаются данные.
Но это не происходит, как мне исправить эту ситуацию?
  • Вопрос задан
  • 181 просмотр
Решения вопроса 1
@rebootbutton Автор вопроса
Так! Товарищи, добрый день, снова я.
Если читаете всё ещё, так это не зря. А случайным людям, которые зашли читать рекомендую комментарии и ругань здесь не читать, там правильного ответа нет.
Особенно фразы как
пхп код ВЕСЬ выносится ДО хтмл.

мне непонятны. Я подумал наверно пхп код должен в документе выше идти, если это имелось ввиду, то дело совсем не в этом - и это мне ни капли не помогло.
Теперь правильный ответ:
Что я сделал и как решил вопрос?
1.Файл 002.php:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>PHP</title>
    <link rel="stylesheet" href="style.css">
</head>
<body>
<h2>PHP AJAX Try</h2>
<p class="article">For more information please <a href="001.php">see</a></p>
<p class="article">or get <a href="002.php">back to table</a></p>
<p class="article"></p>
<table>
    <tr>
        <th>Идентификатор товара
        </th>
        <th>Наименование товара
            <form action="002_table.php" method="get">
            
            <input id="search" type="text" name="search" autocomplete="off" placeholder="Поиск...">
            </form>
        </th>
        <th>Цена товара</th>
    </tr>
 <tbody id="tbl">
</tbody>
</table>
<script>
//------------4.SCRIPTS. AJAX. SENDING --------------------------
var search = document.getElementById('search');
search.addEventListener('input', function () {
    searchval = document.getElementById('search').value;
    var xhr = new XMLHttpRequest();
    console.log(xhr);
     xhr.onreadystatechange = function(){
        if (this.readyState == 4 && this.status == 200) {
            document.getElementById('tbl').innerHTML = this.responseText;
            console.log('xhr');
            console.log(this.readyState + 'readyState');
            console.log(this.status + 'status');
        }
    }
    xhr.open("GET", "002_table.php?search=" + searchval, true);
    xhr.send();
});

</script>
</body>
</html>

здесь самое важное для меня нужное была строка:
document.getElementById('tbl').innerHTML = this.responseText;

при этом в таблице (внутри тега table, после строки тега tr для заголовок) я создал тег tbody и присвоил к нему идентификаторid="tbl"
То есть tbody в 002.php включать будет в себя содержание 002_table.php, вернее 002_table.php?search=нашзапрос
2.Часть кода, где отображается таблица, убрал в документ (новый) 002_table.php:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>

<?php
//------------1.CONNECTION--------------------------
$conn = mysqli_connect('localhost', 'root', '', 'tovarlar');
$query = "SELECT * from royhat";
$result = mysqli_query($conn, $query);
//------------2.TABLE CREATION--------------------------
?>

<?php 
//------------3.1.PHP CHECK GET REQUEST --------------------------

if (isset($_GET['search'])) {
    //------------3.2.FETCH DATA IF FILTER IS SET--------------------------
    $query = "SELECT * from royhat where tovar_nomi LIKE '%$_GET[search]%'";
    $result = mysqli_query($conn, $query);
    while ($rows = mysqli_fetch_assoc($result)) {
        echo "<tr>";
        echo "<td>$rows[tovar_id]</td>";
        echo "<td>$rows[tovar_nomi]</td>";
        echo "<td>$rows[tovar_narxi]</td>";
        echo "</tr>";
    }
}else{
    //------------3.3.FETCH DATA IF FILTER IS NOT SET--------------------------
    while ($rows = mysqli_fetch_assoc($result)) {
        echo "<tr>";
        echo "<td>$rows[tovar_id]</td>";
        echo "<td>$rows[tovar_nomi]</td>";
        echo "<td>$rows[tovar_narxi]</td>";
        echo "</tr>";
    }
}
?>


</body>
</html>


3.Всё. В итоге что получилось. При открытии 002.php
62b327755b82f453877343.png
Если мы вносим какие то данные в поле поиска, сразу же появятся выбранные строки:
62b327c073e34286859652.png
4.В идеале для меня нужно было, чтобы при первой открытии (до отправки GET запроса) показалась вся таблица.
5.Маловажная инфа: CSS код, который находится у меня в "style.css" файле:
h2{
    font-size: 36px;
}
ul>li, ol>li{font-family: monospace;} h2{width:300px;}
.article{
    margin-bottom: 10px;
    font-family: "Bookman Old Style";
    font-weight: bold;
    font-size: 16px;
    width: 40%;
}
.article:hover, ul>li:hover, ol>li:hover, textarea:hover{
    background-color: black; color: greenyellow;
}
.article:hover code, code:hover{color:white;background-color: darkred;}
code, h2{
    font-family: monospace;
    background-color: hsl(178, 76%, 65%);
}
textarea{
    width:500px; max-width:600px;
    height:140px; max-height:450px; min-height:50px; font-family: monospace; font-weight: 800;
}

.pic{
    max-width: 40%;
}
.pic:hover{
    box-shadow: black 0px 0px 30px;
}
table, tr, td, th{
    border: 1px black solid;
    border-collapse: collapse;
}


Итог:
1.вопрос решился - это хорошо. Я выяснил - это хорошо.
2.Специалисты, кураторы - либо здесь дают плохие, нерабочие советы, не понимают вопрос, либо сам дурак неправильно выразился. В общем по пункту 2 выводы делайте сами.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
ThunderCat
@ThunderCat Куратор тега PHP
{PHP, MySql, HTML, JS, CSS} developer
Но это не происходит,
Все что "не происходит", "не работает", "работает не так" - термины уборщицы из туалета. Любое программное действие вызывает какой-то описываемый результат - ошибку (которую нужно привести дословно) или конкретное действие (которое тоже поддается описанию, например нужно А, но происходит Б).

1) Внятно опишите чего вы хотите добиться, а то код у вас сплошная мешанина хтмл, жс и пхп, а сама цель вообще не ясна.
2) Проверьте консоль браузера на ошибки, они там наверняка есть
3) Проверьте нетворк, посмотрите что возвращает ваш аякс запрос (хинт - в основном мусор), подумайте почему.

По мне при вводе в текстовое поле должен быть GET запрос, и формируется $sql переменный и получаются данные.
Скорее всего все так и происходит, только данные заговнячены, запрос гоняется 2 раза просто так, а с полученными данными все равно ничего не делается...

PS:
запросы всегда нужно делать через подготовленные выражения,
пхп код ВЕСЬ выносится ДО хтмл. В нужных местах в хтмл вы просто выводите заранее полученные значения.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы