使用PDO检查表是否存在

时间:2013-04-23 21:33:55

标签: php mysql pdo

大家好,我们决定开始学习PDO。但是我无法创建一个函数来检查我的数据库中是否存在表。

每个单独的项目都有自己的表格,表格名称为($ id)。

<?php
include_once('config.php');
include_once('simple_html_dom.php');

$html = file_get_html('http://localhost:8888/CDOnline%20Online.html');

foreach($html->find('div.product-stamp-inner') as $content) {   

$detail['itemid'] = $content->find('a',0)->href;
$detail['itemid'] = substr($detail['itemid'], 40, 6);
if (strpos($detail['itemid'], "?") !== false) {
$detail['itemid'] = substr($detail['itemid'], 0, 5);
}
$id = $detail['itemid'];

tableExists($dbh, $id);
}

function tableExists($dbh, $id)
{
//check if table exists
}

$dbh = null;
?>

我试图搜索论坛以寻找答案,但空手而归。让我接近我答案的唯一一件事就是:

function tableExists($dbh, $id)
{
$results = $dbh->query("SHOW TABLE LIKE `$id`");
if(count($results)>0){echo 'table exists';}
}

但是这只是说所有表都存在,当一半的表不存在时。

编辑:如果有1行或更多行,表格应该存在。

6 个答案:

答案 0 :(得分:12)

你正在$id周围使用背叛。将其更改为单引号。像这样:

"SHOW TABLES LIKE '$id'"

进一步注意,声明count($results)>0不起作用。您必须改为使用$results->rowCount()


Fxing这两个错误都会给你以下功能:

function tableExists($dbh, $id)
{
    $results = $dbh->query("SHOW TABLES LIKE '$id'");
    if(!$results) {
        die(print_r($dbh->errorInfo(), TRUE));
    }
    if($results->rowCount()>0){echo 'table exists';}
}

答案 1 :(得分:2)

SHOW TABLES... MySQL 方言,并且会在几乎任何其他数据库引擎下失败。这当然不是便携式表检测的明确答案。

最接近便携式的可能是检查SELECT * FROM $table是否会产生错误, 或类似的方法here

如果您只需要创建一个表,如果它不存在,您可以使用:

CREATE TABLE IF NOT EXISTS $table ($field, ...)

如果您的数据库位于Windows MySQL服务器上,您可能希望将表格命名为 小写 以解决this bug

答案 2 :(得分:1)

如果有人来寻找这个问题,这个帖子很简单。虽然它得到了一点回答。

if ($con->query(
                   "SHOW TABLES LIKE '" . $table . "'"
               )->rowCount() > 0
        or die("No table set")
   ){

有了这个我只是将其他条件推入或。而对于我的需求,我只需要死。虽然你可以设置或其他东西。有些人可能更喜欢if / else if / else。然后删除或然后提供if / else if / else。

或者,如果我要重做该功能:

function tableExists($dbh, $id){

    if ($dbh->query(
                   "SHOW TABLES LIKE '" . $id . "'"
               )->rowCount() > 0
        or die(print_r($dbh->errorInfo(), TRUE))
   ){
    echo 'table exists';
    }

}

没有测试重做,虽然它应该和我之前使用过的代码一样。刚刚起作用。

答案 3 :(得分:0)

这似乎是最简单的方法。您将此函数传递给包含已创建的pdo对象的数组。

$db['pdo']=new PDO('mysqlconnectiongoeshere');
$db['table']='tabletobechecked';

function is_table($db){
   $is_table=$db['pdo']->query("SHOW TABLES LIKE '".$db['table']."'");
   return$is_table->rowCount();
}

这样,如果表存在,这个函数会返回一个&#39; 1&#39;如果它不存在,则此函数返回&#39; 0&#39 ;;

所以你可以像这样使用它:

if(is_table($db)){
  echo"The table".$db['table']." exists.";
}else{
  echo"The table".$db['table']." does not exist.";
}

答案 4 :(得分:-1)

private function doesTableExist($table)
{
    try {
        $this->db->query("DESC $table");
    } catch (Exception $e) {
         return false;
    }
    return true;
}

答案 5 :(得分:-1)

只需使用良好的旧行计数即可。如果表存在,必须有一个结果。

$sql ="SELECT count(*) FROM [table name]";
$sql_result = $this->db_mssql->prepare($sql);
$sql_result->execute();
$sql_result->setFetchMode(PDO::FETCH_ASSOC);
$my_res = $sql_result->fetchAll();
if($my_res){
   echo 'table exists';
}