#ajax #field
#ajax #поле
Вопрос:
Добрый вечер, ребята!
Мне только что удалось внедрить действительно удобную рабочую функцию редактирования на месте с помощью jQuery и AJAX. Я могу отредактировать 1 поле БД. Я хотел бы иметь возможность редактировать несколько полей БД. Это все сценарии:
Запрос на обновление (handler.php )
<?php
include('../../core/additional/connect-db.php');
if (isset($_POST['id']) amp;amp; isset($_POST['firstname'])) {
$firstname = mysql_real_escape_string($_POST['firstname']);
$id = mysql_real_escape_string($_POST['id']);
$query = "UPDATE players SET firstname ='$firstname' WHERE id='$id'";
$result = mysql_query($query) or die ('Query couldn't be executed');
if ($result) {echo 1;}
}
?>
И ajax в голове
<script type="text/javascript">
$(document).ready(function()
{
$(".editable").hover(
function()
{
$(this).addClass("editHover");
},
function()
{
$(this).removeClass("editHover");
}
);
$(".editable").bind("dblclick", replaceHTML);
$(".btnSave, .btnDiscard").live("click", handler);
UI("Ready");
function UI(state)
{
var status = {};
status.Ready = "Ready";
status.Post = "Saving your data. Please wait...";
status.Success = "Success! Your edits have been saved.";
status.Failure = "Attempts to save data failed. Please retry.";
var background = {};
background.Ready = "#E8F3FF";
background.Post = "#FAD054";
background.Success = "#B6FF6C";
background.Failure = "#FF5353";
$("#status").animate({opacity: 0}, 200, function (){$("#status").html(status[state]).css({background: background[state]}).animate({opacity: 1}, 200)});
}
function handler()
{
var selector="";
var code="21";
if ($(this).hasClass("btnSave"))
{
UI("Post");
var str = $(this).siblings("form").serialize();
$.ajax({
type: "POST",
async: false,
timeout: 100,
url: "core/actions/handler.php",
data: str,
success: function(msg){code = msg; $(".message_edit").show(); $(".message_edit").fadeOut(2500);},
});
if(code == 1)
{
UI("Success");
selector = "editBox";
}
else
{
UI("Failure");
selector = "buffer";
}
}
else {selector = "buffer"}
$(this).parent()
.html($(this).siblings("form")
.children("." selector)
.val())
.removeClass("noPad editHover")
.bind("dblclick", replaceHTML);
return false;
}
function replaceHTML()
{
var buffer = $(this).html()
.replace(/"/g, "amp;quot;");
$(this).addClass("noPad")
.html("")
.html("<form class="editor"><input type="text" name="firstname" class="editBox" value="" buffer "" /> <input type="hidden" name="buffer" class="buffer" value="" buffer "" /><input type="hidden" name="id" class="record" value="" $(this).attr("id") "" /></form><a href="#" class="btnSave">Save</a> <a href="#" class="btnDiscard">Cancel</a>")
.unbind('dblclick', replaceHTML);
}
}
);
</script>
Затем поле отображается и редактируется с помощью этого:
<td class="editable" id="' .($id). '" width="180">' .($task). ' </td>
Я мог бы скопировать и переименовать все скрипты, но я уверен, что это не идеальный способ сделать это. Я попытался скопировать скрипт в handler.php файл и переименовал поля БД, и сделал то же самое для сценария ajax. Но это не сработало. Я надеюсь, что моя «проблема» вам понятна, есть предложения?
Примечание: я думаю, что решение находится где-то в этой строке (внизу сценария ajax):
.html("<form class="editor"><input type="text" name="firstname" class="editBox" value="" buffer "" /> <input type="hidden" name="buffer" class="buffer" value="" buffer "" /><input type="hidden" name="id" class="record" value="" $(this).attr("id") "" /></form><a href="#" class="btnSave">Save</a> <a href="#" class="btnDiscard">Cancel</a>")
Заранее спасибо за помощь! 🙂
Комментарии:
1. Обязательно ли вам делать это с помощью jQuery или вы можете просто сделать это с помощью базового javascript? Если ваш инструмент затрудняет это, это простая задача, которую можно решить только с помощью javascript, если это возможно.
2. Здравствуйте, спасибо за ваш ответ 🙂 Я действительно предпочитаю использовать этот скрипт jQuery, потому что он работает действительно хорошо. Я знаю, что должен быть способ сделать больше полей редактируемыми с помощью того же скрипта..
Ответ №1:
Возможно, вы захотите рассмотреть возможность использования Jeditable
плагина jQuery (http://www.appelsiini.net/projects/jeditable ) а хороший пример различных применений вы можете посмотреть на демонстрационной странице: http://www.appelsiini.net/projects/jeditable/default.html
Кроме того, я надеюсь, что вы на самом деле не собираетесь использовать этот php-скрипт для обновления базы данных, поскольку он уязвим для атак с использованием SQL-инъекций, так что это плохая практика.
И я не вижу ни одного элемента с классом editable
в html, просто editBox
.
И, наконец, вы отправляете все элементы каждый раз, когда требуется внести изменения? Это довольно неэффективно, поскольку одним из преимуществ редактирования на месте является просто отправка небольших изменений каждый раз.
Комментарии:
1. Привет, Джеймс, спасибо за твой подробный ответ. Я попробую Jeditable еще раз, пробовал внедрять его раньше, но, поскольку я новичок, это все еще немного сбивает меня с толку. Что касается безопасности, можете ли вы указать мне на отличный учебник? Это как-то связано с _POST, верно? Еще раз спасибо, что уделили время, и хорошего вам дня 🙂
2. @MaartenHartman — Это не имеет ничего общего с _POST, а связано с тем фактом, что вы используете данные непосредственно в своем запросе к базе данных. Вот статья о проблеме: adamsinfo.com / … и вот одно руководство: forum.codecall.net/php-tutorials / …