下面是其他人写的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');
?>
答案 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;
}
或者您可以在单独的insert
或update
函数中调用它:
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);
}