Php 从字符串中提取数据的最有效方法
我需要找出sqlite数据库的主键 给定如下字符串:Php 从字符串中提取数据的最有效方法,php,string,Php,String,我需要找出sqlite数据库的主键 给定如下字符串: CREATE TABLE cia (name PRIMARY KEY, population INTEGER) 或: 获取主键数组最有效的方法是使用php吗?类似这样的方法可以做到: <?php $db = new SQLiteDatabase('dbfilename')) $q = @$db->query('SHOW KEYS FROM cia WHERE Key_name = "PRIMARY"'); $result =
CREATE TABLE cia (name PRIMARY KEY, population INTEGER)
或:
获取主键数组最有效的方法是使用php吗?类似这样的方法可以做到:
<?php
$db = new SQLiteDatabase('dbfilename'))
$q = @$db->query('SHOW KEYS FROM cia WHERE Key_name = "PRIMARY"');
$result = $q->fetch();
var_dump(sqlite_fetch_array($result, SQLITE_BOTH))
?>
更新:如果不支持显示键,则可以通过选择状态和一些工作来获取信息。下面是一个PHP函数,用于提供您可能需要的所有表索引信息:
/**
* return the list of field in $table
* @param string $table name of the sql table to work on
* @param bool $extended_info if true will return the result of a show field query in a query_to_array fashion
* (indexed by fieldname instead of int if false)
* @return array
*/
function list_table_fields($table,$extended_info=FALSE){
# Try the simple method
if( (! $extended_info) && $res = $this->query_to_array("SELECT * FROM $table LIMIT 0,1")){
return array_keys($res[0]);
}else{ # There 's no row in this table so we try an alternate method or we want extended infos
if(! $fields = $this->query_to_array("SELECT sql FROM sqlite_master WHERE type='table' AND name ='$table'") )
return FALSE;
# get fields from the create query
$flds_str = $fields[0]['sql'];
$flds_str = substr($flds_str,strpos($flds_str,'('));
$type = "((?:[a-z]+)\s*(?:\(\s*\d+\s*(?:,\s*\d+\s*)?\))?)?\s*";
$default = '(?:DEFAULT\s+((["\']).*?(?<!\\\\)\\4|[^\s,]+))?\s*';
if( preg_match_all('/(\w+)\s+'.$type.$default.'[^,]*(,|\))/i',$flds_str,$m,PREG_SET_ORDER) ){
$key = "PRIMARY|UNIQUE|CHECK";
$null = 'NOT\s*NULL';
$Extra = 'AUTOINCREMENT';
$default = 'DEFAULT\s+((["\'])(.*?)(?<!\\\\)\\2|\S+)';
foreach($m as $v){
list($field,$name,$type,$default) = $v;
# print_r($field);
if(!$extended_info){
$res[] = $name;
continue;
}
$res[$name] = array('Field'=>$name,'Type'=>$type,'Null'=>'YES','Key'=>'','Default'=>$default,'Extra'=>'');
if( preg_match("!($key)!i",$field,$n))
$res[$name]['Key'] = $n[1];
if( preg_match("!($Extra)!i",$field,$n))
$res[$name]['Extra'] = $n[1];
if( preg_match('!(NO)T\s+NULL!i',$field,$n))
$res[$name]['Null'] = $n[1];
}
return $res;
}
return FALSE;
}
}
我需要找出sqlite数据库的主键。-如果可以使用数据库,则可以避免解析sql字符串: 的结果有一个字段pk,如果该字段是表主键的一部分,则该字段pk设置为1
$pdo = new PDO('sqlite::memory:');
$pdo->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
$pdo->exec('CREATE TABLE cia (name PRIMARY KEY, population INTEGER)');
$pdo->exec('CREATE TABLE casting(movieid INTEGER, actorid INTEGER, PRIMARY KEY (movieid, actorid))');
showPrimary($pdo, 'cia');
showPrimary($pdo, 'casting');
function showPrimary($pdo, $tablename) {
// only an example. I don't care about injections here
echo "primary key for '$tablename'\n";
foreach($pdo->query("PRAGMA TABLE_INFO($tablename)", PDO::FETCH_ASSOC) as $row) {
if ( $row['pk'] ) {
printf(" %s %s PRIMARY\n", $row['name'], $row['type']);
}
}
}
印刷品
primary key for 'cia'
name PRIMARY
primary key for 'casting'
movieid INTEGER PRIMARY
actorid INTEGER PRIMARY
我不知道最有效的方法可能是正则表达式,但如果你可以访问live数据库,最干净的方法是从Casting中进行SHOW KEYS添加到Pekka的注释中:如果你可以访问任何数据库,你可以创建一个临时表,并用SHOW KEYS查询它。所以:替换创建表。。。使用“创建临时表…”。。。至少在MySQL中,执行查询,然后根据Pekka的建议查询表。我相信应该可以。在MySQL上测试了它,正如预期的那样,它确实可以工作。PS:如果你不再使用它,一定要删除该表。耶,问题-正如前面提到的,这是sqlite。。。不显示仅从sqlite_master中选择sql,其中name='tablename';
primary key for 'cia'
name PRIMARY
primary key for 'casting'
movieid INTEGER PRIMARY
actorid INTEGER PRIMARY