我正在尝试构建一个类,将值数组插入到oracle数据库中,我还试图使类可扩展(适用于所有形式的应用程序)。
我这样做的原因是为了减少我正在处理的应用程序的代码重复,因为它有很多表单,其中一些表单有很多变量(50+)。。因此,我需要创建一个能够在表中插入值的类,其中值的数量是动态的(取决于形式)。
到目前为止,我所做的是:
class ArrayQuery {
public $conn;
public $table;
public function __construct($conn){
$this->conn = $conn;
}
public function setTableName($table)
{
$this->table = $table;
}
public function InsertArray(array $args){
$keys = array_keys($args);
$values = array_values($args);
// need help here //
}
}
construct函数将通过从db_connection类调用$conn对象来获得数据库连接(例如$conn=new db_connection()$query=new ArrayQuery($conn);)
setTableName显然用于定义所需的表。
- 现在在ArrayQuery中,正如我在表单页面中所做的那样,我将数组的键命名为与表中列的名称相同的名称,例如数组args['id']=$post['id']。所以基本上是array_key=列名。我这样做是为了在不手动设置列名的情况下获得列名
现在我有两个数组:$keys(保存列的名称)和$$values 我不知道如何将变量绑定到键中?知道变量的数量是动态的吗
任何帮助都将不胜感激
更新:
以下是$args数组如何设置
$args = array(
'id' => $_POST['id'],
'firstname' => $_POST['firstname'],
'lastname' => $_POST['lastname'],
'email' => $_POsT['email'],
)
答案:
感谢@calculation让我走上了正确的轨道,在我的场景中只做了一些修改,供未来参考,我的案例的答案是:
$i=0; $col=''; $val='';
foreach ($args as $key => $value) {
if($i==0){
$col .= $key;
$val .= ':'.$key;
}
else{
$col .= ', '.$key;
$val .= ', :'.$key;
}
$i++;
}
$sql = 'INSERT INTO '.$table.' ('.$col.') VALUES ('.$val.') ';
$stmt = oci_parse($this->conn, $sql);
foreach ($args as $key => $value) {
oci_bind_by_name($stmt, $key, $args[$key]) ;
}
oci_execute($stmt);
希望它会有帮助,再次感谢计算。
类似于我在项目中使用的插入列数未知的一行的算法,对于多行,应该再添加一个循环
$i=0; $keys=''; $vals='';
foreach ($args as $key => $value) {
if($i==0){
$keys .= ''.$key;
$vals .= ':'.$key;
}
$keys .= ', '.$key;
$vals .= ', :'.$key;
$i++;
}
$sql = 'INSERT INTO '.$table.' ('.$keys.') VALUES ('.$vals.') ';
$stmt = oci_parse($conn, $sql);
foreach ($args as $key => $value) {
oci_bind_by_name($stmt, $key, $args[$key]) ;
}
oci_execute($stmt);