Diziler veya nesneler olmaktan PHP değişkenleri nasıl önlenir?

2 Cevap php

I think olduğunu (başlık) yaşıyorum sorundur. Ben MySQL bağlantı kurmak, ben bir XML dosyasını okuyun ve sonra elemanları döngü ile bir tabloya bu değerleri yerleştirin. Sorun bazen 2 veya 3 veya 4 eklemek yerine sadece 1 kayıt ekleme, olduğunu. Ben okudum önceki değerlerine bağlı görünüyor. Ben değişkenleri reinitializing olduğumu düşünüyorum, ama ben bir şey eksik sanırım - umarım basit bir şey.

İşte benim kodudur. Ben başlangıçta yaklaşık 20 sütun vardı, ama ben daha kolay okunmasını sağlamak için dahil sürümünü kısaltılmış.

$ctr = 0;
$sql =  "insert into csd (id,type,nickname,hostname,username,password) ".
        "values (?,?,?,?,?,?)";
$cur = $db->prepare($sql);

for ($ctr = 0; $ctr < $expected_count; $ctr++) {
    unset($bind_vars,$dat);

    $lbl = "csd_{$ctr}";

    $dat['type']      = (string) $ref->itm->csds->$lbl->type;
    $dat['nickname']  = (string) $ref->itm->csds->$lbl->nickname;
    $dat['hostname']  = (string) $ref->itm->csds->$lbl->hostname;
    $dat['username']  = (string) $ref->itm->csds->$lbl->username;
    $dat['password']  = (string) $ref->itm->csds->$lbl->password;

    $bind_vars = array( $id,$dat['$type'], $dat['$nickname'], $dat['$hostname'], 
                        $dat['$username'], $dat['$password']);
    print_r ($bind_vars);
    $res = $db->execute($cur, $bind_vars);
}

P.S. O Yukarıdaki kodu dahil değildir gerçi, dosyayı okuyorum nasıl, çünkü ben de bu SimpleXML etiketledi. Bu şuna benzer:

$ref = simplexml_load_file($file);

UPDATE: Önerilere göre etrafında kodunu değiştirdim ve şimdi hep aynı model değil, ama aynı derecede bozuldu. Ben takmadan önce bağlama dizisi görüntülemek zaman, bu gibi görünüyor. Ben de önce ve sonra satırları saymak, bu yüzden 0 satır sonra ben 1 eklemek olduğunu unutmayın, daha sonra 2 vardır:

0 CSDs on that ITEM now.
Array
(
    [0] => 2
    [1] => 0
    [2] =>
    [3] => X
    [4] => XYZ
    [5] =>
    [6] =>
    [7] =>
    [8] => audio
    [9] =>
    [10] => 192.168.0.50
    [11] => 192.168.0.3
    [12] => 255.255.255.0
    [13] => 255.255.255.0
    [14] =>
    [15] =>
    [16] =>
    [17] => 21
    [18] => 5
    [19] => Y
    [20] => /dir
)
2 CSDs on that ITEM now.

2 Cevap

kesin cevabı kesin ama bu belki yardımcı değil

$ctr = 0;
$sql =  "insert into csd (id,type,nickname,hostname,username,password) ".
        "values (?,?,?,?,?,?)";
$cur = $db->prepare($sql);

for ($ctr = 0; $ctr < $expected_count; $ctr++) {

    //list (  $lbl, $type, $nickname, $hostname, $username, $password) = "";
    //$bind_vars = array();
    // use unset
    unset($bind_vars,$dat);

    $lbl = "csd_{$ctr}";

    $dat['type']      = $ref->itm->csds->$lbl->type;
    $dat['nickname']  = $ref->itm->csds->$lbl->nickname;
    $dat['hostname']  = $ref->itm->csds->$lbl->hostname;
    $dat['username']  = $ref->itm->csds->$lbl->username;
    $dat['password']  = $ref->itm->csds->$lbl->password;

    $bind_vars = array($id,$dat['$type'],$dat['$nickname'],$dat['$hostname'],$dat['$username'],$dat['$password']);
    $res = $db->execute($cur, $bind_vars);

    # this is a separate function which works, but which only 
    # does SELECTS and cannot be the problem.  I include it because I 
    # want to count the total rows.

    printf ("%d CSDs on that ITEM now.\n",  CountCSDs($id_to_sync));
}

ya da belki doğru sayısını belirlemek için ilk / eko $expected_count değerini kontrol etmelisiniz

Script cron tarafından yürütülüyor ki çıkıyor, ama bir başkası başka bir cron işi ile benim komut koşuyordu, ve bu nedenle bazen iki kez olarak birçok kayıtları oluşturma, ve bazen değildi. Ve daha ben ona baktım, ve daha bunu gidermek için kod oluşturulan, yavaş o var, bu yüzden kötüsü var.

Ben ona bakmadı, diğer bir deyişle, ben ona bakmak yaptığımız zaman daha iyi çalıştı.

Lanetlemek tüm bu insanlar bana yardım etmeye çalışıyor!