2012-10-23 68 views
1

我有一個問題需要您提升我的知識。如何使用Ajax即時獲取ID

我想創建一個內聯編輯頁面,數據存儲在數據庫中。 在表格「內容」中,我創建了兩個用於測試目的的字段,即「id」和「text」字段。

如果我想用「id = 25」或id = X來修改字段,我知道如何手動執行,只需在MySQL查詢中指定「WHERE id = 25」,但如果我有一個列表的1000個條目,我如何修改查詢以實時獲取ID?

下面是代碼,我玩:

的index.php文件

<style> 
body {  
    font-family: Helvetica,Arial,sans-serif; 
    color:#333333; 
    font-size:13px; 
} 

h1{ 
    font-family: Georgia, Times, serif; 
    font-size: 28px;   
} 

a{ 
    color: #0071D8; 
    text-decoration:none; 
} 

a:hover{ 
    text-decoration:underline; 
} 

:focus { 
    outline: 0; 
} 

#wrap{ 
    width: 500px; 
    margin:0 auto;    
    overflow:auto;  
} 

#content{ 
    background: #f7f7f7; 
    border-radius: 10px; 
} 

#editable {  
    padding: 10px;  
} 

#status{ 
    display:none; 
    margin-bottom:15px; 
    padding:5px 10px; 
    border-radius:5px; 
} 

.success{ 
    background: #B6D96C; 
} 

.error{ 
    background: #ffc5cf; 
} 

#footer{ 
    margin-top:15px; 
    text-align: center; 
} 

#save{ 
    display: none; 
    margin: 5px 10px 10px;  
    outline: none; 
    cursor: pointer;  
    text-align: center; 
    text-decoration: none; 
    font: 12px/100% Arial, Helvetica, sans-serif; 
    font-weight:700;  
    padding: 5px 10px; 
    -webkit-border-radius: 5px; 
    -moz-border-radius: 5px; 
    border-radius: 5px; 
    color: #606060; 
    border: solid 1px #b7b7b7; 
    background: #fff; 
    background: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#ededed)); 
    background: -moz-linear-gradient(top, #fff, #ededed); 
    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#ededed'); 
} 

