按名称删除表行

时间:2017-01-06 03:28:14

标签: php jquery mysql ajax dropzone.js

我正在使用dropzone.js将图像文件存储到文件夹中。问题是,所有上传的图片预览只会在dropzone field内显示,只要没有刷新或切换到同一页面上的其他链接,这些图片只能在上传后立即删除(请更正我如果我错在这里)

由于这种情况,我有一个想法,通过保存信息(例如文件名,大小,链接,类型等)以及上传到MySQL数据库,然后查询表输出,所以我以后可以从表格行中删除某些图像文件。

enter image description here

通常点击垃圾箱(观看附加图片),文件中的名称应由jQuery提取,然后由AJAX发送到PHP,以便从中删除该行数据库和文件从文件夹中取消链接。不知怎的,它在ID但不是name时效果很好。我在这里看不到可能的错误因此我需要你的帮助。我需要NAME而非jQuery提取ID非常重要。它甚至以这种方式工作吗?如果是这样,怎么样?如果没有,怎么样?

<table class="table table-striped table-hover droplist">
                <thead>
                    <tr>
                        <th>#</th>
                        <th>filename</th>
                        <th>size[bytes]</th>
                        <th>image</th>
                        <th>type</th>
                        <th>created_at</th>
                        <th>delete</th>
                    </tr>
                </thead>

<?php 
$statement = $pdo->prepare("SELECT * FROM file_upload ORDER BY id");
$result = $statement->execute();
$count = 1;
while($row = $statement->fetch()) {
    echo '<tr name="'.$row['name'].'">';
        echo "<td>".$count++."</td>";
        echo "<td>".$row['name']."</td>";
        echo "<td>".$row['size']."</td>";
        // echo '<td><a href="'.$row['link'].'">'.$row['link'].'</a></td>';
        echo "<td>".$row['type']."</td>";
        echo "<td>".date('d.m.Y H:i:s',strtotime($row['date']))."</td>";
        echo '<td><a class="delete" href="#"><i class="fa fa-trash" ></i></a></td>';
    echo "</tr>";
}
?>

dropzonelist.js

$('table.droplist td a.delete').click(function(e) {
    e.preventDefault();
    var name = $(this).parent().parent().prop('name');
    var data = 'name=' + name ;
    var parent = $(this).parent().parent();
    // alert(name),

    $.ajax({
        type: "POST",
        url: "delete_dropfile.php",
        data: data,
        cache: false,
        success: function(response) { 
            //...whatever

顺便说一下,警报(姓名)一直说:未定义! IDK

PHP脚本:

if(isset($_POST['name'])) {
    $file = $_POST['name'];
} else {
    die;
} 

// sql to delete a record
$filedel = "DELETE FROM file_upload WHERE name='$file'";
if ($pdo->exec($filedel)) {
    echo "(image)file successfully erased!";
}
unlink($_SERVER['DOCUMENT_ROOT'] . '/anydaynow/gallery/samples/' . $file);
?>

2 个答案:

答案 0 :(得分:2)

您需要使用prop(),而不是使用attr()来获取数据:

var name = $(this).parent().parent().attr('name');

您只能prop() <tr>支持class支持的idnameattr(),在您的情况下,您使用的<a> { {1}},不受支持。虽然echo '<td><a class="delete" href="#" data-artname="'.$row['name'].'">... 可用于不同的不支持的代码。

另一种方法:

一种方法是直接在var name = $(this).parent().parent().attr('name'); 上分配新标签,而不是通过父母两次:

var name = $(this).attr('data-artname');

所以,而不是使用名称获取名称:

dataLayer.push(
   {'userID': '<%= current_user.id %>'},
   {'userCategory': 'User'}
);

您可以使用以下方式获取相应的名称数据:

window.dataLayer = window.dataLayer || [];
window.dataLayer.push({
    'userID': '<%= current_user.id %>',
    'userCategory': 'User'
});

您可以查看此tags作为示例。

您仍然需要考虑@ e4c5

的答案和建议

答案 1 :(得分:1)

Javascript错误

您的javascript中存在问题。这是错误的。

var data = 'name=' + name ;

有时它会起作用,但是当文件名包含非字母数字字符时,即使是空格也会破坏。例如,如果文件名是hello world.jpg,它将被发送到服务器,但是服务器想要它hello+world.jpg你应该改为

 var data = {'name': name }

PHP错误

这也是错误的。

 $filedel = "DELETE FROM file_upload WHERE name='$file'";

特殊字符会破坏这一点,更糟糕的是它可能导致sql注入。修复为

$filedel = $pdo->prepare("DELETE FROM file_upload WHERE name=:file");
$filedel->execute(array(":file"=>$file));