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