【发布时间】:2010-01-18 02:37:33
【问题描述】:
以下是其他人编写的 PHP 数据库类的一部分,我已经删除了大约 80% 的代码,所有与我的问题无关的代码都已删除,只剩下允许我测试这个类的数量,而无需实际上击中了一个真实的数据库。
这个类有几个方法可以让你设置一个键和值,然后使用数组将它变成一个 mysql UPDATE 和 INSERT sql 查询。我试图弄清楚如何 100% 使用此代码,以便我可以在我自己的应用程序中使用它的此功能进行更新和插入。
基本上从我收集到的你做这样的事情......
// 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。
下面代码中的public函数reset()在什么地方需要用到,还是不需要?
<?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');
?>
【问题讨论】:
-
在很多人继续争论这个问题的“意义”之前,你可能想现在就接受一个答案,哈哈。
-
我的代表正好是 7,777。至少低了 1,111。
-
由于
function reset()修改了$this->fields,所以可以不带参数调用,只需$this->reset()即可。但是,您上面的数据库抽象缺乏价值卫生并且容易受到 sql 注入的影响。请参阅下面关于使用 AdoDB 库以获得更好的安全性和安心的建议:)