Я знаю, что это должно звучать глупо ... но редко бывает.
Проверьте, пытаетесь ли вы выполнить php из
**http://localhost/info.php**
, а не из
file:///var/www/info.php
ps> вы можете заметить, что если вы пишете из shell
php info.php
, то ответьте на код (это означает php-функции) ..
Используя ответ @ Tarkus, вот регулярные выражения, которые я использовал в R:
getColNames <- function(conn, tableName) {
x <- dbGetQuery( conn, paste0("SELECT sql FROM sqlite_master WHERE tbl_name = '",tableName,"' AND type = 'table'") )[1,1]
x <- str_split(x,"\\n")[[1]][-1]
x <- sub("[()]","",x)
res <- gsub( '"',"",str_extract( x[1], '".+"' ) )
x <- x[-1]
x <- x[-length(x)]
res <- c( res, gsub( "\\t", "", str_extract( x, "\\t[0-9a-zA-Z_]+" ) ) )
res
}
Код несколько неаккуратный, но он работает.
Попробуйте этот синтаксический анализатор таблицы sqlite, я внедрил парсер sqlite table для анализа определений таблиц в PHP.
Он возвращает полные определения (уникальный, первичный ключ, тип, точность, а не нуль, ссылки , ограничения таблицы ... и т. д.)
Это помогает для HTML5 SQLite:
tx.executeSql('SELECT name, sql FROM sqlite_master WHERE type="table" AND name = "your_table_name";', [], function (tx, results) {
var columnParts = results.rows.item(0).sql.replace(/^[^\(]+\(([^\)]+)\)/g, '$1').split(','); ///// RegEx
var columnNames = [];
for(i in columnParts) {
if(typeof columnParts[i] === 'string')
columnNames.push(columnParts[i].split(" ")[0]);
}
console.log(columnNames);
///// Your code which uses the columnNames;
});
Вы можете повторно использовать регулярное выражение на своем языке, чтобы получить имена столбцов.
Более короткая альтернатива:
tx.executeSql('SELECT name, sql FROM sqlite_master WHERE type="table" AND name = "your_table_name";', [], function (tx, results) {
var columnNames = results.rows.item(0).sql.replace(/^[^\(]+\(([^\)]+)\)/g, '$1').replace(/ [^,]+/g, '').split(',');
console.log(columnNames);
///// Your code which uses the columnNames;
});
sql
таблицы SQLITE_MASTER нет лишних пробелов или других пробелов. поскольку это поле содержит буквенный текст запроса, используемый для создания таблицы, это не всегда так. Я также думаю, что он неправильно обрабатывает имена полей, содержащие пробелы.
– Michael
26 April 2016 в 19:15
Если вы используете оболочку командной строки для SQLite, тогда .headers on
перед выполнением запроса. Вам нужно сделать это только один раз в данном сеансе.
.mode column
и .headers on
для тех, кто хочет получить типичный формат вывода SELECT, который они используют для просмотра с другими оболочками SQL.
– Lèse majesté
16 September 2016 в 15:56
SELECT sql FROM sqlite_master
WHERE tbl_name = 'table_name' AND type = 'table'
Затем проанализируйте это значение с помощью Reg Exp (это легко), который может выглядеть примерно так: [(.*?)]
В качестве альтернативы вы можете использовать:
PRAGMA table_info(table_name)
Then parse this value with Reg Exp (it's easy)...
действительно расплывчато, полный пример запроса с регулярным выражением для получения столбцов defs проделал бы долгий путь здесь.
– ChrisProsser
3 July 2017 в 09:46
"([^"]+)" (?!\()
похоже работает.
– Timothé Malahieude
26 August 2017 в 13:14
Результирующий набор запроса в PHP предлагает пару функций, позволяющих именно это:
numCols()
columnName(int $column_number )
Пример
$db = new SQLIte3('mysqlite.db');
$table = 'mytable';
$tableCol = getColName($db, $table);
for ($i=0; $i<count($tableCol); $i++){
echo "Column $i = ".$tableCol[$i]."\n";
}
function getColName($db, $table){
$qry = "SELECT * FROM $table LIMIT 1";
$result = $db->query($qry);
$nCols = $result->numCols();
for ($i = 0; $i < $ncols; $i++) {
$colName[$i] = $result->columnName($i);
}
return $colName;
}
$<?
$db = sqlite_open('mysqlitedb');
$cols = sqlite_fetch_column_types('form name'$db, SQLITE_ASSOC);
foreach ($cols as $column => $type) {
echo "Column: $column Type: $type\n";
}