【问题标题】:SQLITE : Check if column exists without trigger an error in phpSQLITE:检查列是否存在而不触发php中的错误
【发布时间】:2014-08-22 02:18:40
【问题描述】:

我的情况是这样的:

  • 我有一个包含表列名称的数组
  • 我必须使用循环遍历数组并检查表中是否存在该字段(此列名)
  • 如果存在,我什么都不做,否则我必须添加

    $array_column = ["column1 NOT NULL","column2 NOT NULL","column3 NOT NULL","column4 NOT NULL"];
    
    for($j = 0 ; $j < count($array_column) ; $j++){
    
      $query = "SELECT ".$array_column[$j]." FROM my_table";
      $result = $db->query($query);
    
      $check = false;
      //try{
         foreach ($result as $row) { //error here
            $check = true;
         }
      //}catch (Exception $e) {
        //echo "here";
        //$check = false;
      //}
    
      if(!$check){
        echo "column [".$array_column[$j]."] to add <br>";
      } 
    
    }
    

但是当我发现表中不存在的列时,php给我错误

Warning: Invalid argument supplied for foreach ()

我也尝试了 TryCatch,但同样的错误。 我希望 php 在找不到列时不会返回该错误

更新 1:

我试试这个,它可以工作,但不幸的是当表中没有记录时就不行了

$select = $db->query('SELECT * FROM mytable');

$total_column = $select->columnCount();
var_dump($total_column);

for ($counter = 0; $counter <= $total_column; $counter ++) {
      $meta = $select->getColumnMeta($counter);
      $column[] = $meta['name'];
}
print_r($column);

更新 2:即使表中没有记录,此解决方案也能完美运行!

$result = $db->query("PRAGMA table_info(test2)");
$result->setFetchMode(PDO::FETCH_ASSOC);
$meta = array();
foreach ($result as $row) {
   array_push($meta, $row['name']);
}

【问题讨论】:

标签: php sqlite pdo


【解决方案1】:

PRAGMA table_info('table_name') 将返回一个行列表(表中的每一列一个) 不幸的是,您不能在选择查询中使用它,但您可以解析它并尝试在查询表之前查找您的列名。 希望对你有帮助

【讨论】:

    【解决方案2】:

    您可以使用sqlite_fetch_column_types 函数获取包含表列名的数组。然后可以在您的循环中使用该数组。

    【讨论】:

    • $db = new PDO('sqlite:info.sqlite3'); $cols = sqlite_fetch_column_types('telecamere', $db, SQLITE_ASSOC); //致命错误:调用未定义函数sqlite_fetch_column_types()
    • 您使用的是哪个版本的 PHP?如果可能,根据您可能需要的版本install this extension
    猜你喜欢
    • 2013-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多