2012-07-03 54 views
1

我想扩展我的PHP技能,所以我通读了tutorialzine教程。我理解本教程中提供的说明。但是当谈到扩展它时,我似乎缺乏连接。我的主要目标是在单击标签时简单地删除选定的笔记。不过,我不知道如何选择分配给笔记的ID,以便能够将它传递给我的删除功能。如何在点击链接时删除数据库条目

来源:http://tutorialzine.com/2010/01/sticky-notes-ajax-php-jquery/

感谢您的帮助。

<?php 
error_reporting(E_ALL^E_NOTICE); 
require 'connect.php'; 
mysql_query("DELETE FROM notes WHERE id>3 AND dt<SUBTIME(NOW(),'0 1:0:0')"); 
$query = mysql_query("SELECT * FROM notes ORDER BY id DESC"); 

$notes = ''; 
$left=''; 
$top=''; 
$zindex=''; 

while($row=mysql_fetch_assoc($query)){ 
    list($left,$top,$zindex) = explode('x',$row['xyz']); 
    $notes.= ' 
     <div class="note '.$row['color'].'" style="left:'.$left.'px;top:'.$top.'px;z-index:'.$zindex.'"> 
      '.htmlspecialchars($row['text']).' 
      <div class="author">'.htmlspecialchars($row['name']).'</div> 
      <span class="data">'.$row['id'].'</span> 
      <a id="remove_note" href="javascript:;" onclick="deleteNote('<? echo $row['id']; ?>');">&nbsp;</a> 
     </div>'; 
} 
function deleteNote(id){ 
    $sql="DELETE FROM notes WHERE id='$rows['id']'"; 
    $result=mysql_query($sql) or die("Error when tryin to delete note."); 
} 
?> 

更新:

我一直在玩这个周围,既安德鲁和sachleen所提供的答案。由于您提到了整个SQL注入问题,因此不适合使用AJAX替代方案。但我仍然有问题将ID传递给remove.php文件。我相信这与$ note是如何从数据库创建信息有关。

我这样说是因为我得到:解析错误:语法错误,意想不到的T_STRING在/home/avonamyd/public_html/projects_php/sticky_notes/demo.php上线24

而这仅仅是当我有代码来自sachleen。但是,当我更新它以解释单引号时,我有以下代码。该id存在并传递给remove.php文件,但我仍然收到错误。这是当我使用我的代码或你提供的。

 $notes.= ' 
     <div class="note '.$row['color'].'" style="left:'.$left.'px;top:'.$top.'px;z-index:'.$zindex.'"> 
      '.htmlspecialchars($row['text']).' 
      <div class="author">'.htmlspecialchars($row['name']).'</div> 
      <span class="data">'.$row['id'].'</span> 
      <a id="remove_note" target="_blank" href="remove.php?id='.$row['id'].'">&nbsp;</a> 
     </div>'; 

下面是我目前在我的remove.php文件:

<?php 
include 'connect.php'; 
$_GET['id']; 
function deleteNote($id){ 
    $sql="DELETE FROM notes WHERE id='$id'"; 
} 
    $result=mysql_query($sql) or die("Error when tryin to delete note."); 

>

更新

我在另一回声线增加整个remove.php,这就是我想要的。

<?php 
include 'connect.php'; 
$_GET['id']; 
echo $id; --doesnt show 
function deleteNote($id){ 
    echo "hello"; --doesnt show 
    $sql="SELECT FROM notes WHERE id='$id'"; 
} 
echo 'hello2'; --shows 
$result=mysql_query($sql) or die("Error when tryin to delete note."); 

>

更新: 谢谢大家的这个项目,我终于得到了概念点击在我的脑海一些修修补补后,周围的帮助。我将发布下面的功能代码,以供任何其他人发现此代码。 = D Thx Everyone!

demo.php

error_reporting(E_ALL^E_NOTICE); 
require 'connect.php'; 
mysql_query("DELETE FROM notes WHERE id>3 AND dt<SUBTIME(NOW(),'0 1:0:0')"); 
$query = mysql_query("SELECT * FROM notes ORDER BY id DESC"); 

$notes = ''; 
$left=''; 
$top=''; 
$zindex=''; 

