选择后立即删除PHP DELETE

时间:2010-04-24 21:52:09

标签: php mysql select sql-delete

我有一个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;

2 个答案:

答案 0 :(得分:7)

您使用第二个声明覆盖了$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;

然后您甚至不必更改第二个语句的变量名称。但请考虑使用有意义的变量名称。

答案 1 :(得分:1)

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

我认为这样的事情可以解决问题:

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

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

这样,无需select查询,后跟delete查询。


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

在这里,您的$resul t变量用于多个事物,这使事情变得更难理解:

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

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