
08.06.2016, 22:18
|
Аспирант
|
|
Регистрация: 22.02.2016
Сообщений: 98
|
|
undefined в POST запросе
Здравствуйте. Имеется форма на php
<form id='submit_wall' name='funforma' >
<p><div class='textarea_stena' id='".$row['id']."' name='comment' tabindex='0' contenteditable='true' ondragend='return true' ></div>
<p> <input type='hidden' name='messageid' id='".$row['id']."' value='".$row['id']."'></p>
<div id='smiles'>
<img src='smile/1.gif'>
<img src='smile/2.gif'>
<img src='smile/3.gif'>
</div>
";
$stena_group .= '<p><a href="javascript:void(0);" onclick="comment( document.getElementById('.$row['id'].').value, '.$row['id'].' );">
Отправить</a> </p>
</form>
Код который отображает смайлики в textarea и отправляет POST запрос скрипту PHP
function comment(text, message_id){
$.ajax({
type: "POST",
url: "profile.php",
data:"comment=" + text+"&messageid="+message_id,
success: function(){
$("ul#wall").prepend("<li style=\"display: none;\">"+ text +"</li>");
$("ul#wall li:first-child").fadeIn();
}
});
return false;
};
var arr = document.getElementById('smiles').getElementsByTagName('img');
for(var i in arr) {
if(arr.hasOwnProperty(i)) {
arr[i].onclick = function(event) {
if('img' === this.tagName.toLowerCase()) {
var img = ' <img class="emoji" src="'+this.src+'"> ';
document.execCommand('insertHTML', false, img);
}
};
}
}
Стиль textarea
.textarea_stena{background:#FFFFFF;color:black;border:1px solid #C0CAD5;width:328px;min-height:
40px;padding:3px 25px 3px 3px;padding-bottom:5px;margin-bottom:3px;
outline:0;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;line-height:150%;word-wrap:break-word;cursor:text;}
.emoji{margin:0px;border:none;vertical-align:top;
}
Сообщения из базы данных выводятся через цикл, где в коде PHP row['id'] - это уникальный ид сообщения.
Смайлики отображаются как необходимо в textarea, только работает код только с самым первым textarea который выводит сообщение из базы данных, с другими почему-то не работает. Так же при попытке отправить POST запрос в базу записывается undefined. Если Вас не затруднит, не могли бы пожалуйста объяснить где моя ошибка с отправкой POST(ошибка undefined) и так же с передачей фокуса разным textarea с уникальными id.
Прикладываю скрин-шот

77,78,79 - это id'ы сообщений, смайлик могут отобразить только в первом 77 textarea. В другие при клике по смайлику их не отображает, но если перетащить мышкой, тогда отобразятся.
Последний раз редактировалось Salvat, 08.06.2016 в 22:24.
|
|

08.06.2016, 23:31
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Идентификаторы должны быть уникальны.
|
|

09.06.2016, 00:51
|
Аспирант
|
|
Регистрация: 22.02.2016
Сообщений: 98
|
|
laimas, раньше форма имела вид
<form id='submit_wall' name='funforma' >
<p><textarea type='text' name='comment' id='".$row['id']."' value='' style='height:100p' /></textarea>
<p> <input type='hidden' name='messageid' id='".$row['id']."' value='".$row['id']."'></p> <div class='smile'>
<a href='javascript:x()' onclick=\"InsertSmile(':-*')\"><img src='smile/1.gif'/></a>
<a href='javascript:x()' onclick=\"InsertSmile(':)')\"><img src='smile/2.gif'/></a>
<a href='javascript:x()' onclick=\"InsertSmile(':(')\"><img src='smile/3.gif'/></a>
<a href='javascript:x()' onclick=\"InsertSmile(';)')\"><img src='smile/4.gif'/></a>
<a href='javascript:x()' onclick=\"InsertSmile(':P')\"><img src='smile/5.gif'/></a>
<a href='javascript:x()' onclick=\"InsertSmile('8)')\"><img src='smile/6.gif'/></a>
<a href='javascript:x()' onclick=\"InsertSmile(':D')\"><img src='smile/7.gif'/></a>
<a href='javascript:x()' onclick=\"InsertSmile('=O')\"><img src='smile/9.gif'/></a>
<a href='javascript:x()' onclick=\"InsertSmile(':-x')\"><img src='smile/10.gif'/></a>
<a href='javascript:x()' onclick=\"InsertSmile('(T_T)')\"><img src='smile/11.gif'/></a>
";
$stena_group .= '<p><a href="javascript:void(0);" onclick="comment( document.getElementById('.$row['id'].').value, '.$row['id'].' );">
Отправить</a> </p>
</form>
JavaScript без проблем отправлял POST запрос с одинаковыми id.
|
|

09.06.2016, 05:52
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Серверу эти ID как собаке пятая лапа, он получает в качестве ключей имена, а вот для JS нет. Во-первых значение id не должно начинаться цифры, иначе невалидно. Но самая проблема, это обращения к объекту по его ID - JS найдет первый из них в дереве DOM, а остальные с таким же значением для него существовать не будут.
Если форма имеет множество полей и имена полей одинаковы, то имя поля должно быть ключом массива:
name="comment['.$row['id'].']"
и надобность в скрытом поле отпадает.
РНР строковые значения заключенные в двойные кавычки подвергает разбору. Вам этого не требуется, а вы напрасно заставляете это его делать.
Наведите сперва порядок с ID, а уж затем остальное.
Последний раз редактировалось laimas, 09.06.2016 в 05:55.
|
|

