有没有人有或可以指出使用php-pdo创建sqlite内存表的好例子,其中表列格式直接从pdo查询结果中收集?
我的用例是,我想使用SQLite3来存储从多个不同数据库返回的多个查询(都是相同的列顺序等)的多个结果集。最终目标是使用SQLite来"减少"要完成的数据。
我知道我可以为每个查询结果编写一个自定义函数,但我的目标是实现一个通用的解决方案,不需要知道表结构,传递x个同质结果集(例如PDO::FETCH_ASSOC数组结果),并返回一个临时SQLite表名,以便能够在丢弃数据之前使用SQLite查询结果集的UNION。
这似乎会在互联网上的某个地方发布,SQLite网站甚至暗示这是一个用例,但我所有的搜索都指向SQLite关于创建和查询的基本说明。。。提前感谢!
由于没有人回复,这是一个粗略的努力。这是基于数据库句柄是mySQL,但也可以忽略类型,让sqlite发挥一些作用。如果是,请参阅此链接:
https://www.sqlite.org/datatype3.html
try{
$link = connectToDB_PDO();
$strSQL="select * from website.customers";
$mySth=$link->prepare($strSQL);
$meta=array();
$mySth->execute();
foreach(range(0, $mySth->columnCount() - 1) as $column_index){
$meta[] = $mySth->getColumnMeta($column_index);
}
$result=$mySth->fetchAll(PDO::FETCH_ASSOC);
// Create new database in memory
$memdb = new PDO('sqlite::memory:');
$memdb->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // Set errormode to exceptions
$tablename='mytable';
$colnames=array(); // for the insert statement below
$tableSQL="CREATE TABLE $tablename ( ";
foreach($meta as $col){
$colnames[]=$col['name'];
$tableSQL.=" ".$col['name']. " ".$col['native_type']." ";
if(array_key_exists('flags',$col)){
foreach($col['flags'] as $flag){
switch($flag)
{
case 'not_null':
$tableSQL.=" NOT NULL ";
break;
case 'primary_key':
$tableSQL.=" PRIMARY KEY ";
break;
default:
} // end switch
} // end each flag
} // end if flags
$tableSQL.=", ";
} // end each column
$tableSQL=rtrim($tableSQL,", ");
$tableSQL.=")";
$memdb->exec($tableSQL);
$pragmaSQL="PRAGMA table_info($tablename)";
$st2=$memdb->prepare($pragmaSQL);
$st2->execute();
$pragres=$st2->fetchAll(PDO::FETCH_ASSOC);
$insert = "INSERT INTO $tablename (".implode(",",$colnames).") ".
"VALUES (:".implode(",:",$colnames).")";
$stmt = $memdb->prepare($insert);
foreach ($result as $row) {
$parms=array();
for($i=0;$i<count($colnames);$i++){
$parms[':'.$colnames[$i]]=$row[$colnames[$i]]; // Bind parameters to statement variables
}
$stmt->execute($parms);
}
$strSQL="SELECT sum(customers_id) FROM $tablename";
$sth=$memdb->prepare($strSQL);
$sth->execute();
$result2=$sth->fetchAll(PDO::FETCH_ASSOC);
foreach ($result2 as $m) {
echo print_r($m,true);
}
$memdb->exec("DROP TABLE $tablename");
$memdb = null;
}catch(PDOException$e){echo$e->getMessage();error_log($e->getMessage());}我不确定这是否是最好的答案,但这是一个开始——急于看到别人的意见!