#save:hover 
{ 
    background: #ededed; 
    background: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#dcdcdc)); 
    background: -moz-linear-gradient(top, #fff, #dcdcdc); 
    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#dcdcdc'); 
} 

</style> 

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.4/jquery.min.js" type="text/javascript"></script> 
<script> 
$(document).ready(function() { 

$("#save").click(function (e) {   
    var content = $('#editable').html();  

    $.ajax({ 
     url: 'save.php', 
     type: 'POST', 
     data: { 
     content: content 
     },    
     success:function (data) { 

      if (data == '1') 
      { 
       $("#status") 
       .addClass("success") 
       .html("Data saved successfully") 
       .fadeIn('fast') 
       .delay(3000) 
       .fadeOut('slow'); 
      } 
      else 
      { 
       $("#status") 
       .addClass("error") 
       .html("An error occured, the data could not be saved") 
       .fadeIn('fast') 
       .delay(3000) 
       .fadeOut('slow'); 
      } 
     } 
    }); 

}); 

$("#editable").click(function (e) { 
    $("#save").show(); 
    e.stopPropagation(); 
}); 

$(document).click(function() { 
    $("#save").hide(); 
}); 

}); 
</script> 

</head> 
<body> 
<div id="wrap"> 

    <div id="status"></div> 

    <div id="content"> 

    <div id="editable" contentEditable="true"> 
    <?php 
     //get data from database. 
     include("db.php"); 
     $sql = mysql_query("select * from content"); 
     $row = mysql_fetch_array($sql);  
     echo $row['id']; 
     echo "<br />"; 
     echo $row['text']; 
    ?>  
    </div> 

    <button id="save">Save</button> 
    </div> 

</div> 
    </body> 

這裏是save.php文件:

include("db.php"); 


$content = $_POST['content']; //get posted data 
$content = mysql_real_escape_string($content); //escape string 

$sql = "UPDATE content SET text = '$content' WHERE id = '$id' "; 

if (mysql_query($sql)) 
{ 
    echo 1; 
} 

我知道這可能是一個愚蠢的問題,但我是一個新手。

非常感謝您的幫助。

UPDATE: 感謝名單路易斯我定我的老問題,但我不知道爲什麼,如果我把所有的代碼在一段時間只「保存」的第一個條目的按鈕是否工作良好,其餘不,任何提示? 目前我只測試「description_text」。

這裏是「而」代碼:對的index.php這部分代碼移到開始,這樣你就可以在腳本的其餘部分使用相同瓦爾

<?php 

    /////////// Now let us print the table headers //////////////// 

    $query =" SELECT * FROM gallery ORDER BY id DESC "; 

    $result = mysql_query($query) or die(mysql_error()); 

    echo "<div style='width: 100%; text-align: center;'>";     
    echo "<table style='margin: auto auto;'>"; 
    echo "<tr><th>ID</th><th>Image</th><th>Category</th><th>Description</th><th>Added on</th></tr>"; 

    while($ordinate = mysql_fetch_array($result)) 
    { 

    $id  = $ordinate['id']; 
    $img_name = $ordinate['img_name']; 
    $category  = $ordinate['category']; 
    $description_text = $ordinate['description_text']; 
    $insert_datetime = $ordinate['insert_datetime']; 

    echo "<tr><td style='width: 20px;'>".$id."</td><td style='width: 210px;'><img src='../../upload/content/uploaded_images/". $img_name ."' width='200px'></td><td style='width: 100px;'>".$category."</td><td style='width: 100px;'><div id='status'></div><div id='content'><div id='editable' contentEditable='true'>".$description_text."</div><button id='save'>Save</button></div></td><td style='width: 100px;'>".$insert_datetime."</td></tr>";   

    } 
    echo "</table><br /><br /></div>"; 
?> 
+0

'我怎麼能修改查詢以獲得對fly'其中ID你想從ID獲取ID嗎? –

回答

3

<?php 
    //get data from database. 
    include("db.php"); 
    $sql = mysql_query("select * from content"); 
    $row = mysql_fetch_array($sql);  
    // echo $row['id']; but keep this ones in its original place inside their <%php %> tags 
    // echo "<br />"; 
    // echo $row['text']; 
?>  

在Ajax調用之後,插入此PHP線:

data: { 
    content: content 
    <?php 
    echo ", id: ".$row['id']; 
    echo ", token: '".md5('my SALT text'.(int)$row['id'])."'"; // strongly!!! recomended, not mandatory 
    ?> 
    },  

和save.php

$id = (int)$_POST['id'];     // (int) sanitizes id 
    $token = $_POST['token']; 
    if(md5('my SALT text'.$id)!=$token) die(); // or whatever but do not execute update 
               // perhaps echo 0; die(); 

    // ... rest of your code .... 
    $sql = "UPDATE content SET text = '$content' WHERE id = $id" 

令牌,防止有人使用您的save.php風險作爲在桌子上的每個帖子上注入任何東西的一種方式。

至少,建議:使用mysqli_query(注意我)而不是mysql_query,因爲這最後一個棄用。此外,但有更多的差異,您可以使用PDO

+0

謝謝你的快速回答。如果我這樣做,「保存」按鈕不會再出現,我不能保存:( – Mark

+0

是的,因爲這個答案是不正確的...第一'行['id']'沒有定義在用作ajax參數的點,第二個不需要改變'WHERE id ='$ id'「','save.php'中的第三個'$ id'應該先初始化'$ id = $ _POST ['id']'... – Reflective

+0

@ Reflective你是對的,我正在接受一半的問題,現在我正在糾正它,我還將添加一個令牌,以避免因不正當使用ajax調用而造成的損壞,但是需要一點時間 –

0

您可以使用INSERT聲明與ON DUPLICATE KEY UPDATE。但是你應該讓你在數據庫中的UNIQUE列爲id

使用INSERT INTO `table` (id, text) VALUES (id1, text1), (id2, text2), ...;語法

VALUES後的部分使用$_POST生成周期。

INSERT statement MySql doc page

0

而不是簡單地呼應$行[「身份證」],呼應其與特定ID的HTML元素中,以便它可以從jQuery的訪問,並且可以發佈。

<span id="idfield"><?php echo $row['id']; ?></span> 
<button id="save">Save</button> 
</div>  

然後,裏面的javascript:

$("#save").click(function (e) {   
    var content = $('#editable').html();  
    var id = $('#idfield').html(); 

用它作爲POST參數:

$.ajax({ 
     url: 'save.php', 
     type: 'POST', 
     data: { 
     content: content, 
     id: id 
     },