редактирование на месте, как сделать больше полей БД редактируемыми - PullRequest
0 голосов
/ 12 ноября 2011

Добрый вечер, ребята!

Мне только что удалось внедрить действительно полезную функцию редактирования на месте с jQuery и AJAX. Я могу редактировать поле 1 дБ. Я хотел бы иметь возможность редактировать несколько полей БД. Это все сценарии:

Обновление запроса (handler.php)

  <?php
 include('../../core/additional/connect-db.php');

if (isset($_POST['id']) && 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;}
} 

?>

и аякс в голове

<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, "&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 и переименовал поля db, и сделал то же самое для скрипта 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 Ответ

1 голос
/ 13 ноября 2011

Возможно, вы захотите посмотреть, используя плагин Jeditable jQuery (http://www.appelsiini.net/projects/jeditable)), и для хорошего примера различных применений вы можете посмотреть демонстрационную страницу: http://www.appelsiini.net/projects/jeditable/default.html

Также,Я надеюсь, что вы на самом деле не собираетесь использовать этот php-скрипт для обновления базы данных, так как он уязвим для атак SQL-инъекций, поэтому это плохая практика.

И я не вижу ни одного элемента с классом editable в html, просто editBox.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...