这个PHP如何知道要使用哪个数组键/值?

时间:2010-01-18 02:37:33

标签: php class arrays

下面是其他人写的PHP数据库类的一部分,我已经删除了大约80%的代码,我的问题的所有不相关的代码都被删除了,只剩下允许我测试这个类的数量实际上打一个真正的数据库。

这个类有几个方法可以让你设置一个键并对其进行赋值,然后使用数组将其转换为mysql UPDATE和INSERT sql查询。我试图弄清楚如何100%使用这个代码,所以我可以在我自己的应用程序中使用它的UPDATE和INSERTS的这个功能。

基本上从我收集的内容中你做了类似的事情......

// 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');

现在我感到困惑的是,我可以继续在页面上反复运行这样的代码,它总是使用正确的键/值数组集。上面你可以看到我使用了assign()方法4次,然后调用insert()方法创建了这个

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

现在如果我在同一页面上运行这样的另一套......

// 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');

然后创建这个......

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

那么它如何不组合2组4,所以它不是在第二个插入上插入8个记录,而是用新集合替换第一组4个值。这很棒,我想要但我不明白它是怎么回事?这还可以改进吗?

下面是一个完整的类和我的演示代码,它可以运行而无需连接到mysql进行此演示,它将打印以筛选它构建的SQL。

下面的代码中的公共功能重置()需要在哪里使用,或者不需要?

<?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 个答案:

答案 0 :(得分:2)

关联数组中的键是唯一的;分配新值会删除旧值。

答案 1 :(得分:2)

如果您仍然打开另一个数据库抽象库,我建议您使用AdoDB。它可以连接到多个数据库,因此如果您决定稍后切换数据库,则代码将保持不变。它具有内置功能,可以在插入/更新之前清理数据。

对于上面的代码,当您使用AdoDB时,您将这样写:

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

您可以从网站或您可以下载的zip文件中阅读文档。我总是在我的所有项目中使用这个库,甚至我更喜欢在CodeIgniter数据库库中构建它。

答案 2 :(得分:0)

好的,我们得出的结论是我之前的答案是正确的:


因为您使用名称密钥,它会用新密钥替换旧密钥。

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

基本上这样做:

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

当你再次这样做时,它会取代它

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

尝试进行分配,然后再次分配user_id,其余数据将保持不变。


要解决此问题,我们会在查询后调用$this->reset()函数。

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

或者您可以在单独的insertupdate函数中调用它:

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

另一种可能性是原始程序员没有把你的意图传达给你。他可能希望您在每次查询后拨打$db->reset()

答案 3 :(得分:0)

insert()update()应该(最初)在执行时将$this->fields属性设置回空数组,但是你以某种方式(错误地)删除了该代码?

将您的代码更新为:

    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);
    }