3

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

2 回答 2

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;

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

于 2010-04-24T21:55:42.837 回答
1

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

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

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

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

这样,就不需要一个select查询,后面跟着delete一个。


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

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

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

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

于 2010-04-24T21:56:33.163 回答