【问题标题】:delete table row by name按名称删除表行
【发布时间】:2017-01-06 03:28:13
【问题描述】:

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

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

通过单击垃圾箱(观看附图),文件名通常应由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

顺便说一句,alert(name) 一直说:未定义!身份证

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);
?>

【问题讨论】:

  • 您能帮我一个忙,将您的 PHP 代码生成的 HTML 添加到某处吗?我看到您已经添加了生成 HTML 的 PHP 代码,但是没有数据供我用来填写该循环,我基本上是在和自己玩猜谜游戏。
  • PHP 脚本仅返回 echo 并作为成功警报发送到 JS 文件。就是这样。其他一切都在后面处理。
  • 你试过我的答案了吗?

标签: php jquery mysql ajax dropzone.js


【解决方案1】:

不用prop()获取数据,需要使用attr()

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

您只能将prop() 用于&lt;tr&gt; 支持的tags,例如classid,在您使用name 的情况下,不支持这些name。而attr() 可以用于不同的不受支持的标签。


另一种方法:

一种方法是直接在您的&lt;a&gt; 上分配一个新标签,而不是通过父级两次:

echo '<td><a class="delete" href="#" data-artname="'.$row['name'].'">...

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

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

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

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

您可以查看fiddle 的示例。


你还是要考虑@e4c5的回答和推荐

【讨论】:

  • 是的,现在可以正常使用了!竖起大拇指!我认为 .prop() 将是相同的,例如 .attr() 和 .attr() 同时已过时且不再使用。我必须再次检查两种方法之间的差异。太好了,你解决了这个奇怪的问题。
  • @what_me - 如果某个答案对您有帮助,您可以在答案左侧勾选相应的复选图标,或者为最能帮助您的答案投票。
【解决方案2】:

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));

【讨论】:

  • 即使将 JS 代码更改为 var data = {'name': name },它也会一直说:未定义!由于某种原因,似乎无法获取任何值(图像文件中的名称)。这很奇怪!知道还有什么问题吗?
  • 在您发布的代码中没有带有下拉列表类的表
  • 为什么你不直接将名字添加到&lt;a&gt;标签对我来说是个谜!
  • @e4c5 - 这就是我在回答中的建议:(
  • 顺便说一句,我们已经远离原来的问题了。那有两个问题,我帮你解决了。未定义的变量是另外一回事。如果您仍然遇到问题,请接受此问题并发布另一个问题
猜你喜欢
  • 1970-01-01
  • 2012-05-22
  • 2018-07-06
  • 2017-07-03
  • 1970-01-01
  • 2014-08-31
  • 1970-01-01
相关资源
最近更新 更多