3

MySQLデータベースからいくつかのデータを選択するPHPサーバースクリプトがあります。

mysql_queryとmysql_fetch_assocの結果を自分のローカル変数に保存したらすぐに、選択した行を削除したいと思います。

このアプローチの問題は、PHPが値渡しではなくローカル変数への参照渡しを行っているように見え、deleteコマンドの後でローカル変数が未定義になることです。

これを回避する方法はありますか?これが私のコードです:

    $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

$result2番目のステートメントで変数を上書きしています。

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

そうすれば、2番目のステートメントの変数名を変更する必要さえありません。ただし、意味のある変数名を使用することを検討してください。

于 2010-04-24T21:55:42.837 に答える
1

まず、delete関心のある行に対して1つのクエリだけを使用しないのはなぜですか?

このような何かがトリックを行う必要があります、私は推測します:

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

もちろん、あるべき値をエスケープ/変換することを忘れないでください;-)

このように、selectクエリの後にクエリを実行する必要はありませんdelete


2番目:コードを読みやすく、理解しやすく、保守しやすくするために、同じ変数をいくつかの異なる目的で再利用しないでください。

ここで、$result変数は複数の目的で使用されているため、理解が難しくなります。

  • 最初に返されたリソースmysql_query
  • 次に、最初の行のデータを含む配列
  • 次に、2番目に返されたリソースmysql_query

少し紛らわしく、いつの日かエラーが発生します...
実際にはすでにあります;-):3番目の割り当ては、2番目の割り当てで取得したデータをオーバーライドします。削除した行に対応する情報が失われました;-)

于 2010-04-24T21:56:33.163 に答える