【问题标题】:PHP DELETE immediately after select选择后立即删除 PHP
【发布时间】:2010-04-24 21:52:08
【问题描述】:

我有一个 PHP 服务器脚本,可以从 MySQL 数据库中选择一些数据。

一旦我将 mysql_query 和 mysql_fetch_assoc 的结果存储在我自己的局部变量中,我就想删除我刚刚选择的行。

这种方法的问题在于,PHP 似乎对我的局部变量进行了传递引用而不是传递值,并且我的局部变量在删除命令之后变得未定义。

有没有办法解决这个问题?这是我的代码:

    $query="SELECT id, peerID, name FROM names WHERE peer = $userID AND docID = '$docID' AND seqNo = $nid";
    $result = mysql_query($query);

    if (!$result)
        self::logError("FAIL:1 getUsersNamesUpdate() query: ".$query."\n");     

    if (mysql_num_rows($result) == 0)
        return array();

    $row = mysql_fetch_assoc($result);
    $result = array();
    $result["id"] = $row["id"];
    $result["peerID"] = $row["peerID"];
    $result["name"] = $row["name"];

    $query="DELETE FROM names WHERE id = $result[id];";
    $result = mysql_query($query);

    if (!$result)
        self::logError("FAIL:2 getUsersNamesUpdate() query: ".$query."\n");         

    return $result;

【问题讨论】:

    标签: php mysql select sql-delete


    【解决方案1】:

    您正在用您的第二条语句覆盖您的 $result 变量:

    $query="DELETE FROM names WHERE id = $result[id];";
    $result = mysql_query($query); // result does not contain the array anymore
    

    将名称更改为其他名称。它与引用调用等无关。


    实际上,您的第一次赋值是不必要的,因为$row 已经是一个数组:

    $row = mysql_fetch_assoc($result);
    $result = array();
    $result["id"] = $row["id"];
    $result["peerID"] = $row["peerID"];
    $result["name"] = $row["name"];
    

    你可以这样做:

    $row = mysql_fetch_assoc($result);
    // at the end
    return $row;
    

    那么您甚至不必为第二条语句更改变量名。但请考虑使用有意义的变量名。

    【讨论】:

    • 我在不到一秒的时间里就从这家伙在说什么转到 OMG 我是个白痴。谢谢!
    【解决方案2】:

    首先,为什么不只使用一个查询delete您感兴趣的行?

    我想这样的事情应该可以解决问题:

    delete 
    from names
    where peer = $userID 
      AND docID = '$docID' 
      AND seqNo = $nid
    

    当然,不要忘记转义/转换应该是的值;-)

    这样,不需要select 查询,然后是delete 一个。


    第二:为了使您的代码更易于阅读/理解/维护,您可能不应该将同一个变量重复用于多个不同的目的。

    在这里,您的 $result 变量用于不止一件事,它使事情变得更难理解:

    • 第一个mysql_query返回的资源
    • 那么,包含第一行数据的数组
    • 那么,第二个mysql_query返回的资源

    这有点令人困惑,而且总有一天会导致错误...
    实际上,它已经有了 ;-) :第三个任务是用第二个任务覆盖您获得的数据,并且繁荣,您丢失了与您的行相对应的信息'刚刚删除;-)

    【讨论】:

    • 谢谢,Felix 先提到了这个问题。我只是想知道“仅使用一个查询删除该行”是什么意思?我只使用一个查询?
    • 您正在使用 selectdelete :2 个查询。 ;;;相反,为什么不删除 select 查询,只使用 1 个查询:delete 一个? ;;;您可能只需要在 delete 查询中使用在初始 select 查询中使用的 where 子句。
    • 哦,现在我明白你在说什么了。我实际上需要我将要删除的数据。它将在被永久删除之前由服务器返回给客户端:)
    猜你喜欢
    • 1970-01-01
    • 2015-07-21
    • 1970-01-01
    • 2015-09-29
    • 2015-09-07
    • 1970-01-01
    • 2013-05-29
    • 1970-01-01
    • 2016-11-29
    相关资源
    最近更新 更多