while($row=mysql_fetch_assoc($query)){ 
    list($left,$top,$zindex) = explode('x',$row['xyz']); 
    $id = $row['id']; 
    $notes.= ' 
     <div class="note '.$row['color'].'" style="left:'.$left.'px;top:'.$top.'px;z-index:'.$zindex.'"> 
      '.htmlspecialchars($row['text']).' 
      <div class="author">'.htmlspecialchars($row['name']).'</div> 
      <span class="data">'.$row['id'].'</span> 
      <a id="remove_note" target="_blank" href="remove.php?id='.$row['id'].'">&nbsp;</a> 
     </div>'; 
} 

remove.php

<?php 
include 'connect.php'; 
$id = intval($_GET['id']); 
$sql="DELETE FROM notes WHERE id=$id"; 
$result = mysql_query($sql) or die("Unable to delete database entry."); 

?>

+1

在代码的更新版本中,您有'deleteNote'函数,但它不会被调用。此外,您正尝试使用您尚未分配的变量“$ id”。我会说你应该摆脱deleteNote函数并分配$ id = $ _GET ['id']'请记住,_ajax不会保护你免受sql injection_ - 你仍然需要清理id传入。 – Andrew

回答

3

看起来你正在尝试混合使用JavaScript和PHP。当你的链接被点击时,你不能调用deleteNote()函数,因为它是一个PHP函数。有一对夫妇的方式去调用PHP脚本删除注:

使用类似以下内容:

<?php 
// ... 
$id_to_delete = $_GET['id']; 
if(isset($id_to_delete)) { 
    $sql="DELETE FROM notes WHERE id='$id_to_delete'"; 
    $result=mysql_query($sql) or die("Error when tryin to delete note."); 
} 
$query = mysql_query("SELECT * FROM notes ORDER BY id DESC"); 

//... 

while($row=mysql_fetch_assoc($query)){ 
    //... 
    echo '<a id="remove_note" href="CURRENT_SCRIPT_URL?id=' . $id_to_delete . '">X</a>'; 
    //... 
} 
?> 

或者你可以创建一个基于数据库中删除行第二个脚本在传递给它的数据上并使用ajax(我会建议使用jQuery的ajax功能)使用要删除的项目的id来调用该脚本。

请记住,任何人都可以使用GET参数调用脚本并从数据库中删除记录(或者更糟糕的是,执行SQL注入攻击),因此请确保您有某种安全措施,除非您希望所有你的记录消失了!

+0

我已经对帖子进行了更新,我不知道这是否会有所不同,但我也更新了我的js文件,以便在创建新笔记时也可以删除它们。但我不认为这是造成记录不能从数据库中删除的原因。 – Khaza

3

你不能onclick一个PHP函数。您正在将JavaScript与PHP混合使用。我这样做:

<a id="remove_note" href="remove.php?id=<?php echo $row['id']; ?>">Remove</a> 

,然后remove.php使用$_GET['id']获得ID并传递到DELETE查询。

+2

实际上它比PHP和JS混淆更糟糕 - 它令客户端和服务器端混淆! (+1) – alfasin

1

你有2个选项。

1)make <a href="another_php_script.php?delete=true">(或类似的),然后运行删除脚本。 (然后返回到您所在的页面)。

这是因为您无法运行onClick php函数,您必须重定向到其他页面。

2)您可以使用onclick函数调用AJAX脚本,并从您所在的页面执行删除PHP脚本 - 无需重定向。

选项1是简单的选项,选项2是更好的选择。

+0

我可以同意,使用AJAX将是一个更好的选择,我计划更新它来使用它。但我想确保我理解PHP如何传递信息。无论如何我已经更新了代码以使用单独的文件来删除记录。但是,我现在遇到了记录未被删除的问题。是否因为该文件没有连接到我的数据库? – Khaza

+0

它可能是,你是否包括一个文件,是为了连接? 如果是这样,请运行测试SQL语句并返回结果。现在就开始调试。 为了确保您知道PHP传递信息的方式 - 它只是连接到URL的GET和POST参数。 – jared

+0

是的,connect.php确实工作,因为我无法访问数据库从中获取信息。该文件也在新的remove.php文件的根目录下,因此它不是文件路径问题。 =/ – Khaza