Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Помогите вывести результат на страницу (https://javascript.ru/forum/misc/70106-pomogite-vyvesti-rezultat-na-stranicu.html)

Tomson123 10.08.2017 17:32

Помогите вывести результат на страницу
 
здраствуйте! Есть код

<script type="text/javascript">
 	function call() {
 	  var msg   = $('#formx').serialize();
        $.ajax({
          type: 'POST',
          url: 'index.php?act=add&id=".$id."',
          dataType:'text',
          data: msg,
          success: function(data) {

            $('#results').html(data).show().delay(1500).fadeOut(800);
            $('#name').val(''); //очищаем текстовое поле после успешной вставки
            $('#desc').val(''); //очищаем текстовое поле после успешной вставки


          },
          error:  function(xhr, str){
	    alert('Возникла ошибка: ' + xhr.responseCode);
          }

        });

    }
</script>



<div id="results"></div>

<form method="POST" id="formx" action="javascript:void(null);" onsubmit="call()"/>
<legend>Test From</legend>
<label for="name">Заголовок:</label><input id="name" name="name" value="" type="text"><br />
<label for="desc">Превью:</label><input id="desc" name="desc" value="" type="text"> <br />
<input value="Send" type="submit"/>
</form>



$req = mysql_query("SELECT * FROM `test`  WHERE `type` = '1' ORDER BY `id`");
while ($res = mysql_fetch_array($req)) {
$i++;

   

    echo '<a href="?act=list&amp;dir='.$res['namelat'].'">' . htmlentities($res['name'], ENT_QUOTES, 'UTF-8') . '</a>';








            }


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

laimas 10.08.2017 17:40

<form method="POST" id="formx" action="javascript:void(null);" onsubmit="call()"/>

function call() {..

$(function() {
    $('#formx').submit(function(e) {
        e.preventDefault();
        $.ajax({
          type: 'POST',
          url: 'index.php?act=add&id=".$id."',
          dataType:'text',
          data: msg,
          ...
        })
    })
});


url: 'index.php?act=add&id=".$id."', - это и плохо, и ошибка.

Цитата:

Сообщение от Tomson123
как реализовать все таким образом чтобы следуюшая добавленная запись динамически подгружалась на страницу без перезагрузки страницы

Пояснить.

Tomson123 10.08.2017 18:18

Цитата:

Сообщение от laimas (Сообщение 461277)
<form method="POST" id="formx" action="javascript:void(null);" onsubmit="call()"/>

function call() {..

$(function() {
    $('#formx').submit(function(e) {
        e.preventDefault();
        $.ajax({
          type: 'POST',
          url: 'index.php?act=add&id=".$id."',
          dataType:'text',
          data: msg,
          ...
        })
    })
});


url: 'index.php?act=add&id=".$id."', - это и плохо, и ошибка.



Пояснить.

Подскажи как правильно сделать чтобы можно было передать с записью GETы!

Пояснения! При отправке данных через форму уменя возврашается в блок <div id="results"></div>
ответ типа "Запись успешно добавленна" вслучае если все данные получены и успешно обработаны с последуюшим добавлением в базу!

А мне нужно чтобы вместо этова ответа при успешном добавлении записи эта запись автоматически отображалась на странице! Как тут http://dnzl.ru/demo/ajax_add_delete/demo.php

Tomson123 10.08.2017 18:20

Предложи какую нибудь реализацию этой задачи,я просто в JS ваше слаб.

laimas 10.08.2017 18:36

Цитата:

Сообщение от Tomson123
Подскажи как правильно сделать чтобы можно было передать с записью GETы!

Так и предается - через URL запроса, а POST данные передаются в теле запроса. Но, так как вы делаете, выводя скрипт посредством РНР ради того, чтобы указать переменную, это не самый лучший способ, для формы тем более. Данный обработчик вполне можно прописать в подключаемом скрипте, в обработчике загрузки страницы:

$(function() {
//.....
})


Думаю, что такое в вашем коде уже есть. URL запроса же, который будет содержать и переменную $id прописать в action формы, ибо форму в любом случае будет отдавать сервер:

<form id="formx" action="index.php?act=add&id=<?=$id?>">


В Ajax запросе получить этот адрес у формы:

$('#formx').submit(function(e) {
    e.preventDefault(); //отмена действия по умолчанию
    $.ajax({
          type: 'POST',
          url: this.action, //URL запроса
          dataType:'text',
          data: $(this).serialize(), //данные формы
          //... код далее
    })
});


Цитата:

Сообщение от Tomson123
мне нужно чтобы вместо этова ответа при успешном добавлении записи эта запись автоматически отображалась на странице

Ну в общем то, для этого и не нужно ничего возвращать серверу, достаточно клиенту ответить, что добавление записи Ок, и что было в форме пометить на страницу, и очистить форму.

Если же все таки требуется "вмешательство" в данный процесс сервера, например он снабжает эти данные еще какими либо сопутствующими добавленной записи (вложенные запросы к связанным таблицам), то тогда после записи данных формы нужно получить ID этой записи. Сделать запрос по этому ID, получить и отправить клиенту.

Но если переменная $id, это и есть добавленная запись (то есть вы так полагаете), то это конечно же не так.

И вот это htmlentities() слишком, достаточно htmlspecialchars().

Tomson123 10.08.2017 22:17

Цитата:

Сообщение от laimas (Сообщение 461277)
<form method="POST" id="formx" action="javascript:void(null);" onsubmit="call()"/>

function call() {..

$(function() {
    $('#formx').submit(function(e) {
        e.preventDefault();
        $.ajax({
          type: 'POST',
          url: 'index.php?act=add&id=".$id."',
          dataType:'text',
          data: msg,
          ...
        })
    })
});


url: 'index.php?act=add&id=".$id."', - это и плохо, и ошибка.



Пояснить.

Цитата:

Сообщение от laimas (Сообщение 461289)
Так и предается - через URL запроса, а POST данные передаются в теле запроса. Но, так как вы делаете, выводя скрипт посредством РНР ради того, чтобы указать переменную, это не самый лучший способ, для формы тем более. Данный обработчик вполне можно прописать в подключаемом скрипте, в обработчике загрузки страницы:

$(function() {
//.....
})


Думаю, что такое в вашем коде уже есть. URL запроса же, который будет содержать и переменную $id прописать в action формы, ибо форму в любом случае будет отдавать сервер:

<form id="formx" action="index.php?act=add&id=<?=$id?>">


В Ajax запросе получить этот адрес у формы:

$('#formx').submit(function(e) {
    e.preventDefault(); //отмена действия по умолчанию
    $.ajax({
          type: 'POST',
          url: this.action, //URL запроса
          dataType:'text',
          data: $(this).serialize(), //данные формы
          //... код далее
    })
});




Ну в общем то, для этого и не нужно ничего возвращать серверу, достаточно клиенту ответить, что добавление записи Ок, и что было в форме пометить на страницу, и очистить форму.

Если же все таки требуется "вмешательство" в данный процесс сервера, например он снабжает эти данные еще какими либо сопутствующими добавленной записи (вложенные запросы к связанным таблицам), то тогда после записи данных формы нужно получить ID этой записи. Сделать запрос по этому ID, получить и отправить клиенту.

Но если переменная $id, это и есть добавленная запись (то есть вы так полагаете), то это конечно же не так.

И вот это htmlentities() слишком, достаточно htmlspecialchars().

Спасибо, от части мысль понел! Буду эксперементировать=)

Tomson123 10.08.2017 23:44

При записи данных я испорльзую mysql_real_escape_string, а на выходе использую уже свою функцию

$str = htmlentities(trim($str), ENT_QUOTES, 'UTF-8');
    $str = nl2br($str);
    $str = strtr($str, array (
        chr(0)=> '',
        chr(1)=> '',
        chr(2)=> '',
        chr(3)=> '',
        chr(4)=> '',
        chr(5)=> '',
        chr(6)=> '',
        chr(7)=> '',
        chr(8)=> '',
        chr(9)=> '',
        chr(10)=> '',
        chr(11)=> '',
        chr(12)=> '',
        chr(13)=> '',
        chr(14)=> '',
        chr(15)=> '',
        chr(16)=> '',
        chr(17)=> '',
        chr(18)=> '',
        chr(19)=> '',
        chr(20)=> '',
        chr(21)=> '',
        chr(22)=> '',
        chr(23)=> '',
        chr(24)=> '',
        chr(25)=> '',
        chr(26)=> '',
        chr(27)=> '',
        chr(28)=> '',
        chr(29)=> '',
        chr(30)=> '',
        chr(31)=> ''
    ));
    $str = str_replace("\'", "&#39;", $str);
    $str = str_replace('\\', "&#92;", $str);
    $str = str_replace("|", "I", $str);
    $str = str_replace("||", "I", $str);
    $str = str_replace("/\\\$/", "&#36;", $str);
    $str = mysql_real_escape_string($str);
    return $str;
ну или другие две, в зависимости от того какой вид должен иметь текст после выборки!

Tomson123 10.08.2017 23:45

А то малоли что отправят через авдресную строку=)

Tomson123 10.08.2017 23:52

Подскажите, есть код

$("#FormSubmit").click(function (e) {

        e.preventDefault();

        if($("#name").val()==="") //simple validation
        {
            alert("Введите текст!");
            return false;
        }


<form id="FormSubmit" action="add.php?id=<?=$id?>">
<div class="form_style">
 
Заголовок<input id="name" name="name" value="" type="text"/><br />
описание<textarea name="desc" id="desc" cols="45" rows="5"></textarea>
<button id="FormSubmit">Отправить</button>   
</div></form>


Проблема в том, что когда я кликаю мышкой по полю ввода скрипт отправляет уже пустые переменные name и desc и выходит окно с ошибкой alert("Введите текст!"); вчем моя ощибка?

laimas 11.08.2017 04:56

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

Цитата:

Сообщение от Tomson123
А то малоли что отправят через авдресную строку

Не надо заниматься чепухой - strtr, str_replace и mysql_real_escape_string при выводе данных из базы, это полнейшая чепуха.

mysql_real_escape_string - это для экранирования данных перед записью в базу для исключения инъекции. Эта функция используется оригинальным расширением MySQL, которое разработчики настоятельно не рекомендуют использовать так как в новых версиях РНР оно исключено. Вместо этого расширения используйте mysqli или PDO, и работая с БД посредством подготовленных запросов, в которых экранирование будет выполнятся автоматически самим драйвером.

При выводе данных из БД на страницу, и не только из БД, а любых данных полученных от клиента, к ним применяется функция htmlspecialchars в первую очередь с целю, чтобы заменить html представлением эти два символа: < и >. И делается это для того, чтобы исключить XSS атаку на страницах пользователей, не допустить выполнение любого внедренного кода. htmlentities - производит замену на html-сущности для всех возможных символов, в чем нет никакой необходимости.

Замена же "\'" на "'" и т.п., это глупости. Куда полезнее при записи данных пользователя в БД удалять экранирование пользователя. А каким методом произведен запрос можно узнать из $_SERVER["REQUEST_METHOD"], а с какого домена из $_SERVER["HTTP_ORIGIN"], правда старые браузеры такой заголовок могут и не передавать. В случае проверки браузер ли производит запрос, проверка сложнее.

Цитата:

Сообщение от Tomson123
Буду эксперементировать

Тут не эксперименты требуются, а подумать. Я надеялся, что возникнет вопрос после моего поста, а коли его нет, значит вы не понимаете "бесполезности" своей затеи "при успешном добавлении записи эта запись автоматически отображалась на странице". Это сделать не сложно, но смысл какой?

Пусть у вас всего 5 пользователей. В разные моменты времени они вошли на страницу и каждый из них получил записи из БД существующие на тот момент в базе. То чего вы хотите означает, что каждый из них добавляя новые записи в базу будет видеть только свои добавленные, а те, что могут добавлять в это же время другие пользователи нет. Так как запросы формы асинхронные и не вызывают перезагрузки страницы.

Не "эта запись" должна добавляться на страницу, а все новые записи, которые на момент добавления пользователем своей были добавлены в базу. То есть, например, записи выводятся в контейнерах DIV начиная с первой. Если в атрибут этих контейнеров помещать ID записей, то при отправлении формы нужно получать из атрибута последнего контейнера ID последней (для клиента) записи и отправлять его на сервер. После успешного добавления записи сервер должен получить записи по условию WHERE `type` = 1 AND id > $id ORDER BY id, где $id, это последняя запись существующая у клиента на странице. Вот это он должен вернуть клиенту, а клиент их добавит на страницу в новых добавленных контейнерах.

Цитата:

Сообщение от Tomson123
Проблема в том, что когда я кликаю мышкой по полю ...

Проблема в том, что $("#FormSubmit").click(function (e) { ... это полная ахинея. Что за событие формы обрабатывается в моем коде в строке 01?

Tomson123 11.08.2017 20:33

не асилил:help:

Tomson123 11.08.2017 20:48

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

Сообщение от Tomson123
А то малоли что отправят через авдресную строку
Не надо заниматься чепухой - strtr, str_replace и mysql_real_escape_string при выводе данных из базы, это полнейшая чепуха.

mysql_real_escape_string - это для экранирования данных перед записью в базу для исключения инъекции. Эта функция используется оригинальным расширением MySQL, которое разработчики настоятельно не рекомендуют использовать так как в новых версиях РНР оно исключено. Вместо этого расширения используйте mysqli или PDO, и работая с БД посредством подготовленных запросов, в которых экранирование будет выполнятся автоматически самим драйвером.

Смотри... вся эта чепуха прописана там не для радости или красоты!

Обьесняю! mysql_real_escape_string отвечает если я не ощибаюсь за то чтобы не было SQL иньекций! Торбишь чтобы какой нибудь залетный интузиаст не смог делать запросы в БД закоментировав часть моего обрашения к бд и прописав свое!

Эти постоянные переменные, функции обработки текста и т д служат для того чтобы какой нибудь дурачок не смог писать посты с сотней двумя буквами и сотней пробелов между неми ними! Чтобы небыло сотни отступов между двумя сообщениями! Да, можно было бы довольствоваться одной функцией htmlentities при этом на выдаче данные которые добавляются полностью без модерации могут быть засоренны сотней ненужных символом! Которые будут портить вид всего сайта, особенно если утебя еще идет и мобильная версия! Бывали случаи когда на форуме писали посты дети так что приходилось долго пролистывать вниз чтобы добраться до следушева поста, хотя в текушем было всего несколько слов!


Замена же "\'" на "'" и т.п., это глупости. Куда полезнее при записи данных пользователя в БД удалять экранирование пользователя. А каким методом произведен запрос можно узнать из $_SERVER["REQUEST_METHOD"], а с какого домена из $_SERVER["HTTP_ORIGIN"], правда старые браузеры такой заголовок могут и не передавать. В случае проверки браузер ли производит запрос, проверка сложнее.

И как ты видишь тогда BB теги сылок,html кода и т д на выдаче после того как ты порезал все теги там?

Tomson123 11.08.2017 20:52

Пусть у вас всего 5 пользователей. В разные моменты времени они вошли на страницу и каждый из них получил записи из БД существующие на тот момент в базе. То чего вы хотите означает, что каждый из них добавляя новые записи в базу будет видеть только свои добавленные, а те, что могут добавлять в это же время другие пользователи нет. Так как запросы формы асинхронные и не вызывают перезагрузки страницы.

Я вкурсе, эти данные будут подгружаться по определенному интервалу постепенно ((если такая необходимость есть, например в чате или на форуме) если же речь идет о информационых разделах то эти данные будут доступны пользователю когда он сам обновит страницу или же часть его содержания

Не "эта запись" должна добавляться на страницу, а все новые записи, которые на момент добавления пользователем своей были добавлены в базу. То есть, например, записи выводятся в контейнерах DIV начиная с первой. Если в атрибут этих контейнеров помещать ID записей, то при отправлении формы нужно получать из атрибута последнего контейнера ID последней (для клиента) записи и отправлять его на сервер. После успешного добавления записи сервер должен получить записи по условию WHERE `type` = 1 AND id > $id ORDER BY id, где $id, это последняя запись существующая у клиента на странице. Вот это он должен вернуть клиенту, а клиент их добавит на страницу в новых добавленных контейнерах.
Да, да именно так! Я все же смог разобраться с этой проблемой! И уже написал шпаргалку себе!

Сообщение от Tomson123
Проблема в том, что когда я кликаю мышкой по полю ...
Проблема в том, что $("#FormSubmit").click(function (e) { ... это полная ахинея. Что за событие формы обрабатывается в моем коде в строке 01?

Согласен, я там запутался и чуть пойже добавления того поста нашел где ощибся и все исправил! Спасибо.

laimas 12.08.2017 05:14

:D Ну юмористы. Я писал о том, что не нужно все что вам написано цитировать, включая и кучу кода, чего вами было сделано.

Теперь же, вы берете из моего цитаты, для комментирования, но не помещаете их в теги цитирования, и как теперь это прочесть? :)

Цитата:

Сообщение от Tomson123
mysql_real_escape_string отвечает если я не ощибаюсь за то чтобы не было SQL иньекций!

Я прекрасно осведомлен о данной функции и ее предназначении, но то что вы делаете, это полный бедлам. И вообще, пора выбрасывать в помойку оригинальное расширение MySQL. Кроме того, вы разработчик, вы и только вы определяете типы данных которыми будет производится обмен клиента с сервером. Допустим, серверный сценарий ожидает от клиента число идентификатор для выборки по нему из базы. В данном случае выгоднее привести полученное значение к ожидаемому типу и по результату делать или нет запрос к базе, чем использовать mysql_real_escape_string:

if($id = (int)$_POST['id']) {
    //запрос по WHERE id = $id
} else //подстава


Я не стану дальше комментировать ваши вопросы. Вы запутались в понимании и назначении функций, поэтому и "обезопасить" у вас превращается в кошмар.

Как быть с ВВ тегами, ссылками и прочим, это совсем иной вопрос, ибо формат ВВ и выбран таковым, что символы его описывающие не несут в себе никакой опасности. БД может хранить в себе любые "колющиеся и режущиеся предметы", окошмаривать их непотребными действиями при записи в базу потому, что страшно, это от недопонимания.


Часовой пояс GMT +3, время: 12:49.