PHP seçin hemen sonra SİL

2 Cevap php

Ben bir MySQL veritabanı bazı verileri seçer bir PHP sunucu komut dosyası var.

En kısa zamanda ben mysql_query ve kendi yerel değişkenler saklanan Mysql_Fetch_Assoc gelen sonuç olarak, ben sadece seçili satırı silmek istiyorum.

Bu yaklaşımla sorun PHP benim yerel değişkenlere göre referans-pass yerine pass-by-value yapmış ve benim yerel değişkenler delete komutundan sonra tanımsız olmak gibi görünüyor olmasıdır.

Bu etrafında almak için yine de var mı? İşte benim kod:

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

Eğer ikinci deyimi ile $result değişkeni üzerine yazıyorsunuz:

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

Başka bir şey için adını değiştirin. Bu çağrı-referans-ya da bu ile ilgisi yoktur.


$row zaten bir dizidir gibi Aslında, değerlerin ilk atama gereksizdir:

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

Sadece yapabilirsiniz:

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

O zaman bile, ikinci deyimi için değişken adını değiştirmek zorunda değilsiniz. Ama anlamlı değişken adlarını kullanmak için düşünün.

Her şeyden önce, neden sadece sizi ilgilendiren delete satıra yalnızca bir sorgu kullanmak değil mi?

Böyle bir şey hile yapmak gerekir, herhalde:

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

Of course, don't forget to escape/convert the values that should be ;-)

Bu şekilde, bir delete biri tarafından izlenen bir select sorgu için gerek yok.


Second : to make your code more easier to read / understand / maintain, you should probably not re-use the same variable for several different purposes.

Burada, $resul t değişkeni birden fazla şey için kullanılır, ve bunu anlamak için sert şeyler yapar:

  • kaynak ilk mysql_query tarafından döndürülen
  • sonra, ilk satırdan itibaren verileri içeren dizi
  • Daha sonra, kaynak ikinci mysql_query tarafından döndürülen

It's a bit confusing, and will, one day or another, lead to errors...
Actually, it already has ;-) : the third assignment is overriding the data you're getting with the second ones, and boom, you've lost the information that corresponds to the row you've just deleted ;-)