Bu nasıl PHP kullanmak için hangi dizi anahtarı / değerlerini biliyor?

4 Cevap php

Aşağıda yazdığı başka bir PHP veritabanı sınıfı birinin parçası olan, benim sorunun tüm un ilgili kod kaldırıldı ben bu kod yaklaşık% 80 kaldırdık ve sadece tutarı, bana aslında bir vurmadan bu sınıf test sağlar kalır gerçek bir veritabanı.

Bu sınıf, bunu daha sonra bir mysql UPDATE haline dönüşür ve bir dizi kullanarak sql sorgusu INSERT bir anahtar ve değer ayarlamak izin bir kaç yöntem vardır. Ben GÜNCELLEME ve kendi uygulama INSERTS için bu özelliğini kullanabilmek için bu kodu 100% nasıl kullanılacağını anlamaya çalışıyorum.

Temelde anladığım kadarıyla böyle bir şey yapmak ...

// assign some key/values to insert into DB
$db->assign('name', 'dfgd');
$db->assign('age', 87);
$db->assign('sex', 'female');
$db->assign('user_id', 4556);

// Do  the insert
$db->insert('testing2');

Kafam karıştı şimdi nerede ben sayfasında ve üzerinde bu gibi bir kod çalıştıran tutmak ve her zaman anahtar / değer dizi setlerinin doğru kümesi kullanmak olacaktır. Gördüğünüz yukarıda ben ata () yöntemi 4 kez kullanılan ve daha sonra bu oluşturur insert () yöntemini çağırın

INSERT INTO test (name, age, sex, user_id) VALUES (jason davis, 26, male, 5345)

Şimdi aynı sayfada bu gibi başka bir set çalıştırırsanız ...

// assign some key/values to insert into DB
$db->assign('name', 'dfgd');
$db->assign('age', 87);
$db->assign('sex', 'female');
$db->assign('user_id', 4556);

// Do  the insert
$db->insert('testing2');

Daha sonra bu oluşturur ...

INSERT INTO testing2 (name, age, sex, user_id) VALUES (dfgd, 87, female, 4556)

Peki nasıl 4 2 kümelerini birleştirmek değil, bunun yerine ikinci ekleme 8 kayıt ekleme, bu completey yeni bir dizi ile 4 değerleri ilk seti değiştirir. Bu harika ve ne istiyorum ama nasıl oluyor anlamıyorum? Ayrıca bu zaten geliştirilebilir?

Aşağıda tam bir sınıf ve benim demo kod, bu demo için mysql bağlanmak gerek kalmadan koştu olabilir, o oluşturur SQL ekrana basacaktır.

Ayrıca burada public function reset() kodu altında kullanılacak olması gerekir, ya da ihtiyaç olmaz?

<?php 
class DB{
    public $fields;

    public function assign($field, $value){
        $this->fields[$field] = ($value)==""?("'".$value."'"):$value;
    }

    public function assign_str($field, $value){
        $this->fields[$field] = "'".addslashes($value)."'";
    }

    public function reset(){
        $this->fields = array();
    }

    public function insert($table){
        $f = "";
        $v = "";
        reset($this->fields);
        foreach($this->fields as $field=>$value){
            $f.= ($f!=""?", ":"").$field;
            $v.= ($v!=""?", ":"").$value;
        }
        $sql = "INSERT INTO ".$table." (".$f.") VALUES (".$v.")";
        //print SQL to screen for testing
        echo $sql;
        //$this->query($sql);
        return $this->insert_id();
    }

    public function update($table, $where){
        $f = "";
        reset($this->fields);
        foreach($this->fields as $field=>$value){
            $f.= ($f!=""?", ":"").$field." = ".$value;
        }
        $sql = "UPDATE ".$table." SET ".$f." ".$where;
        echo $sql;
        //$this->query($sql);
    }

    public function query($_query){
        $this->query = $_query;
        $this->result = @mysql_query($_query, $this->link_id) or die( $_query."<p>".mysql_error($this->link_id) );
        return $this->result;
    }

    public function insert_id(){
        return @mysql_insert_id($this->link_id);
    }
}


// start new DB object
$db = new DB;

