سؤال

يولد البرنامج النصي PHP الخاص بي طاولة تحتوي على صفوف يمكن تحريرها أو حذفها. هناك أيضا إمكانية إنشاء صف جديد.

أواجه صعوبة في معرفة كيفية تحديث صفوف HTML التي يتم إنشاؤها من خلال PHP وإدراجها عبر JQuery. بعد التحديث، يجب أن لا يزال قابلة للتحرير. يتم إنشاء HTML في DIV.

  1. jQuery (إدراج HTML / انتظار إنشاء)

  2. PHP (توليد HTML)

  3. العودة إلى الخطوة 1)

(تحرير: تصحيح خطأ وتغيير البرنامج النصي للإجابة)

بي أتش بي

require_once "../../includes/constants.php";

// Connect to the database as necessary
$dbh = mysql_connect(DB_SERVER, DB_USER, DB_PASSWORD) or die("Unaable to connnect to MySQL");

$selected = mysql_select_db(DB_NAME, $dbh) or die("Could not select printerweb");

$action = $_POST['action'];
$name = $_POST['name'];
$id = $_POST['id'];

if ($action == "new") {
    mysql_query("INSERT INTO place (id, name) VALUES (NULL, $name)");
}
elseif ($action == "edit") {
    mysql_query("UPDATE place SET name = $name WHERE id = $id");
}
elseif ($action == "delete") {
    mysql_query("DELETE FROM place WHERE id = $id");
}

echo "<table><tbody>";
$result = mysql_query("SELECT * FROM place");
while ($row = mysql_fetch_array($result)) {
    echo "<tr><td id=" . $row["id"] . " class=inputfield_td><input class=inputfield_place type=text value=" . $row["name"] . " /></td><td class=place_name>" . $row["name"] . "</td><td class=edit>edit</td><td class=cancel>cancel</td><td class=delete>delete</td><td class=save>SAVE</td></tr> \n";
}
echo "</tbody>";
echo "</table>";
echo "<input type=text class=inputfield_visible />";
echo "<button class=new>Neu</button>";

ج إس

$(function() {
    $.ajax({
        url: "place/place_list.php",
        cache: false,
        success: function(html) {
            $("#place_container").append(html);
        }
    });
    $(".edit").live("click", function() {
        $(this).css("display", "none").prevAll(".place_name").css("display", "none").prevAll(".inputfield_td").css("display", "block").nextAll(".cancel").css("display", "block").nextAll(".save").css("display", "block").prevAll(".inputfield_td").css("display", "block");
    });
    $(".cancel").live("click", function() {
        $(this).css("display", "none").prevAll(".edit").css("display", "block").prevAll(".place_name").css("display", "block").prevAll(".inputfield_td").css("display", "none").nextAll(".save").css("display", "none");
    });
    $(".save").live("click", function() {
        var myvariable1 = $(this).siblings().find("input[type=text]").val();
        var myvariable2 = $(this).prevAll("td:last").attr("id");
        $(this).css("display", "none").prevAll(".cancel").css("display", "none").prevAll(".edit").css("display", "block").prevAll(".place_name").css("display", "block").prevAll(".inputfield_td").css("display", "none");
        alert("save name: " + myvariable1 + " save id: " + myvariable2);
    });
    $(".delete").live("click", function() {
        var myvariable3 = $(this).prevAll("td:last").attr("id");
        alert(myvariable3);
    });
    $(".new").live("click", function() {
        var myvariable4 = $(this).prevAll("input[type=text]").val();
        $.post("place/place_list.php", {
            action: "new",
            name: "" + myvariable4 + ""
        });
    });
});
هل كانت مفيدة؟

المحلول

ضع كل معالجات الحدث الخاصة بك خارج وظيفة AJAX واستخدام live() طريقة بدلا من ذلك. وتحتاج إلى تضمين البيانات التي يجب إرسالها عند استخدام AJAX. من VisualJQuery.:

$(function() {
    $.ajax({
        type: "POST",
        url: "some.php",
        data: "name=John&location=Boston",
        success: function(msg){
            alert( "Data Saved: " + msg );
        }
    });

    $(".edit").live("click", function() {
        //event handler code here
    });
    //more event handlers
});

نصائح أخرى

أعتقد أنك لا تحصل على الأحداث النارية للتحرير والحذف وما إلى ذلك بعد أن يتم إلحاق صفوف جديدة من PHP إلى DIV.

حاول استخدام JQuery Live Plugin لربط الأحداث عند إنشاء أشياء جديدة. يرجى الرجوع إلى هذه سؤال التعامل مع مشكلة مماثلة.

يحب بيرييكس و ThevillageIdiot. وأشار خارج، والمساعد المباشر ربما مفيد. ومع ذلك، هناك بعض الأشياء الأخرى التي قد تكون خاطئا في التعليمات البرمجية الخاصة بك:

أولا، HTML الخاص بك غير صالح. يجب عليك وضع اقتباسات حول القيم المعزول. يمكنك القيام بذلك ضمن اقتباسات من خلال الهروب من اقتباسات الداخلية مع خطأ في الخلفية:

echo "<input type=\"text\" class=\"inputfield_visible\" />";

نظرا لأن هذا لا يبدو لطيفا، فيمكنك مغادرة جزء PHP واكتب HTML نقي إذا قمت بتغيير هذا:

<?php
    ...
    echo "</tbody>";
    echo "</table>";
    echo "<input type=text class=inputfield_visible />";
    echo "<button class=new>Neu</button>";
?>

إلى ذلك (IMHO أكثر قابلية للقراءة):

<?php
    ...
?>

</tbody>
</table>
<input type="text" class="inputfield_visible" />
<button class="new">Neu</button>

ثانيا، وهذا يبدو أنه أكثر أهمية، يبدو لي وكأنه لديك ضعف SQLinjection، لأنك تمر بقيم الحقل مباشرة إلى MySQL دون استخدام mysql_real_escape_string. أول. أنا لست ذلك في PHP، لذلك ربما حصلت على هذا الخطأ، ولكن ماذا يحدث إذا أدخلت ';-- في لك حقول الإدخال؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top