有没有人能够或者能够指出使用php pdo创建sqlite内存表的好例子,其中表列格式直接从PDO查询结果中收集?
我的用例是,我希望使用SQLite3来存储从多个不同数据库返回的多个查询(所有相同的列顺序等)中的多个结果集。最终目标是使用SQLite来减少"减少"最终确定的数据。
我知道我可以为每个查询结果编写一个自定义函数,但我的目标是实现一个通用解决方案,不需要知道表结构,传递x同源结果集(例如PDO :: FETCH_ASSOC数组结果)并返回一个临时的SQLite表名,能够在丢弃数据之前使用SQLite查询结果集的UNION。
似乎这会出现在互联网上,而SQLite网站甚至暗示这是一个用例,但我所有的搜索都指向基本的SQLite如何创建和查询...提前感谢!
答案 0 :(得分:0)
由于没有人回复,这是一个艰难的努力。这是基于db句柄是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-&gt; getMessage(); error_log中($ E-&GT;的getMessage()); } 我不确定这是不是最好的答案,但它是一个开始 - 急于看到其他人的输入!