09.06.2016, 12:13
|
Аспирант
|
|
Регистрация: 22.02.2016
Сообщений: 98
|
|
Цитата:
|
Если форма имеет множество полей и имена полей одинаковы, то имя поля должно быть ключом массива:
name="comment['.$row['id'].']"
и надобность в скрытом поле отпадает.
|
Благодарю за этот совет, только скрытое поле мне необходимо чтобы заносить id сообщения в базу данных вместе с комментарием. Для того, чтобы построить диалог, знать к какому сообщению относится комментарий.

Это старая форма и вот сам JS
var ie=document.all?1:0;
var ns=document.getElementById&&!document.all?1:0;
function InsertSmile(SmileId)
{
if(ie)
{
document.all.comment.focus();
document.all.comment.value+=" "+SmileId+" ";
}
else if(ns)
{
document.forms['funforma'].elements['comment'].focus();
document.forms['funforma'].elements['comment'].value+=" "+SmileId+" ";
}
else
alert("ошибка браузера");
}
Меня этот код не устраивает тем, что смайлики первоначально отображаются ввиде символов. Так же только к первому textarea можно добавлять смайлики. Да, я понимаю, в коде что привожу выше, все заносится в массив. Но мне необходимо все реализовать совсем другим методом. ID сообщений в базу данных пишутся как положенно, что в первом, что во втором коде. Только код который в первом посте пишет в БД undefined.
|
|

09.06.2016, 12:20
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Сообщение от Salvat
|
только скрытое поле мне необходимо чтобы заносить id сообщения в базу данных вместе с комментарием.
|
Для этой цели оно как раз и не нужно - каждое поле формы может содержать этот ключ.
Сообщение от Salvat
|
Меня этот код не устраивает тем, что смайлики первоначально отображаются ввиде символов.
|
А сказать где у вашего решения дыра или сами догадаетесь?
|
|

09.06.2016, 12:24
|
Аспирант
|
|
Регистрация: 22.02.2016
Сообщений: 98
|
|
Скажите, если не сложно, а то уже как сами видите не первый вариант пытаюсь наладить для нужного мне результата.
|
|

09.06.2016, 13:10
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Вы разрешаете клиентам помещать в сообщения html-код - изображения. А для того чтобы смайлы работали они в сообщениях должны быть как есть. Это означает, что нельзя пропустить сообщение через htmlspecialchars перед выводом клиенту, что делается обязательно, чтобы не допустить на странице XSS атак. А значит любой ушлый может поместить в него куда белее вредное, нежели картинку.
Вам придется разбирать посредством рег. выражений каждый пост, отсеивая разрешенное и запрещенное. То есть ваш подход, это не лучшее, что можно сделать. Визуальные редакторы тоже используют подобное решение, но только серверу отправляется textarea, которая на время работы редактора "в тени", а данные которые в нее пишет визуальный редактор обрабатываются.
В простейшем случае таким же образом можно писать в textarea (в фоновом режиме) не html-теги, а ВВ-теги. Можно вообще без тегов обойтись, а писать  , :0), ... А в div (панели сообщения) естественно будет смайл. В этом случае форма отправляет текст, который без проблемы можно обработать htmlspecialchars, и заменить ВВ-теги или мнемоники на смайлы.
При этом при отключенном JS форма будет работать обычным способом, ваша же не сможет отправить сообщения.
Последний раз редактировалось laimas, 09.06.2016 в 13:12.
|
|

09.06.2016, 13:37
|
Аспирант
|
|
Регистрация: 22.02.2016
Сообщений: 98
|
|
Спасибо за совет, только пока у меня проблема не с защитой, а с отправкой самого сообщения. Фильтрацию я напишу чтобы не было XSS уязвимостей. С этим я знаком.
Цитата:
|
В простейшем случае таким же образом можно писать в textarea (в фоновом режиме) не html-теги, а ВВ-теги. Можно вообще без тегов обойтись, а писать , :0), ... А в div (панели сообщения) естественно будет смайл. В этом случае форма отправляет текст, который без проблемы можно обработать htmlspecialchars, и заменить ВВ-теги или мнемоники на смайлы.
При этом при отключенном JS форма будет работать обычным способом, ваша же не сможет отправить сообщения.
|
Можете, пожалуйста, пояснить по побродней, не совсем понял принцип реализации данного метода.
|
|

09.06.2016, 13:57
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Texarea скрывается, а все изменения в DIV записываются в нее. Это можно делать как по событию, так и по таймеру. При этом если в DIV помещен смайл, то в texarea записывается или ВВ-код [IMG] или, что вполне достаточно для смайлов, просто его мнемоника. Серверу отправляется форма, ее поля, а не то что в DIV.
Серверу достаточно обработать вывод и заменить ВВ или мнемоники на смайлы. Это все подробности.
|
|
|
|