// assign some key/values to insert into DB
$db->assign('name', 'jason davis');
$db->assign('age', 26);
$db->assign('sex', 'male');
$db->assign('user_id', 5345);

// Do  the insert
$db->insert('test');


echo '<hr />';

// assign some key/values to insert into DB
$db->assign('name', 'dfgd');
$db->assign('age', 87);
$db->assign('sex', 'female');
$db->assign('user_id', 4556);

// Do  the insert
$db->insert('testing2');


echo '<hr />';

// assign some key/values to UPDATE the DB
$db->assign('name', 'jason davis');
$db->assign('age', 26);
$db->assign('sex', 'male');
$db->assign('user_id', 5345);

// DO the DB UPDATE
$db->update('blogs', 'WHERE user_id = 23');

?>

4 Cevap

insert() ve update() (başlangıçta) geriye yürütme üzerine boş bir diziye $this->fields özelliğini ayarlamanız gerekir, ama bir şekilde (yanlış) bu kodu silindi?

Update your code to this:

    public function insert($table){
        $f = "";
        $v = "";
        foreach($this->fields as $field=>$value){
            $f.= ($f!=""?", ":"").$field;
            $v.= ($v!=""?", ":"").$value;
        }
        $sql = "INSERT INTO ".$table." (".$f.") VALUES (".$v.")";
        $this->reset();
        //print SQL to screen for testing
        echo $sql;
        //$this->query($sql);
        return $this->insert_id();
    }

    public function update($table, $where){
        $f = "";
        foreach($this->fields as $field=>$value){
            $f.= ($f!=""?", ":"").$field." = ".$value;
        }
        $sql = "UPDATE ".$table." SET ".$f." ".$where;
        $this->reset();
        echo $sql;
        //$this->query($sql);
    }

Hala başka bir veritabanı abstaction kütüphane için açarsanız, ben kullanmak önermek istiyorum AdoDB. Birden fazla veritabanına bağlanmak, bu yüzden daha sonra veritabanı geçiş için karar eğer kod aynı kalacak. Bu ekleme / güncelleştirme önce verileri sterilize özelliği yapı var.

Eğer ADODB kullandığınızda yukarıdaki kod için, bu gibi yazmak olacak:

$adodb =& ADONewConnection($dsn);
$data['name'] = 'dfgd';
$data['age'] = 87;
$data['sex'] = 'female';
$data['user_id'] = 4556;

// Do  the insert
$result = $adodb->AutoExecute($table_name, $data, 'INSERT');

//If update, must have one of the key, such as id column
$result = $adodb->AutoExecute($table_name, $data, 'UPDATE', "id=$id");

Sen siteden belgelere veya indirebilirsiniz içine zip dosyasını okuyabilirsiniz. Ben her zaman bile ben daha CodeIgniter veritabanı kütüphanede inşa o tercih, her projemde bu kütüphaneyi kullanın.

Ilişkisel diziler anahtar benzersiz; Yeni bir değer atayarak eski siler.

Tamam, benim önceki cevabı doğru sonuca gelmiş:


Eğer isim tuşlarını kullanın, çünkü yeni tuşları ile eski anahtarları değiştirir.

$db->assign('user_id', "1");

temelde bu yapar:

$this->fields['user_id] = (1)==""?("'1'"):1;

Bunu tekrar geldiğimde, onu değiştirir

$this->fields['user_id'] = (2)==""?("'2'"):2;

Bir ata yapmaya çalışın ve sonra sadece tekrar user_id atamak, verilerin orada kalanı aynı kalacak.


Bu sorunu gidermek için, biz bir sorgudan sonra $this->reset() işlevini çağırır.

public function query($_query){
        $this->query = $_query;
        $this->result = @mysql_query($_query, $this->link_id) or die( $_query."<p>".mysql_error($this->link_id) );
        $this->reset();
        return $this->result;
    }

ya tek insert veya update fonksiyonlarında diyebiliriz:

public function insert($table){
    // .... stuff
    $this->query($sql);
    $this->reset();
    return $this->insert_id();
}

Diğer olasılık orijinal programcı yeterince sizin için onun niyetini değil iletmek olduğunu. O her sorgudan sonra $db->reset() aramak için bekliyor olabilir.