Php 如何使用Zend_Db添加多行?
我有一个包含信息的数组,大致如下所示:Php 如何使用Zend_Db添加多行?,php,mysql,zend-framework,zend-db,zend-db-table,Php,Mysql,Zend Framework,Zend Db,Zend Db Table,我有一个包含信息的数组,大致如下所示: $data[] = array('content'=>'asd'); $data[] = array('content'=>'asdf'); $insert = $this->getSql()->insert(); foreach ($values as $value) { $relation = array( 'column_one' => $value, 'column_two'
$data[] = array('content'=>'asd');
$data[] = array('content'=>'asdf');
$insert = $this->getSql()->insert();
foreach ($values as $value) {
$relation = array(
'column_one' => $value,
'column_two' => $value
);
$insert->values($relation, Insert::VALUES_MERGE);
}
$insertRes = $this->executeInsert($insert);
我想将这两个条目都添加到数据库中
$db->insert('table', $data);
不会同时添加两个条目。我做错了什么?我必须使用Zend_uDB_表吗
$data = array('content'=>'asdf');
$db->insert('table', $data);
当然可以我认为Zend_Db不支持插入多行 但是如果你只有两行或更多行,你可以使用一个循环
foreach ($data as $row)
{
$db->insert('table', $row)
}
前Zend Framework开发人员写道: 行集基本上是一个集合对象,因此我将向该类添加方法以允许将行添加到集合中。因此,您应该能够做到这一点:
// creates a rowset collection with zero rows
$rowset = $table->createRowset();
// creates one row with unset values
$row = $table->createRow();
// adds one row to the rowset
$rowset->addRow($row);
// iterates over the set of rows, calling save() on each row
$rowset->save();
将整数传递给createRowset()以创建N个空行是没有意义的。无论如何,您只需遍历它们,就可以用值填充它们。因此,您不妨编写一个循环,用应用程序数据创建并填充各行,然后将它们添加到集合中
$rowset = $table->createRowset();
foreach ($appData as $tuple)
{
$row = $table->createRow($tuple);
$rowset->addRow($row);
}
$rowset->save();
允许将数组数组传递给createRowset()是有意义的,因为这与将元组传递给createRow()的用法是一致的
这将执行与上一个示例相同的循环(除了最后的save()),创建一个新行的新行集,准备保存()d
SQL中有两种方法可以提高插入数据的效率:
INSERT INTO t (col1, col2, col3) VALUES (1, 2, 3), (4, 5, 6), (7, 8, 9);
SELECT LAST_INSERT_ID(); -- returns only the id for the third tuple
如果您确实需要每一行的id,那么应该编写一个循环并一次插入一行,在插入每一行后检索生成的id。您可以通过
Zend\u Db\u Adapter\u Abstract::query()
方法执行任何想要的SQL语法,包括多行insert
语句
但是
Zend_Db_Table
和Zend_Db_Table_Rowset
类的方法不支持一次插入多行。要插入多行,可以使用Zend_Db
$stmt = $table->getAdapter()->prepare('INSERT INTO tablename (col1, col2, col3) VALUES (?, ?, ?), (?, ?, ?)');
$stmt->execute( array($value1, $value2, $value3, $value4, $value5, $value6) );
(来自比尔·卡温)
在您的情况下,我们可以将其更改为以下代码:
$data[] = array('content'=>'asd');
$data[] = array('content'=>'asdf');
$stmt = $table->getAdapter()->prepare('INSERT INTO table (col1) VALUES (?), (?)');
$stmt->execute( $data );
要动态生成这些“(?),(?)”,如果数据是动态的,可以尝试使用以下代码段:
$values = implode(',',array_fill(0,count($data),'(?)'));
希望这有帮助
问候,,
Riki Risnandar如果您确实使用ZF2,则解决方案可能如下所示:
$data[] = array('content'=>'asd');
$data[] = array('content'=>'asdf');
$insert = $this->getSql()->insert();
foreach ($values as $value) {
$relation = array(
'column_one' => $value,
'column_two' => $value
);
$insert->values($relation, Insert::VALUES_MERGE);
}
$insertRes = $this->executeInsert($insert);
这是工作
$query = 'INSERT INTO ' . $db->quoteIdentifier('table') . ' (`col1`, `col2`) VALUES ';
$queryVals = array();
foreach ($data as $row) {
foreach($row as &$col) {
$col = $db->quote($col);
}
$queryVals[] = '(' . implode(',', $row) . ')';
}
$stmt = $db->query($query . implode(',', $queryVals));
以下是我的解决方案:
public function saveRows($array) {
$vAmount = count($array);
$values = array();
$columns = array();
foreach ($array as $colval) {
foreach ($colval as $column=>$value) {
array_push($values,$value);
!in_array($column,$columns) ? array_push($columns,$column) : null;
}
}
$cAmount = count($columns);
$values = array_chunk($values, $cAmount);
$iValues = '';
$iColumns = implode("`, `", $columns);
for($i=0; $i<$vAmount;$i++)
$iValues.="('".implode("', '", $values[$i])."')".(($i+1)!=$vAmount ? ',' : null);
$data="INSERT INTO `".$this->_name."` (`".$iColumns."`) VALUES ".$iValues;
die($data);
$this->query($data);
}
public函数存储行($array){
$vAmount=计数($array);
$values=array();
$columns=array();
foreach($colval形式的数组){
foreach($colval作为$column=>$value){
数组\u push($value,$value);
!在数组中($column,$columns)?数组推送($columns,$column):空;
}
}
$cAmount=计数($columns);
$values=array\u chunk($values,$cAmount);
$iValues='';
$iColumns=内爆(“`,`,$columns”);
对于($i=0;$i_name.“`(`.$iColumns.“`)值,“$iValues;
死亡(数据);
$this->query($data);
}
这不是真的:$sql=“插入美丽的(姓名、年龄)值('Helen',24),('Katrina',21)”;有效(只是一个例子)你是对的。我仍然不认为zf支持它,手册中也没有任何提示。但我不确定。我不认为这有效吗?我有$list=array();$list[]=array(':x'=>1',:y'=>1);$stmt=$this->table->getAdapter()->prepare($x,y)值(:x,:y),(:x,:y);$stmt->execute($list);它说:“无效的参数编号:绑定变量的数量与令牌的数量不匹配”。如果我不使用MD数组,那么就可以了……我认为execute不应该使用MD数组?这对我不起作用,我得到的错误是占位符太多。试图插入50000行。@Elzo Valugi,没有任何insertMultiple()
方法在手册和框架中“is”是存在的,“will”是(可能的/可能的)未来。也许我应该使用“will”。只是为了澄清:)Zend 2.0()中的多插入功能请求已作为wontfix关闭。您真的应该转义查询参数